Я пытаюсь создать какую-то «мошенническую» игру на C ++ с SDL-2. Для этого я следовал руководству Lazy Foo, чтобы понять, как работать с SDL.
Я изучал C ++ / C # в течение 3 лет, но сейчас я изучаю управление проектами и у меня больше нет курсов по ИТ …
Вот GitHub для кода: https://github.com/Paingouin/Roguelike-SDL2-train/tree/master/
Я создал 2 класса: LTexture
чтобы помочь управлять загрузкой и рендерингом картинки и Glyph
управлять анимацией / масштабированием и позиционированием картинки …
Теперь я хотел создать класс Entity, состоящий из Glyph
Объект, который я использовал бы для обозначения Стены, монстра, предмета и т. Д. … но, думаю, если я это сделаю, я буду использовать слишком много памяти …
Может быть, я должен использовать агрегацию, инициализируя массив указателей Glyph и связывая его с объектом моей сущности … Я не знаю, я потерян …
Вы можете мне помочь? И есть ли у вас какие-либо советы или рекомендации, которые помогут мне правильно структурировать?
на самом деле на ваш вопрос можно ответить, не ссылаясь непосредственно на SDL, и такая же проблема может возникнуть с любой библиотекой (например, sfml), и решение практически одинаково:
ответ — шаблон проектирования синглтона
с твоей текстуры почему я говорю синглтон?
давайте поговорим о настенной плитке. у вас может быть тысячи или даже больше настенных плиток
у всех есть так же Текстура, вы действительно хотите загрузить время и время на каждую стену? нет. это та же текстура, вы хотите иметь один экземпляр каждой конкретной текстуры, даже больше: вы можете сэкономить ресурсы, если используете спрайт-лист, содержащий ВСЕ или, скажем, 3 листа: вот пример в sfml, хотя идея должна быть такой же в SDL.
https://en.wikipedia.org/wiki/Singleton_pattern
Вот реализация sfml, но идея должна быть ясной и легко подражать:
class Resources {
sf::Clock m_clock; //holds clock
sf::Texture m_soma,m_lvl,m_enemies; //holds hero,lvl &enemies textures respectively
sf::Font m_font; //holds game font
Resources();
public:
~Resources() {}
Resources(const Resources &) = delete;
Resources& operator=(const Resources &) = delete;static Resources& instance();
sf::Texture& texture();
sf::Texture& lvlTexture();
sf::Texture& Enemies();
sf::Clock& clock();
sf::Font & Font();
};
файл cpp: обратите внимание, я мог бы использовать вектор вместо 3 текстур
Resources::Resources()
{
//loading textures(hero,lvls,enemies)
if (!m_soma.loadFromFile("..\\resources\\sprites\\soma.png"))
{
std::cerr << "problem loading texture\n";
throw ResourceExceptions("couldn't load player sprites!: must have ..\\resources\\sprites\\soma.png");
}
if (!m_lvl.loadFromFile("..\\resources\\sprites\\lv.png"))
{
std::cerr << "problem loading texture\n";
throw ResourceExceptions("couldn't load level sprites!: must have ..\\resources\\sprites\\lv.png");
}
if (!m_enemies.loadFromFile("..\\resources\\sprites\\enemies.png"))
{
std::cerr << "problem loading texture\n";
throw ResourceExceptions("couldn't load enemies sprites!: must have ..\\resources\\sprites\\enemies.png");
}
//loading font once
if (!m_font.loadFromFile("..\\resources\\font\\gothic.otf"))
{
std::cerr << "problem loading font\n";
throw ResourceExceptions("couldn't load game Font: must have ..\\resources\\font\\gothic.otf");
}
}
Resources & Resources::instance()
{
static Resources resource;
return resource;
}
sf::Texture & Resources::texture()
{
return m_soma;
}
sf::Texture & Resources::lvlTexture()
{
return m_lvl;
}
sf::Texture & Resources::Enemies()
{
return m_enemies;
}
sf::Clock & Resources::clock()
{
return m_clock;
}
sf::Font & Resources::Font()
{
return m_font;
}
например. использования будет:
m_sprite.setTexture (. Ресурсное :: экземпляр () текстуры ());
// —————————————
та же идея может быть применена где угодно, даже больше, если случайно вы будете иметь дело с трехмерными объектами и будете рендерить те, которые вы обнаружите, что синглтонов там даже не достаточно, и вы можете обратиться к шаблонам «мухи»
В целом, я предлагаю вам прочитать две вещи:
gameprogrammingpatterns.com
и легендарная книга: шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения
в вашем коде существует несколько проблем с кодом:
например. корпус переключателя на движение. спросите себя: «что произойдет, если вдруг я захочу добавить дополнительное действие?» «Что, если, например, я хочу, чтобы он вел себя по-другому в соответствии с предыдущим движением?» Ваш подход перенесет вас в обширные и длительные случаи переключения. оба покажут вам способы, которые позволят вам легче изменять код
Других решений пока нет …