0

私は Cocos2D-x でゲームを書いていますが、オブジェクト指向がずさんな感じで苦労しています。私はその気持ちを揺るがすことができず、その理由に指を置くことができます.

ゲームシーンクラス

  • これでレイヤーが作成されます

レイヤ クラス

  • 自分自身を創造する責任
  • 必要に応じて HUDS も呼び出す
  • レイヤー上のオブジェクトの std::vector を含みます

オブジェクト クラス

  • 自分自身のすべてを保持する
  • レイヤー上にスプライトメンバー変数がある

HUD1

  • ユーザーがレイヤーをタップし、タッチがオブジェクトでも発生したときに呼び出されます
  • オブジェクトに対してできることのメニューです
  • メニュー項目をクリックすると、オブジェクトの値を変更する必要があります
  • メニュー項目をクリックすると、実際にはオブジェクト内のコードが実行されます (object::doSomething())

私が思うにずさんな感じは、これらのクラスに多くの依存関係があることです。

これを抽象化し、オブジェクト、レイヤー、HUD などのコードの代わりに、このすべてを制御するクラスを作成する必要があると思います。

これがどのようにレイアウトされているか、そして私がオブジェクト指向の間違いを犯しているかどうかについて誰かが私に話すことができますか?

4

2 に答える 2

2

グラフィックスやゲームは、多くの OO テキストの例であるにも関わらず、OO 設計にうまく適合しないことが判明しました。データからコントロールを分離することに関しては、あなたの本能は正しいです。最近のゲームで一般的な設計パターンは、厳格な OO 階層ではなく、コンポーネント、エンティティ、およびシステムを使用することです。

コンポーネントの単なるコレクションであり、おそらくいくつかのメッセージング インフラストラクチャであるエンティティまたはゲームオブジェクトがあるという考えです。コンポーネントは、接続されているエンティティに関するデータを保存します。たとえば、Transform コンポーネントと速度コンポーネントがあるとします。1 つのアプローチは、コンポーネントがフックできるメッセージング システムを用意し、それを使用してデータを更新することです。たとえば、Velocity コンポーネントは Update メッセージにフックし、Update ハンドラーでオブジェクトの変換を取得して移動できます。コンポーネント間のすべての通信にメッセージを使用することで、それらを大幅に切り離すことができます。

システムは、コンポーネント データの更新を処理する別の方法です。システムのアイデアは、「これらのコンポーネントを使用してエンティティを操作する」と言うことができるプロセスがあり、実行時に関連するすべてのエンティティのリストを取得することです。これにより、関数からデータがさらに切り離され、スレッド化と依存関係の管理が容易になります。

本質的にオブジェクト指向設計は、現実世界の「あるがまま」をキャプチャすることですが、ゲームではそれを望んでおらず、気にするのは物事がどのように見えるかだけであり、個々のファセットを変更できるようにしたいと考えています。痛みのない何かの行動の。

エンティティ コンポーネント システムの優れたリソース:

http://piemaster.net/2011/07/entity-component-primer/
http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

于 2013-07-26T01:04:13.577 に答える
0

コードに飛び込む前に、何を達成しようとしているのかを考えてください (これを実行したいという衝動は非常に強いですが!)

依存性注入を使用して、クラスを分離してみてください。これには、多数の余分なクラスと複雑さを追加する必要があるかもしれませんが、後でゲームの特定の部分を必然的にリファクタリングする必要が生じたときに、作業がずっと楽になります。「ガムとガムテープ」ソリューションの使用は避けてください。そうすることで発生する技術的負債が戻ってきて、後で噛み付くからです。

于 2013-07-25T23:32:59.920 に答える