我正在尝试使用 C++ 创建 Breakout 克隆,因此有几个对象(如球、桨、powerupicon、 block 等)。我知道将它们放在全局范围内是不好的做法,因此它们在 main() 中初始化。问题在于需要从其他函数(如 redraw() 或 reset_game())内部对这些对象进行操作。我能想到的唯一方法是将对象的引用传递给每个函数,但我不确定这是否是最佳方法。
基本上,在函数内处理这些对象的最佳方式是什么?通过引用传递它们?使它们成为全局但在命名空间内?还是完全不同的东西?
最佳答案
一种简单(不一定灵活或强大)的方法是定义一个基 game_object
类,该类定义您与游戏对象的接口(interface),并存储它们。你的对象继承自它。:
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
现在您有了使用游戏对象的通用方法。接下来,您可以将它们存储在 map 中(如果您有 Boost、TR1 或 C++0x,最好是 unordered_map
),并使该 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 */
同样,这是一个简单的解决方案,不一定稳健、最佳实践或灵活。但对于第一场比赛,它会运作良好。 (要改进它,您需要研究异常安全、智能指针和其他东西(游戏书籍)。我建议您在尝试制作游戏之前这样做。)
关于c++ - 如何让非全局对象在函数内进行交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3691861/