1

乱用されたトピックですが、これに対する答えが見つかりませんでした。私は「iPhone と iPad の cocos2d ゲーム開発を学ぶ」という本に従っていますが、ShootEmUp の例 ( 1で入手可能) のアプローチが最適かどうかを本当に理解できません。作成者は、さまざまなオブジェクト (Ship、InputLayer など) を子として追加する GameScene を使用します。物議を醸す側面は、これらのオブジェクト内で、GameScene の init メソッドでインスタンス化された GameScene クラスの静的インスタンスを返す静的メソッドを使用して、GameScene への呼び出しがあることです。これは私には循環参照のように思われ、多くの人によると(たとえば、この投稿を参照)、避けるべきものです。このアプローチは1にあるため、ゲームプログラミングにも当てはまるかどうかはわかりません。そして、これには理由があるかもしれません。

誰かが明確にすることができますか?コードを完全に再構築するか、静的変数アプローチを維持するかを決めかねています。

どうもありがとうございました :)!

ソースコード

4

2 に答える 2

2

ここに表示されているのはセミシングルトン パターンで、Cocos 全体で広く使用されています。実際、Cocos フレームワーク自体は完全にシングルトン オブジェクトで構築されています (多くの Apple の UIKit と同様)。通常、ゲームには、スコア、ヘルス、武器などの多くの中心的なデータがあり、多くのオブジェクトが何らかの知識を必要とするため、ゲームはシングルトンを頻繁に使用します。また、通常、プレイヤーや敵などのオブジェクトが、アプリの中央ディスパッチに何をしているかを通知する必要があるため、ゲーム内の他のオブジェクトが反応したり、それに応じて調整したりできます。

これが、ここで示したテクニックを多くの Cocos ゲームが使用する理由です。シングルトン プログラミングのリスクを理解していれば、それは悪い習慣ではありません。基本的に、次の点に注意してください。

  • シングルトン スタイルの手法を使用するか、代わりに別のメソッドを使用して親を呼び出すかに関係なく、どちらの方法でも基本的に同じことを行っています。メソッドに依存して派生させるよりも、中央のゲーム エンジンを直接参照する方がよいでしょう。[self parent]最初に「誰が親であるか」を把握しなければならないときに、後で読みにくくデバッグするのが難しくなる可能性があるため、使用はお勧めしません。
  • 子は親を保持するべきではありません。親を参照できますが、保持しないでください。
  • ここでのシングルトン アプローチに代わる方法は、親を指す iVar を子に作成することです。ただし、これは基本的に同じ考え方であるため、保持サイクルのリスクを最小限に抑えるには、通常、シングルトンにアクセスする方が安全です。iVar が適切に設定されていない場合、循環参照が発生する可能性があります。ここで示した方法は、循環参照ではありません。

この特定のコードにより、GameScene が初期化される+(GameScene*) sharedGameSceneまでメソッドを使用できないことに注意してください。これがセミシングルトンになる理由です。通常、シングルトンのこのメソッドは、まだ初期化されていない場合は、それ自体を初期化するのに十分スマートであるため、このクラスメソッドを使用してオブジェクトを返すか、最初に作成してから返します。

他のことをする前にゲーム シーンを初期化する可能性が高いため、Cocos ではおそらく問題にはなりません。したがって、ゲーム シーンは既に存在します。

于 2012-05-05T04:30:44.313 に答える
2

この部分を参照していると思います:

static GameScene* instanceOfGameScene;
+(GameScene*) sharedGameScene
{
  NSAssert(instanceOfGameScene != nil, @"GameScene instance not yet initialized!");
  return instanceOfGameScene;
}

これは循環参照を作成しません。この方法でコードを作成するのは良い方法ではないと主張する人もいるかもしれませんが、それは別の議論です。

この関数 (GameSceneオブジェクト) からの戻り値が、一部の GameScene の子で強力なプロパティとして参照されていない場合は、問題ありません。

children の 1 つにこれがある場合、循環参照のケースがあります。

@property(nonatomic, strong) GameScene *mainScene;
// OR for non-ARC
@property(nonatomic, retain) GameScene *mainScene;

これらは、GameSceneオブジェクトの参照カウントが 0 になって解放されるのを防ぎます。

お役に立てれば。

于 2012-05-04T12:34:44.150 に答える