ゲーム開発におけるクラス設計の正しいオブジェクト指向のアプローチは何ですか?


31

XNAを使用して、Windows 7 Phone用の2Dスプライトベースのゲームを開発しています。それに利用できるトレーニングとチュートリアルは非常に役立ちますが、私が直面する問題は、それぞれが異なる方法でクラス設計にアプローチし、コードが特に適切にファクタリングされていないことです。その結果、特定のクラスにどの責任を与えるべきかを十分に理解することは困難でした。

たとえば、自分BaseSprite自身を描画する方法、衝突をチェックする方法などを知っているベーススプライトクラスを持つことができます。その後AnimatedSprite、スプライトシートやExplodingSpriteクラスなどをナビゲートする方法を知っているクラスを持つことができます。この手法は、Windows 7 Phone Jumpstart Session 2資料のSpace Invadersの例で説明されています

または、代わりに、ゲームの責任のレンダリングと実行の大部分をGameScreenクラスに配置することもできます。そのクラスとその派生クラスは、その責任の点でフォームまたはWebページのように動作します。スプライトクラスは、ロジックがはるかに少ない、より単純なコンテナです。

これは、Windows 7 Phone Training KitのAlien Spriteゲームおよびその他のゲーム状態マネージャーの例で使用されている手法です。

ゲーム開発におけるクラス設計の正しいオブジェクト指向のアプローチは何ですか?

回答:


26

Visual、Collision、Animation、Inputなどのコンポーネントを持つSpriteクラスを使用する、よりコンポーネント指向のアプローチを使用します。このアプローチでは、クラス階層が深くなりません(これは良いことです)。 。

コンポーネント指向設計の詳細については、こちらをご覧ください


2
+1したリンク先の記事は素晴らしかったです。私は純粋なオブジェクト指向設計に集中していたので、コンポーネント/デコレータータイプモデルを完全に見落としていました。
ジョシュE

1
コンポーネントパターンは、実際には「純粋ではない」オブジェクト指向ではありません:)
Srekel

2
確かに。オブジェクト指向は、多くの場合、継承と同一視されます。しかし、継承はオブジェクト指向が提供するツールの1つに過ぎず、構成は別のツールです。
ハファックス

ちょうどそう。私は言葉遣いをもっと正確にすべきだった。私が意味したのは、私が望んでいたことを達成するのに役立つOOデザインパターン/他のOOの側面を考えるのではなく、OOの継承側に多く焦点を合わせたことです。
ジョシュE

構成ベースのアプローチは非常に明白で頻繁に使用されますが、レンダリングコンポーネントをポータブルに保つためのソリューションはまだありません。どんなヒントも素晴らしいでしょう。
アンドレアス


6

SOLID原則は、他の職業へとゲームコード設計に限り適用されます-私は開始点として、あなたの最初の例を使用すると思いますので、少なくともあなたは、最適化に来るまで。

BaseSpriteはメガクラスになる傾向があるように聞こえるので、さらに先に進みます。単一責任の原則では、衝突、レンダリング、およびナビゲーションはすべて、クラス階層内の個々のエントリではなく、コンポーネントによって処理される必要があります。これらすべてのコンポーネントの保持クラスは、それらの間のワールドポジションのプッシュのみを処理する必要があります。


5

最後のいくつかのプロジェクトでは、MVCスタイルのアプローチをより重視しました。

最初は、これが機能するかどうかはわかりませんでしたが、完全に機能しました。

モデル

データオブジェクト。純粋なデータのみ。動作もレンダリングもありません。

データ管理者。データオブジェクトの「リスト」を処理するだけです。(プーリングをサポートするように拡張することもできます。)

表示する

それらをレンダラーと呼びます。すべてのデータオブジェクトタイプにレンダラーがあります。マネージャーで呼び出されると、そのリスト内のすべてのオブジェクトをレンダリングします。

コントローラ

レンダラーと同じですが、動作を制御します。

ShipManagerにはShipsのリストがあります。ShipControllerは、状態に応じてShipsを移動します。ShipRendererは、状態に応じて船舶をレンダリングします。

なぜ

このようにして、ビューとロジックは厳密に分離されます。新しいプラットフォームへの移植が非常に簡単になります。XxxManager内のデータレイアウトの最適化も非常に簡単です。


2
多かれ少なかれ素朴な「MVCを使用」を受け入れられる答えとして見るのにうんざりしているので、私はあなたに投票しています。最新のプラットフォームで開発している場合、すでに複数のレベルでMVCを使用しています。それは具体的な答えではなく、良い答えでもありません。実際には、タスク/ドメイン固有のクラスを構造化する方法を人々に教えないからです。「クラスモーダル...;クラスビュー...;クラスコントローラー...」と書く人がたくさんいます。MVCは、既存のコードについて話すときに、多くの優れた高レベルの説明力を持つパターンです。優れた計画力を備えたパターンではありません。

4
@ジョー私はあなたのポイントを得るが、あなたの言葉の選択は不必要な失礼を見つける。私たちはそれをどのように行うかを説明しました。高レベルのアーキテクチャを選択すると、低レベルのデザインを選択できなくなるため、有効な答えだと思います。
アンドレアス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.