对于世界,也许您可以创建某种全球引擎。引擎将有系统,世界可以被认为是引擎内部的系统。您将在实体的构造函数中向引擎请求世界系统,并在其中执行您需要的操作。
class World : public System
{
// info in here
}
class Engine
{
public:
World * getWorldSystem(); // Not as good
System * getSystem( std::string name ); // uses lookup, convert to right type
}
引擎类的问题是“我如何引用它?” 在大多数情况下,您将包含引擎的 .h 文件,该文件还具有:
extern Engine * ENGINE;
在其中,我理解这很可怕,但是对于引擎/系统架构,您必须在某个地方拥有它。或者您明确使用单例。
至于你的继承树可能会完全改变你的设计方案。基于组件的架构可能是您解决此问题的一种方式。
虽然继承在很多情况下都是有意义的,但构建基于组件的实体将帮助您处理每只动物必须拥有的大量奇怪类型。
拿:
class Component
{
public:
Component();
virtual ~Component();
}
class WalkComponent : public Component
{
public:
Walk(); // Something here allows the entity to walk on the ground
}
class FlightComponent : public Component
{
public:
Fly(); // Something in here moves the entity around using flight
}
马上你可以看到你可以将一个 walk 组件和一个 flight 组件附加到实体上,它会同时拥有这两者,而不是尝试创建一个允许这两者的继承树。