世界のために、ある種のグローバルエンジンを作成できるかもしれません。エンジンにはシステムがあり、世界はエンジン内のシステムと見なすことができます。エンティティのコンストラクターでエンジンからワールド システムを要求し、そこで必要なことを行います。
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 コンポーネントをエンティティにアタッチすると、両方を持つことがすぐにわかります。