1

我的问题是关于从一个班级向其孩子传达两个方向。

我有一个带有子 GameObject CCNode 的 GameLayer CCLayer。GameLayer 是一个半单例共享层。我需要在 GameLayer 的标题中导入 GameObject.h 才能初始化 GameObject。我现在正试图与游戏玩家沟通,但我被卡住了。代码在问题之前都有效。

static GameLevel1Layer* sharedGameLayer;

+(GameLevel1Layer*) sharedGameLayer
{
    NSAssert(sharedGameLayer != nil, @"shared game layer not there yet");
    return sharedGameLayer;
}

在初始化时,我初始化游戏对象

-(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,我可以调用 [GameLevel1Layer sharedGameLayer] 方法];我想知道我这样做是否完全错误。

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 回答