1

私の質問は、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]メソッドを呼び出すことができます。私はこれをすべてかなり間違っているのだろうか。

4

3 に答える 3

1

この問題を回避する最も簡単な方法は、前方宣言を使用することです。

GameObject1の.hファイルで宣言するだけです

 @class GameLevel1Layer 

GameObject1.mにはGameLevel1Layer.hが含まれます

GameLevel1Layerの.hファイルで宣言するだけです

 @class  GameObject1

GameLevel1Layer.mにはGameObject1.hが含まれます

于 2012-10-26T19:11:40.803 に答える
0

を使用NSNotificationCenterして、メッセージを送受信できます。

メッセージを送受信する方法を示すこの投稿をここで確認してください:
Objective-CのNSNotificationCenterを介してメッセージを送受信しますか?

また、Apple Developer Libraryからのリファレンスを確認してください:http: //developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

于 2012-10-26T04:31:19.550 に答える
0

コミュニケートバックは、デリゲートを使用して実装できます。@protocolを作成し、GameLayerでサポートします。GameObjectを作成するときは、GameLayerをデリゲートとして設定します。GameLayerに何かを送信する必要がある場合は、

[delegate someMethod:withObject];
于 2012-10-26T19:05:16.010 に答える