一种简单(不一定灵活或强大)的方法是定义一个基本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
现在您有了使用游戏对象的通用方式。接下来,您可以将它们存储在一个映射中(如果您有 Boost、TR1 或 C++0x,最好是 unordered_map),并使该映射全局可用:
// 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 */
同样,这是一个简单的解决方案,不一定可靠、最佳实践或灵活。但是对于第一场比赛,它会工作得很好。 (为了改进它,您需要研究异常安全、智能指针和其他东西(游戏书)。我建议您在尝试制作游戏之前这样做。)