0

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

Compiler.m - CCLayer - 持有 +(CCScene) 方法并加载所有其他 CCLayer。
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];
}  

这一切都很好,我的层被添加到编译器中,并且编译器的场景被委托访问,如预期的那样。

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

我尝试了许多不同的方法,但我目前决定使用类方法而不是实例方法来定义 CCSprite *background,以便我可以在我的构造层中访问它。
我还尝试使用@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?

4

1 回答 1

1

它可能不起作用,因为您的tempBackiVar 是在编译器层中自动发布的,而您没有保留它。这是您的 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
}
于 2011-04-01T03:39:40.283 回答