2012-05-02 10 views
1

私は現在iPhone上でcocos2dとbox2dを使ってゲームを開発中です。
私はゲームコードの編成、ゲームオブジェクトの構造などについて多くの記事を読んでいます。 私は最初にCCSpriteを継承する基本クラスから継承して自分のゲームオブジェクトの開発を始めました。 CCSpriteBatchNodeを使用して、プレイヤーが対話できるすべてのゲームアイテムを1回のドローコールで描画しました。私のItemクラスはCCSpriteから間接的に継承されているので、簡単にできました。そのため、アイテムをCCSpriteBatchNodeに簡単に追加することができました。そして、その上に私はオブジェクトを保持するためにcocos2dに依存することができます。コンポジションとCCSpriteBatchNodeのゲームオブジェクト

私は記事を読んだ後、継承スタイルではなく、よりコンポジション指向のスタイルで自分のコードをリファクタリングする必要性を理解しました。 だから私は、私が今直面してる問題は、私が直接CCSpriteBatchNodeに私のゲームオブジェクトを追加することができないということであるなど、NSObjectのから継承されたと、1つまたは複数のCCSpriteのような特性を持つゲームオブジェクトの基底クラスで

を1 b2Bodyを行ってきましたもう私はまず、GameObjectのスプライトプロパティをCCSpriteBatchNodeに追加することで、問題を簡単に修正できると考えました。それは大丈夫ですが、誰がCCSpriteを所有するオブジェクトを保持していますか? CCSprite(userData/Object ok)から元のオブジェクトに簡単にアクセスするにはどうすればよいですか?

アイテムを保持する配列を作成する必要がありますか? このようなゲームオブジェクト構造でCCSpriteBatchNodeをどのように使用するのか知りたいですか?

未回答の件についてすでにthreadがあります。その件について本当にお聞きしたいと思います。ストレートな答えではなく、さらに進んでいく要素。

ありがとうございました。

答えて

3

個人的には、NSObjectをcocos2dクラスの基本クラスとして使用することはもうお勧めしません。スケジューリングなどのココス2Dの便利な機能を失うだけで簡単に足元で自分を撃つことができます。メモリ管理が賢明です。

シーンに1つ以上のスプライトバッチノードがある設定が必要です。スプライトのレイヤーとみなすことができます。 CCNodeから派生した実際のゲームオブジェクト(MVCコントローラとみなす)は、通常はシーンに直接追加できます。

scene 
+ batch node 1 
    + sprite 1 
    + sprite 2 
    + sprite n 
+ batch node 2 
    + sprite 1 
    + sprite 2 
    + sprite n 
+ game node 1 
+ game node 2 
+ game node 3 
+ game node n 

心に留めておくべき事は、各ゲームのノードは、インスタンス変数などの1つまたは複数のスプライトを持っているということですが、彼らは、ノードのチャイルズじゃありません。したがって、たとえばゲームのノード1クラスでは、次のようになります。あなたがゲームノード1とそのスプライトを初期化するとき

game node 1 class 
    CCSprite* sprite1; // instance variable 
    CCSprite* sprite2; // instance variable 

さて、あなたは適切なスプライトバッチノードにスプライトを追加します。通常、シングルトンのようなシーンにアクセスして、スプライトバッチプロパティにアクセスする必要があります。

sprite1 = [CCSprite spriteWithSpriteFrameName:@"doodle.png"]; 
[[scene sharedScene].batchNode1 addChild:sprite1]; 
sprite2 = [CCSprite spriteWithSpriteFrameName:@"splash.png"]; 
[[scene sharedScene].batchNode2 addChild:sprite2]; 

スプライトは、スプライトバッチノードの子である限り保持する必要はありません。 addChildメソッドはそれを保持します。実際には、それを保持する配列に追加するだけです。また、あなたはまだ "保持"について考えるなら、是非start using ARC

スプライトバッチ内のスプライトにアクセスする方法を理解する必要はありません。これは、ゲームノードクラスのインスタンス変数として利用でき、必要に応じて他のクラスがプロパティとして公開することもできます。

ゲームノードクラスは、スプライトのプロパティの位置付けやその他の変更を含むオブジェクトのすべてのゲームロジックを実行します。ゲームノードクラスで世話をする必要があるのは、スプライトをバッチノードから削除することだけです。そうしないと、漏れが発生する可能性があります。そのためには、クリーンアップメソッドをオーバーライド:

-(void) cleanup 
{ 
    [sprite1 removeFromParentAndCleanup:YES]; 
    sprite1 = nil; 
    [sprite2 removeFromParentAndCleanup:YES]; 
    sprite2 = nil; 

    [super cleanup]; 
} 

nilに変数を設定することが重要ですコードはdeallocメソッド内のコードを含む、クリーンアップ後に実行されているがあるかもしれないので。 deallocでスプライトを削除することもできますが、設定によっては、ゲームノードクラスがまだ保持しているスプライトへの参照のためにdeallocが呼び出されないことさえあります。したがって、スプライトがゲームノードクラス自体の子(または孫)でない場合、クリーンアップメソッドを使用する方が一般的に安全です。

+0

あなたの答えをありがとう。あなたが言っていることを理解している場合、ゲームオブジェクトを追加するには2つのステップがあります:ゲームオブジェクトをシーンのノードとして追加し(ビジュアル表現なし)、ゲームオブジェクトを表示する必要がある視覚表現を追加しますバッチノードまたは単にレイヤー)。 – florian

+0

そしてスプライトバッチノードのCCSpriteにアクセスしたかったのは、x軸に沿って移動させる(または、本体を「接続」する)ためです。多分、これは私がそれをやるべき方法ではありません... – florian

関連する問題