访问CCLayer头痛!

时间:2011-04-01 00:04:01

标签: objective-c xcode cocos2d-iphone objective-c++ class-hierarchy

我在访问我的图层时遇到了麻烦,并且让我疯狂。基本上,我的图层场景层次结构如下:

Compiler.m - CCLayer - 保存+(CCScene)方法并加载所有其他CCLayers。
Construct.m - CCLayer - 持有box2d引擎及其组件
Background.m - CCLayer - 持有背景。
Hud.m - CCLayer - 持有HUD。

在Compiler实现类中,我将Scene和所有相关节点添加到Compiler CCLayer中:

@implementation Compiler


+(CCScene *) scene{
    Compiler *compiler = [CompileLayer node];
    CCScene *scene = [CCScene node];
    [scene addChild: compiler];

    //Add A Background Layer.
    Background *layerBackground = [Background node];
    layerBackground.position = CGPointMake(100,100);
    [compiler addChild: layerBackground z: -1 tag:kBackground];


    //Add The Construct.
    Construct *construct = [Construct node];
    [compiler addChild: construct z: 1];

    //Add A Foreground Layer Z: 2
    //After background is working.

    //Add the HUD
    HudLayer *hud = [Hud node];
        [compiler addChild: hud z:3];
}  

这一切都运行正常,我的图层被添加到编译器中,代理人按预测访问编译器的场景。

我的问题是我试图访问我的背景CCLayers - CCsprite *背景,在Construct层内,以便我可以根据我的Construct游戏英雄的位置移动它。

我尝试了很多不同的方法,但我现在决定使用类方法而不是实例方法来定义CCSprite *背景,以便我可以在构造层中访问它。
我也尝试使用@properties访问并初始化类的实例变量。

这是我的背景CCLayer:

@implementation Background
-(id) init
{
    self = [super init];
    if (self != nil)
    {
        CCSprite *temp = [Background bk];
        [self addChild:temp z:0 tag:kBackGround];
    }
    return self;

}

+(CCSprite *)bk{
    //load the image files
    CCSprite *background = [CCSprite spriteWithFile:@"background.jpg"];

    //get the current screen dimensions
    //CGSize size = [[CCDirector sharedDirector] winSize];
    background.anchorPoint = CGPointMake(0,0);
    background.position = ccp(0,0);
    return background;
}
@end

这很有效,它将图像加载到背景图层。

最后,我尝试从构造层访问背景图像。

@interface Construct : CCLayer{
     CCSprite *tempBack;
}
@end

@implementation Construct

-(id) init{
     tempBack = [Background bk]; //The background equals an instance variable
}

-(void) tick:(ccTime)dt {
     tempBack.position.x ++; // To do Something here.
     tempBack.opacity = 0.5; // Some more stuff here. 

}
@end

这不起作用,我在某些方面收到'nil'指针,tempBack无法正确访问背景,或者根本没有。

如何访问和修改后台CCLayers类变量+(CCSprite)bk ??

1 个答案:

答案 0 :(得分:1)

它可能不起作用,因为您的tempBack iVar在编译器层中自动释放,而您不保留它。以下是init方法的样子:

-(id) init{
     tempBack = [[Background bk] retain]; //The background equals an instance variable
}

另外 - 不要忘了release在dealloc中。而且我不确定它是否会起作用,因为你将通过bk类方法返回不同的背景精灵(尝试打印temptempBack变量地址,你会看到)。

通知更新

在背景图层中,创建精灵并将其添加到图层。然后添加此代码片段以订阅通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateBackground:) name:@"PlayerChangedPosition" object:nil];

然后在构造层的update方法(或任何其他预定方法)中,使用新的玩家坐标发送此通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"PlayerChangedPosition" object:player];

现在在后台的图层中,实现updateBackground:(NSNotification *)aNotification方法:

- (void)updateBackground:(NSNotification *)aNotification {
    // object message returns player object passed when posting notification
    CGPoint newCoords = [[aNotification object] position];
    // adjust background position according to player position
}