упс — моя игровая архитектура с ++

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

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

Моя проблема заключается в следующем:
Я пытался сделать своеобразный дизайн в стиле интерфейса. Это включает в себя серию
абстрактные базовые классы, которые позволяют каждому объекту реализовывать поведение. Например, если я хочу, чтобы объект был подвижным,
он должен был бы наследовать от подвижного базового класса, который содержит виртуальную функцию с именем move() и какая-то позиция
координаты. Если бы я хотел, чтобы он был сопоставим, объект наследовал бы от абстрактного класса, который
содержит виртуальные функции 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 для видеоигр, которую я мог бы попробовать, но мне бы очень хотелось спасти то, что я уже
написано. Я считаю, что это хорошая возможность для обучения. Если у кого-то есть какие-либо идеи, я буду очень признателен. Как моя архитектура отличается от других простых игровых движков? имеет ли смысл моя архитектура интерфейса или она абсолютно неуклюжая?

7

Решение

Если вы работаете в 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();
9

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

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

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
};
0

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