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つの選択肢について考えました:
適切な (古い) デリゲート アプローチを使用します。各レベルで正しい代理人/委任者の関係を割り当てる。ただし、これは数千行のコードが重複する可能性があることを意味し、私の観点からはきれいではありません
NSNotification (または KVO?) を使用して子レベルからメッセージをブロードキャストし、それに応じて親に応答させます。しかし、これはシステムの不要なオーバーヘッドを意味しますか?
この時点で、私はかなり迷っています。経験豊富なプログラマーが使用する可能性のある一般的なイディオムについて誰か教えてもらえますか?