моя игровая архитектура 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
};