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