Простой (не обязательно гибкий или мощный) подход заключается в определении базового game_object
класса, который определяет ваш интерфейс с игровыми объектами, и хранит их.Ваши объекты наследуют от него .:
class game_object
{
public:
virtual ~game_object() {}
virtual void update() = 0;
virtual void draw() = 0;
// get and set position
virtual vector3 position() = 0;
virtual void position(const vector3&) = 0;
// etc...
};
class ball : public game_object
{
public:
void update() { /* update the ball */ }
void draw() { /* draw the ball */ }
// etc
};
// etc
Теперь у вас есть общий способ использования игрового объекта.Затем вы можете сохранить их на карте (предпочтительно unordered_map
, если у вас есть Boost, TR1 или C ++ 0x) и сделать эту карту доступной глобально:
// game_object_manager.h
typedef std::map<std::string, game_object*> game_object_manager;
extern game_object_manager manager;
Вы определяете это вединица перевода (либо main.cpp
, либо game_object_manager.cpp
) где-нибудь.Наконец, вы используете это, вставляя вещи по имени:
// somewhere, add the ball
manager.insert(std::make_pair("ball", new ball()));
И используйте это:
game_object* b = manager["ball"];
if (!b) /* there is no ball object */
// use b as ball */
Опять же, это простое решение и не обязательно надежное, лучшая практикаили гибкий.Но для первой игры все будет хорошо.(Чтобы улучшить его, вам нужно взглянуть на безопасность исключений, умные указатели и другие вещи (книги об играх). Я рекомендую вам сделать это до того, как вы попытаетесь сделать игры.)