2017-03-07 5 views
0

私はC++でゲームを作成しようとしています。 Worldクラスには、すべてのゲーム状態関連オブジェクトとメインゲームループ機能が含まれています。ゲームパターンのメソッドを更新する引数

class World { 
    Clock clock; 
    Map map; 
    std::vector<Entity*> entities; 
... 

ゲームのすべてのエンティティは抽象クラスEntityから継承されています。たとえば:

class Player: public Entity {...}; 
class Enemy: public Entity {...}; 
class Bullet: public Entity {...}; 

エンティティは、すべてのエンティティのリストを反復処理し、それぞれのupdate()メソッドを呼び出すことによって、各フレームを更新しています。

さまざまなフレームレートを考慮に入れて、各フレームの経過時間をfloat deltaとして(ほとんどの他のゲームエンジンのように)更新メソッドに渡します。私が遭遇する問題は、企業がupdate()で参照する必要があるすべての異なるものです。次のように

Entityクラスは、仮想updateメソッドを定義します。

for(int i = 0; i < entities.size(); i++) { 
    entities[i]->update(clock.get_delta()); 
} 

これは素晴らしい作品:ゲームループからこの関数を呼び出す

virtual void update(float delta) = 0; 

は次のようになります。しかし、例えば、Playerが異なるサーフェス上をより速く移動できるフィーチャを追加したいとしましょう。プレーヤーがどの面にいるのかを知るには、Worldクラスに属するMapオブジェクトにアクセスする必要があります。

我々は仮想updateメソッドにそれを追加することができます。

virtual void update(float delta, Map *map) = 0; 

しかし、今EnemyBulletの更新機能は、彼らがそれを使用していないにもかかわらず、新しいマップのパラメータを取らなければなりません。

エンティティがその更新メソッドで必要とする他のオブジェクトまたは変数に対しても同じことが行われます。まもなく、数多くのパラメータ(ゲームマップ、他のエンティティのリスト、ゲームの状態情報)がメソッド定義を混乱させます。

私の質問は次のとおりです。どうすればこの問題を防ぐことができますか?私は唯一の引数としてWorldへの参照を渡そうとしましたが、循環依存関係が生じました。

+1

これは興味深い質問ですが、少し幅が広く、潜在的な解決策がたくさんあります。 http://gamedev.stackexchange.com/で運がよかったかもしれません。そこには[この質問](http://gamedev.stackexchange.com/questions/31473/what-is-the-role-of-systems-in-a-component-based-entity)のようなゲームエンジンアーキテクチャの議論がたくさんあります。 - アーキテクチャ)。 – bejado

+0

円順依存関係は、[フォワードクラス宣言](http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration)で管理することができます – JGroven

+0

[前方宣言?](http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration) –

答えて

1

私はMap*Playerクラスに保存することでこれを解決しました。あなたはそれを変更する必要がない場合は素晴らしい作品。

関連する問題