Obj C在sem-singleton和child两种方式之间进行通信

时间:2012-10-26 02:33:19

标签: iphone ios cocos2d-iphone

我的问题是将一个班级的两个方向传达给孩子。

我有一个带有儿童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;
}

在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 method];和[超级方法]都失败了。

我认为使用共享层可以让我访问父节点,而无需在游戏对象中导入游戏层的标题。我知道这是objective-c的一个基本问题,任何帮助都会受到赞赏。

更新:

如果我将GameLevel1Layer.h导入GameObject的标题并将@class GameObject添加到GameLayer,我可以调用 [GameLevel1Layer sharedGameLayer]方法]; 我想知道我这样做是否完全错了。

3 个答案:

答案 0 :(得分:1)

避免此问题的最简单方法是使用前向声明。

在GameObject1的.h文件中只声明

 @class GameLevel1Layer 

并且在GameObject1.m中包含GameLevel1Layer.h

在GameLevel1Layer的.h文件中声明

 @class  GameObject1

并且在GameLevel1Layer.m中包含GameObject1.h

答案 1 :(得分:0)

您可以使用NSNotificationCenter来回发送和接收消息。

在此处查看此帖子,了解如何发送和接收消息:
Send and receive messages through NSNotificationCenter in Objective-C?

另外,请查看Apple Developer Library的参考资料: http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

答案 2 :(得分:0)

可以与代表一起实施回传。创建一个@protocol并通过GameLayer支持它。创建GameObject时将GameLayer设置为委托。当您需要向GameLayer发送内容时,请致电

[delegate someMethod:withObject];