8

MVC パターンを使用して Java で 2D ゲームを作成していますが、お尻を読んで検索した後でも、オブジェクトのグラフィカル表現を処理する方法について満足のいく答えが見つかりません。

たとえば、Player を PlayerModel (Model に格納) と PlayerView (View に格納) に分割する必要がありますか?

どの図形表現オブジェクト、つまり「ScaryMonsterEnemyView」がどの論理表現オブジェクト「ScaryMonsterEnemyModel」に接続されているかを追跡する必要があるため、これはちょっと面倒に思えます。これは本当にMVCに従って行うべき方法ですか? もしそうなら、この接続はどこに保存されるべきですか? ビューで?

これがつまらない問題かもしれないことはわかっていますが、最初からできるだけ多くを得たいと思っています。助けてくれてありがとう:)

4

2 に答える 2

4

私が間違っていなければ、あなたは基本的に、ゲームを Model-View-Controller パラダイムに分割する方法を尋ねています。

簡単に言えば、モデルはゲームの状態です。オブジェクト指向の用語では、モデルはゲーム内のすべてのオブジェクトと考えることができます。

Controller は、すべての更新サイクルでゲームの状態 (この場合はすべてのゲーム オブジェクト) に適用される一連のルールです。これは、すべてのオブジェクトで update() と呼ばれるメソッドとして実装することも、更新が必要なすべてのオブジェクトを体系的に調べて、それらを更新するゲーム ループで呼び出される関数にすることもできます。コントローラはゲーム ループそのものと考えることができます。更新するすべてのものを呼び出し、それを画面に描画して繰り返します。いくつかの条件が満たされない限り、プログラムに何か他のことをするように指示します。このようにして、ネストされた 2 つの MVC 構造がほぼ完成します。1 つはメニューなどを通じてプログラムの流れを制御し、もう 1 つはゲーム自体専用です。

ビューは、ゲームのグラフィック表現にすぎません。これは画面上のテキストと同じくらい簡単ですが、あなたの場合は 2D グラフィックです。これを実装するには、各オブジェクトにグラフィカルな状態を直接またはカプセル化によって含めることもできます。ビューは、すべてのオブジェクトのグラフィカルな状態を照会し、それを画面に表示するだけです。これも、draw() と呼ばれるメソッドや、ゲーム ループから直接呼び出される別の体系的な関数など、オブジェクトごとに実装できます。一般的な方法は、'Sptite' などと呼ばれるオブジェクトを作成してグラフィック情報を保持し、描画されるすべてのゲーム オブジェクトに個人的なインスタンスを持たせることです。また、ビューはそれ自体がオブジェクトである必要はないことに注意してください。ゲームループで呼び出される単なる関数で十分です。ただし、ビューの操作 (ウィンドウ サイズなど) に直接影響する情報を格納する必要がある場合もありますが、その場合、ビューはオブジェクトにすることができます。コントローラーも同様です。

また、生活を簡素化するために、これらの区分をさらに細かく分割できることも覚えておいてください。例: コントローラーは、AI 処理、動きの更新、衝突チェックに分けることができます。ビューはゲーム オブジェクト ディスプレイと HUD に分離でき、モデルはすべてのオブジェクト + ゲーム オブジェクトから独立したすべての状態 (解像度、ウィンドウ サイズ、キー構成などのゲーム設定など) にすることができます。

これは少しやり過ぎかもしれませんし、おそらく余分な情報が含まれているかもしれませんが、うまくいけば、あなたの質問に答え、どこから始めるべきかについてのアイデアが得られることを願っています.

于 2012-08-21T03:47:29.953 に答える
1

モデルとビューは、オブジェクトの2つのコレクション/カテゴリ/ドメインです。

コントローラは、モデルオブジェクトでいくつかの機能を実行するための一連のインターフェイスを提供します。また、必要に応じて、ビューは状態情報に関してモデルオブジェクトと直接通信できます。

従来、ViewドメインはGUIに対応しており、ボタン、フォーム、Windowsなどの概念があります。デスクトップ環境では。

ビュードメイン(またはそれらの1つ)は、構築する3D環境に対応します。(木、家、人など)。これには、衝突の詳細と物理学が含まれます。どちらも、3D環境に関連するジオメトリを必要とします。

ゲームでは、これらのオブジェクトのいずれかが別のドメインのオブジェクトとコラボレーションする必要があることは非常にまれです。しかし、例として、電話について考えてみましょう。オブジェクトは3D環境に存在しますが、「ハーフコール」、「チャネル」、「スイッチ」などを説明する別のドメインとも連携します。これらのオブジェクトは、ビュードメインではなく、別のモデルドメインに属します。

より適切な例は、モデルドメインに属するRPG統計などのある種のスコアリングシステムである可能性があります。

于 2012-08-22T18:03:10.553 に答える