0

Learn Cocos2d 2; を読んでいました。そして、この問題に出くわしました: ゲーム シーンでは、シーン階層の下に何千ものエンティティがあり、これらすべてのエンティティが最上位のシーン オブジェクトと通信したい場合があります。Learn Cocos2d 2 の著者は、このようなグローバル変数を使用することを提案しています

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

+(id) scene
{
    CCScene *scene = [CCScene node];
    GameLayer *layer = [GameLayer node];
    [scene addChild: layer];
    InputLayer* inputLayer = [InputLayer node];
    [scene addChild:inputLayer z:1 tag:GameSceneLayerTagInput];
    return scene;
}

個人的には、このアプローチは信頼できないと思います: プレーヤー エンティティがシーン内の別のレイヤーからのタッチ入力を知りたいと想像してください。そのため、sharedGameLayer を呼び出し、それが実際にそこに存在する親であると想定して、そこから処理します。しかし、どうしてそんなに確実にできるのでしょうか?この sharedGameLayer が他の誰かが割り当てた別のインスタンスである場合はどうなるでしょうか? もちろん、cocos2d では一度に 1 つのシーンしか存在できないため、このアプローチはほとんどの場合問題なく機能します。しかし、デザインの観点からは、そのようなアプローチがまだ欠けていると思います。

私は2つの選択肢について考えました:

  1. 適切な (古い) デリゲート アプローチを使用します。各レベルで正しい代理人/委任者の関係を割り当てる。ただし、これは数千行のコードが重複する可能性があることを意味し、私の観点からはきれいではありません

  2. NSNotification (または KVO?) を使用して子レベルからメッセージをブロードキャストし、それに応じて親に応答させます。しかし、これはシステムの不要なオーバーヘッドを意味しますか?

この時点で、私はかなり迷っています。経験豊富なプログラマーが使用する可能性のある一般的なイディオムについて誰か教えてもらえますか?

4

2 に答える 2

1

私の「階層内の他のノードにアクセスするための戦略」ガイドを読みたいと思うかもしれません。長所と短所から選択できる豊富なオプション。

于 2013-01-23T12:12:36.327 に答える
0

ほとんどの場合、あなたが言及した「プレーヤーエンティティ」などのツリーの葉は、含まれているものがのシーンスタックにあるCCNode限り持続します。このシーンがポップされると、メッセージを受け取り、(its) . これは、あなたの「プレーヤーエンティティ」を含むこれらの子になります。「プレーヤー エンティティ」が受け取る最後のメッセージは、すべての親ノードがまだ生きている間 (破壊の過程ではありますが) であるため、子が無効なノードを要求するケースは決してありません。CCSceneCCDirectordeallocremoveAllChildrendeallocdeallocsharedGameLayer. ただし、子供を別のシーンに持ち越したい場合は、非常に多くの点で細心の注意を払う必要があるため、絶対に必要でない場合は、これを奨励することはほとんどありません. たとえば、コードの特定のブロックを改善して、シーンがアクティブでなくなった場合sharedGameLayerに返されるようにする必要があり、「プレーヤー エンティティ」がこの戻り値を確認する必要がある場合があります。nil

簡単に言うと、シーン スタック内でノードを移動しない限り、上記のコードは安全です。個々のノードがゲームの「グラフ」について学習する方法は多数あります。これにはparent、 everyのプロパティCCNodeや . のrunningSceneプロパティが含まれCCDirectorます。

于 2013-01-23T01:13:34.830 に答える