Я не знаю, как управлять структурами моих классов с SDL2

Я пытаюсь создать какую-то «мошенническую» игру на 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 и связывая его с объектом моей сущности … Я не знаю, я потерян …

Вы можете мне помочь? И есть ли у вас какие-либо советы или рекомендации, которые помогут мне правильно структурировать?

-1

Решение

на самом деле на ваш вопрос можно ответить, не ссылаясь непосредственно на 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
и легендарная книга: шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения

в вашем коде существует несколько проблем с кодом:
например. корпус переключателя на движение. спросите себя: «что произойдет, если вдруг я захочу добавить дополнительное действие?» «Что, если, например, я хочу, чтобы он вел себя по-другому в соответствии с предыдущим движением?» Ваш подход перенесет вас в обширные и длительные случаи переключения. оба покажут вам способы, которые позволят вам легче изменять код

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]