Доступ к головной боли CCLayer! - PullRequest
0 голосов
/ 01 апреля 2011

У меня немного проблем с доступом к моим слоям, и это сводит меня с ума. По сути, моя иерархия сцен слоя выглядит следующим образом:

Compiler.m - CCLayer - содержит метод + (CCScene) и загружает все остальные CCLayer.
Construct.m - CCLayer - содержит двигатель box2d и его компоненты
Background.m - CCLayer - содержит фон.
Hud.m - CCLayer - держит HUD.

в классе реализации компилятора я добавляю сцену и все соответствующие узлы к 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

Это работает, загружает изображение в фоновый слой.

Затем, наконец, я пытаюсь получить доступ к фоновому изображению из слоя Construct.

@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 Ответ

1 голос
/ 01 апреля 2011

Это, вероятно, не работает, потому что ваш tempBack iVar автоматически выпущен на уровне компилятора, и вы его не сохраняете.Вот как должен выглядеть ваш метод init:

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

Кроме того, не забудьте release указать его в dealloc.И я не уверен, что это будет работать, так как у вас будет другой фоновый спрайт, возвращаемый методом класса bk (попробуйте напечатать переменные адреса temp и tempBack, и вы увидите).

Обновление для уведомлений

В фоновом слое создайте спрайт и добавьте его в слой.Затем добавьте этот фрагмент кода для подписки на уведомления:

[[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
}
...