2

現在、私はアプリを書いています。シングルトンを回避したい場合、すべての参照を単純に渡す必要がありますか?

例えば、

「メイン」クラスがあります。
クラス: メイン
+---- 画面
+---- カメラ
+---- 地形
+---- 乗り物
+---- PhysicsWorld

カメラ、地形、車両などのクラスが含まれています。さて、たとえば地形オブジェクトを作成しているときに問題が発生しました。Terrain は Main クラスの Screen オブジェクトにアクセスして、Terrain Graphics を画面に追加できるようにします。また、描画するときの Camera オブジェクトについても知りたいので、描画するスケールを認識します。また、それ自体を物理エンジンに追加できるように、私の PhysicsWorld オブジェクトについても知りたいと考えています。

これらのオブジェクトを常にコンストラクター間を行き来させる必要がありますか? つまり、Terrain オブジェクトを作成するときに、画面オブジェクト、physicsWorld、カメラなどを渡すだけでよいのでしょうか?

私が持っている別のランダムなシナリオは、現在.. Vehicle クラス内で、 Main クラスで Restart() メソッドを呼び出す必要があります。これは、main のインスタンスを Vehicle に渡す必要があるということですか? 本当??

クラスに常に 4 ~ 5 個のものを渡さなければならないのは面倒です。特に、ほとんどすべてのゲーム内オブジェクトが画面、物理、カメラ情報などを必要とするシナリオでは特にそうです。

助言がありますか?

4

4 に答える 4

2

クラスに常に 4 ~ 5 個のものを渡さなければならないのは面倒です。特に、ほとんどすべてのゲーム内オブジェクトに画面、物理演算、カメラ情報などが必要なシナリオでは特にそうです。正しい質問は、「なぜすべてのクラスで 5 つのオブジェクトすべてが必要ですか?」なぜ地球上ですべての in-gmae オブジェクトが言及されたもののいずれかを必要とするのですか? ゲーム内オブジェクトには、位置と、その動作を処理するために必要なものが必要です。次に、別のレンダラーがオブジェクトをレンダリングできます。つまり、レンダラーだけがカメラ情報と画面を必要とするということです。

物理学はどちらの方向にも進む可能性があります。ゲームオブジェクトを更新する別の物理エンティティを持つことも、その物理オブジェクトをすべてのゲームオブジェクトに渡すこともできます。しかし、それを無視したとしても、リストされている 3 つのオブジェクトのうちの 1 つになります。:)

これが、グローバルとシングルトンを避けるのが最善である理由です。それらは依存関係を偽装するため、オブジェクト間に実際に必要なよりもはるかに多くの依存関係が存在することになります。そして、グローバルを削除することはほとんど不可能になります。

ただし、グローバルに固執する場合は、自分に有利に働き、少なくともシングルトンは避けてください。シングルトンによって強制される追加の制約は必要ありません。

Terrain は Main クラスの Screen オブジェクトにアクセスして、Terrain Graphics を画面に追加できるようにします。また、描画するときの Camera オブジェクトについても知りたいので、描画するスケールを認識します。また、それ自体を物理エンジンに追加できるように、私の PhysicsWorld オブジェクトについても知りたいと考えています。

地形オブジェクトは、地形がどのようなものかという 1 つのことを知る必要があります。他の誰かがそれをレンダリングする責任を負うことができます。誰かがカメラ、画面、地形グラフィックスについて知る必要があることは確かです。これは、同じオブジェクトがこれらのオブジェクトを含む他のタスク (他のレンダリング タスクなど) を実行できる可能性が高いことを示唆しています。地形が描画される縮尺を考慮する必要があるのはなぜですか? ゲーム内のスケールを知る必要がありますが、カメラ空間のスケールは必要ありません。そして、他の誰かが地形を物理エンジンに追加できないのはなぜですか? main 関数でもそれができるかもしれません。地形を作成し、物理エンジンを作成し、物理エンジンに地形を登録し、ゲームを開始します。

于 2009-03-07T02:21:59.293 に答える
1

ActionScript についてはわかりませんが、変数が参照によって渡されると仮定すると、インスタンスに渡す Camera、Screen、Terrain、PhysicsWorld を保持する「Environment」クラスを作成するだけで済みます。

于 2009-03-07T01:24:22.897 に答える
0

私はまったく同じ問題を抱えています(偶然にもactionscript 3でも)。

私はフラッシュ用の RTS に取り組んでおり、新しいクラス (gameGrid、currentSelection、visibleUnits など) ごとに多数の参照を渡す必要があることに気付きました。

私が実際にすべきことは、すべてのクラスに独自のプロパティを保持させ、代わりにこれらのクラス (オブジェクト) への参照を渡すことであることに最終的に気付きました。

とにかく、今私がやっていることは、RTSGlobals と呼ばれるクラス内のメイン ステージ、インターフェイス、エンジン、表示領域など、一般的に使用されるオブジェクトへの参照を含む静的変数を持つことです。画面サイズなどの定数も入れています。

これがあなたの質問に実際に答えていないことはわかっていますが、効率的なソリューションを優先して、OOP の良い実践を少し無視する価値がある場合があると思います。

ただし、誰かが良い実践的な解決策を持っている場合は、教えてください:)

于 2009-03-07T03:55:19.117 に答える
0

I suggest you take a look at XNA's samples projects (google it). They're well designed and might give you some hints.

Also, since you're using AS3, you could use the event system to dispatch message to other entities. For example, instead of passing your Main to your Vehicle class, make your Main (or whatever else interested) a listener of your Vehicle class. Then, let's say the car crash and you want to restart the game, dispatch an event, for example CAR_CRASHED. The listeners of your car should do something based on this message. If you want to understand the event system, type EventDispatcher, highlight it and hit F1 in your Flash IDE.

于 2009-05-29T01:20:38.690 に答える