моя игровая архитектура c++

Я довольно опытный программист, но я все еще относительно новичок в архитектуре и дизайне ООП на C++. Большая часть моего опыта связана с C# и Java. Недавно я попытался закодировать простой игровой движок на c++. Я использовал SDL для графики. В этом посте я хотел бы обсудить архитектуру и получить обратную связь на нем. В частности, я столкнулся с проблемой дизайна, с которой мне нужна помощь. Итак, вот идет:

  • в моей основной функции я инициализирую все материал SDL для рисования на экране и т. д.
  • затем я создаю экземпляры всех объектов, которые я намерен использовать: пол, стена, игрок и т. д.
  • далее я запускаю основной цикл. Этот цикл выполняет функции перемещения, обнаружения столкновений и обработки столкновений каждого объекта и перерисовывает их.
  • основной цикл выполняется до выхода приложения, рисуя по одному кадру на каждой итерации.

моя проблема заключается в следующем: Я попытался сделать своего рода интерфейс-стиль дизайн. Она включает в себя ряд абстрактные базовые классы, позволяющие каждому объекту реализовать поведение. Например, если я хочу, чтобы объект был подвижным, он должен был бы наследовать от подвижного базового класса, который содержит виртуальную функцию с именем move() и некоторые позиции координирует. Если бы я хотел, чтобы он был collidable, объект унаследовал бы от collidable абстрактного класса, который содержит виртуальные функции checkCollision() и handleCollision() а также переменная-член hitbox. Объект как игрок наследует оба этих базовых класса, а также несколько других.

это работает достаточно хорошо, пока я делаю все вручную в главном цикле. Я могу просто сказать:

player.move();
player.checkCollision();
player.handleCollision();
player.draw(). 

и это прекрасно. Но я бы хотел ... иметь вектор или массив общих объектов в основном цикле и делать что-то вроде этого:

for each object in vector
    if object is of type movable
        object.move();
    if object is of type collidable
        object.checkCollision();

Я думал, что смогу сделать это с помощью динамического кастинга, но я действительно ничего не смог придумать. Я пробовал хранить их как указатели пустоты, но это не работает так, как я хочу. Я читал об этом gameobject-компонентная архитектура для видеоигр, которую я мог бы попробовать, но я бы очень хотел спасти то, что у меня уже есть написанный. Думаю, это хорошая возможность для обучения. Если у кого-нибудь есть идеи, я был бы очень признателен. Как моя архитектура по сравнению с другими простыми дизайнами игрового движка? имеет ли моя архитектура интерфейса смысл или она полностью шаткая?

2 ответов


Если вы работаете на C++, попробуйте SFML - это быстрее, чем SDL и если вы знаете OpenGL, вы можете использовать его тоже.
Для вашей проблемы:

class Entity {
     //constructor and other stuff
     void virtual exec() =0; ///<= pure virtual method
};

class Movable : Entity {
    void move(); //do somthing
    void exec() {move();};
};

class Collidable : Entity {
   void col(); //do your job
   void exec(){col();};
};

std::vector<Entity*> e_v;
///push some instance
for (Entity* e : e_v)
   e->exec();

Как насчет использования шаблона метода шаблона и не абстрактных пустых виртуальных функций в базовом классе?

class Entity
{
    void update()
    {
        move();
        checkCollision();
    }

    virtual void move() {}
    virtual void checkCollision() {}
};

class Movable : public virtual Entity
{
    virtual void move() {}   // Stuff
};

class Collidable : public virtual Entity
{
    virtual void checkCollision() {}   // Stuff
};