开发者

Accessing CCLayer headache!

开发者 https://www.devze.com 2023-02-21 12:10 出处:网络
I\'m having abit of trouble accessing my layers and its driving me insane. Basically, my layer-scene hierachy is as follows:

I'm having abit of trouble accessing my layers and its driving me insane. Basically, my layer-scene hierachy is as follows:

Compiler.m - CCLayer - holds the +(CCScene) method and loads all the other CCLayers.

Construct.m - CCLayer - holds the box2d engine and its components

Background.m - CCLayer - holds the Background.

Hud.m - CCLayer - holds the HUD.

within the Compiler implementation class, I add the Scene and all the relevant nodes to the Compiler CCLayer:

@implementation Compiler


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

    //Add A Background Layer开发者_Go百科.
    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];
}  

This all works fine, my layers are added to the compiler and the compiler's scene is accessed by the delegate as predicted.

My problem is that im trying to access my Background CCLayers - CCsprite *background, inside the Construct layer so that I can move it according to the position of my Construct game hero.

I've tried many different methods, but I've currently decided to use a class method rather than an instance method to define CCSprite *background so that I can access it in my Construct Layer.

I've also tried accessing with @properties and initialising an instance variable of the class.

Here is my Background 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

This works, it loads the image to the background layer.

Then finally, I try to access the background image from the Construct Layer.

@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

This doesnt work, I receive a 'nil' pointer in some respects, tempBack doesnt access the background properly, or at all.

How can I access and modify the Background CCLayers Class Variable +(CCSprite) bk??


It probably doesn't work because your tempBack iVar is autoreleased in compiler layer and you don't retain it. Here's how your init method should look like:

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

Also - don't forget to release it in dealloc. And I am not sure if it will work either since you'll have different background sprite returned by bk class method (try printing temp and tempBack variable addresses and you'll see).

Update for notifications

In background layer, create the sprite and add it to the layer. Then afterwards add this snippet of code to subscribe to notifications:

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

Then in construct layer's update method (or any other scheduled method) send this notification with new player coordinates:

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

Now in background's layer, implement the updateBackground:(NSNotification *)aNotification method:

- (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
}
0

精彩评论

暂无评论...
验证码 换一张
取 消