Я довольно опытный программист, но я все еще относительно новичок в архитектуре и дизайне ООП на С ++.
Большая часть моего опыта связана с C # и Java. Недавно я попытался написать простой игровой движок на с ++.
Я использовал 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 для видеоигр, которую я мог бы попробовать, но мне бы очень хотелось спасти то, что я уже
написано. Я считаю, что это хорошая возможность для обучения. Если у кого-то есть какие-либо идеи, я буду очень признателен. Как моя архитектура отличается от других простых игровых движков? имеет ли смысл моя архитектура интерфейса или она абсолютно неуклюжая?
Если вы работаете в 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
};