Доступ к CCLayer головная боль!

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

Compiler.m — CCLayer — содержит метод +(CCScene) и загружает все остальные CCLayers.
Construct.m — CCLayer — содержит движок box2d и его компоненты
Background.m — CCLayer — содержит фон.< br> 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 * background внутри слоя Construct, чтобы я мог перемещать его в соответствии с положением моего игрового героя 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

Это не работает, в некоторых отношениях я получаю нулевой указатель, tempBack не получает доступ к фону должным образом или вообще не обращается к фону.

Как я могу получить доступ и изменить переменную класса Background CCLayers +(CCSprite) bk??


person Ospho    schedule 01.04.2011    source источник


Ответы (1)


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

-(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
}
person Eimantas    schedule 01.04.2011
comment
Нет, это не сработало. Как я могу получить доступ к этой переменной метода класса и изменить ее с другого уровня? Сводит меня с ума :( - person Ospho; 01.04.2011
comment
Как насчет отправки уведомлений с указанием позиции игрока и прослушивания их в фоновом режиме? - person Eimantas; 01.04.2011
comment
Эймантас, это может сработать. Как я могу это сделать и не могли бы вы опубликовать небольшой фрагмент кода? Спасибо друг - person Ospho; 01.04.2011