私の質問は、1つのクラスからその子に2つの方向を伝えることについてです。
子GameObjectCCNodeを持つGameLayerCCLayerがあります。GameLayerはセミシングルトンの共有レイヤーです。GameObjectを初期化できるようにするには、GameLayerのヘッダーにGameObject.hをインポートする必要があります。私は今、ゲームレイヤーに通信しようとしていますが、行き詰まっています。コードはすべて、質問があるまで機能します。
static GameLevel1Layer* sharedGameLayer;
+(GameLevel1Layer*) sharedGameLayer
{
    NSAssert(sharedGameLayer != nil, @"shared game layer not there yet");
    return sharedGameLayer;
}
initで、GameObjectを初期化します
-(id) init
{
    if ((self = [super init]))
    {
        sharedGameLayer = self;
    GameObject1* gameObject1 = [GameObject1 gameObject1];
    fish1.position = CGPointMake(0, 0);
    fish1.tag = kFish1TagValue;
    [self addChild:gameObject1 z:10];
    }
return self;
}
ゲームオブジェクト内(ノードですが、基本的にccspriteを初期化します)
+(id) gameObject1{
    return [[self alloc] initWithFish1Image];
    }
-(id) initWithFish1Image {
    if ((self = [super init])) {
        CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
        [frameCache addSpriteFramesWithFile:@"fish1atlas.plist"];
        sceneSpriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"fish1atlas.png"]; 
        [self addChild:sceneSpriteBatchNode z:0]; 
        fish1Sprite = [[CCSprite alloc] initWithSpriteFrameName:@"fish1_normal_1.png"];
        fish1Sprite.tag = kFish1SpriteTag;
        fish1Sprite.rotation = -30;
        [self addChild:fish1Sprite];
        }
    return self;
    }
私の問題は、GameObject内からGameLayer1にメッセージを送信しようとしていることです。GameLayer1.hを含めると、引数が循環し、宣言されていない識別子が混乱します。試してみると:[GameLayer1 sharedGameLayer] methodImTrying]; それは認識されず、宣言されていない識別子を取得します。
追加してみました:@ class GameLayer1; また、GameLayerにメッセージを送信すると、「クラスメッセージは前方宣言です」と失敗します。
[self.parentメソッド]; と[スーパーメソッド]の両方が失敗します。
共有レイヤーを使用すると、ゲームオブジェクトのゲームレイヤーのヘッダーをインポートしなくても、親ノードにアクセスできると思いました。私はこれがObjective-cの基本的な質問であることを知っています、どんな助けもいただければ幸いです。
アップデート:
代わりに、GameLevel1Layer.hをGameObjectのヘッダーにインポートし、@ class GameObjectをGameLayerに追加すると、[GameLevel1LayersharedGameLayer]メソッドを呼び出すことができます。私はこれをすべてかなり間違っているのだろうか。