物理学とゲームロジックをUIコードから分離する


12

私は単純なブロックベースのパズルゲームに取り組んでいます。

ゲームプレイは、ゲームエリア内を移動するブロックで構成されているため、簡単な物理シミュレーションです。しかし、私の実装では、理想とはほど遠いものであり、より良い方法についての指針を教えていただけませんか。

多くのパズルゲームで行ったように、ゲームロジックとUIの2つの領域にコードを分割しました。

  • ゲームロジックは、ゲームの一般的なルール(チェスの正式なルールシステムなど)を担当します。
  • UIはゲーム領域とピース(チェス盤やピースなど)を表示し、アニメーション(チェスの駒のアニメーションの動きなど)を担当します。

ゲームロジックは、ゲームの状態を論理グリッドとして表します。各ユニットは、グリッド上の1つのセルの幅/高さです。したがって、幅6のグリッドの場合、幅2のブロックを境界と衝突するまで4回移動できます。

UIはこのグリッドを取得し、論理サイズをピクセルサイズに変換して描画します(つまり、定数を乗算します)。ただし、ゲームにはゲームロジックがほとんどないため、ゲームロジックレイヤー[1]は、衝突検出以外にはあまり関係がありません。仕組みは次のとおりです。

  1. プレイヤーがピースをドラッグし始めます
  2. UIは、ゲームロジックにそのピースの正当な移動領域を要求し、プレイヤーがその領域内でそれをドラッグできるようにします
  3. プレイヤーは駒を手放す
  4. UIはピースをグリッドにスナップします(そのため、有効な論理位置に配置されます)
  5. UIはゲームロジックに新しい論理的位置を伝えます(ミューテーターメソッドを使用します。

私はそれに満足していません:

  • ゲームロジックレイヤーのユニットテストを作成していますが、UIは作成していません。UIにはトリッキーなコードがすべて含まれていることがわかりました。ピースが他の人や境界と衝突してグリッドにスナップするのを止めます。
  • UIがゲームロジックに新しい状態を通知するという事実が気に入らないのでmovePieceLeft()、他のゲームのようにメソッドまたはそのようなものを呼び出すようにしたいのですが、そのアプローチにはあまり向いていません。ゲームロジックは、UIで可能なドラッグとスナップについて何も知りません。

最善の方法は、ゲームロジックレイヤーを取り除き、代わりに物理レイヤーを実装することだと思います。それに関していくつか質問があります。

  1. このような物理層は一般的ですか、それともゲームロジック層にこれを行わせるのがより一般的ですか?
  2. グリッドへのスナップおよびピースのドラッグコードは、UIまたは物理レイヤーに属しますか?
  3. そのような物理層は、通常、ピクセルサイズまたはゲームロジック層のような何らかの論理ユニットで動作しますか?
  4. ゲームのコードベースでイベントベースの衝突検出を見たことがあります。つまり、プレーヤーがピースをドラッグするだけで、UIがそれを素直にレンダリングして物理システムに通知し、物理システムがonCollision()メソッドを呼び出します。衝突が検出されると作品に。もっと一般的なものは何ですか?このアプローチまたは最初に法的運動領域を求めていますか?

[1] レイヤーはおそらく私が言っていることの正しい言葉ではありませんが、サブシステムは誇張されており、各レイヤーは複数のクラスで構成されているため、クラスは誤解しています。


私の答えは助けになりましたか、さらなる情報が必要ですか?
ウィルマルクレール

これが役立った場合は、賛成票を投じて回答を受け入れるか、そのようなアーキテクチャまたは何かを実装する際の問題についてお伝えください。ただし、状況をお知らせください。=)
ウィルマルクイラー

回答:


3

あなたが何を求めているのか理解できるので、この質問に答えようとしますが、まだ学習しているだけなので、ゲーム開発の経験はあまりありません。

私が見るように、ゲームのロジックとドメインオブジェクト、つまりパズルのピースからGUIコードを分離する必要があります。これらは確かに3つの別々の層です。そして、はい、layer私の意見では適切な用語です。多くの場合、システムの各オブジェクトレベルを互いに独立したサブシステムに分離する概念を説明するために使用されます。

オブジェクト指向プログラミングに関しては、各オブジェクトはクラスでなければなりません。したがって、パズルの各ピースは、それ自体のクラスで構成され、ゲームボードでも構成されます。ゲームボードには、プレーヤーに与えるサイズと移動能力に応じて、X個のパズルが含まれている必要があります。

したがって、トピックに関する私の考えは次のとおりです-私はそれが役立つことを願っています:

  1. GUIレイヤー:このレイヤーには、ゲーム自体をプレーヤーと相互作用させるために、ゲームボード上のピースを表示するためのメソッドのみが含まれます。
  2. ゲームコントローラーレイヤー:プレーヤーの入力を担当します。それは、ピースが異なる方向に移動するように指示し、ゲームボードに移動などの衝突があるかどうかを尋ねるレイヤーです。
  3. ビジネスレイヤー:このレイヤーには、すべてのビジネスクラス、つまりゲームのピースとパズルのピースを含むゲームボードオブジェクトが含まれます。

このアーキテクチャでは、ゲームの状態のプレーヤー、パズルの各ピースの場所をGUIレイヤーに表示します。次に、GUIレイヤーがプレーヤーの入力を取得し、基礎となるゲームコントローラーレイヤーに渡します。このレイヤーは、衝突検出を行います。ない場合は、ピースをその入力方向に移動するように注文できます。そのためには、この作品のを呼び出す必要がありますMoveLeftMoveRightなど、作品を動かす方法。同様に、ゲームボードにどのピースを動かしたいかを知らせてから、それ自体でピースの動きを命令し、次にピースを要求された方向に動かします。このアーキテクチャにより、各コードの異なるレイヤーへのテストが簡単になり、ユニットテスト、統合テスト、機能テストが可能になります。

これは一見混乱するかもしれませんが、そうでない場合は神に感謝します!さらに詳細な情報やサポートが必要な場合は、お気軽にお問い合わせください。ゲーム開発の初心者ですが、できる限りのサポートをさせていただきます。

読んでくれてありがとう!=)


2
Model View Controllerに非常によく似ています。
tenpn

正直に言うと、基礎となる実装からインターフェースを抽象化する記述は、Model View Controllerのように聞こえます。しかし、それは、使用されている用語と技術が同じであるためです(実装の詳細は省略し、ユーザーインターフェイスを実装から分離します)。ただし、非常にシンプルな環境を想定しています。ここには複数のレイヤーがあり、各レイヤーにはコントローラーがあります。ここでは、モデルからビューを分離するだけでは十分ではありません。ユーザーインタラクションコントロールをゲームコントロールから分離する必要もあります。
MrCranky

パズルのピースを区切られたゲームボードに移動しているので、ここで何がそんなに複雑なのだろうか。コントロールはGUIから取得されますが、これは実際には良い方法であり、抽象化レイヤー、つまりゲームコントローラーに渡されます。ゲームコントローラは、移動時に衝突をチェックし、衝突が検出されない場合はピースに移動するよう指示します。その後、パズルのピースは要求された方向に向かって適切に移動し、Positionプロパティゲッター関数を介して新しい位置を明らかにするため、ゲームコントローラーはこの移動したピースをその新しい位置に表示するためにGUIを必要とします。
ウィルマルクレール

数ヶ月前、ゲーム開発における「MVC」についてブログを書きました。はい、それはゲーム開発に初心者にとっては良いゲートウェイのコンセプトです:codecube.net/2010/08/xna-for-the-everyday-developer
ジョエルマルティネス

1
受け入れが遅くなって申し訳ありませんが、残念ながらしばらくプロジェクトから気を取られました。私はコントローラーのアプローチが本当に好きです、私はそれを採用します!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.