我的问题是将一个班级的两个方向传达给孩子。
我有一个带有儿童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]方法]; 我想知道我这样做是否完全错了。
答案 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];