Странное поведение - доступ к методу внешнего экземпляра - PullRequest
0 голосов
/ 20 апреля 2011

Привет еще раз,
В основном у меня есть два класса: HudLayer и ConstructLayer.

Я хочу получить доступ к методу внутри HudLayer из ConstructLayer, чтобы отключить / включить свойства видимости CCSprites, выделенных внутри HudLayer.

Интерфейс и реализация HudLayer:

HudLayer : CCLayer
@interface{
CCSprite *leftArrow;
CCSprite *rightArrow;
}
-(void)switcher:(BOOL)isVisible;
@end

@implementation
-(id)init{
//Create the Hud Sprites and add them at an arbitrary location

     leftArrow = [[[CCSprite alloc]init]retain];
     leftArrow = [CCSprite imageWithFile:@"file.png"];
     rightArrow = [[[CCSprite alloc]init]retain];
     rightArrow = [CCSprite imageWithFile:@"file.png"];

     leftArrow.visible = NO;
     rightArrow.visible = NO;

     [self addChild: leftArrow];
     [self addChild: rightArrow];
}

-(void)switcher:(BOOL)isVisible{
 NSLog (@"Accessed the visibility switcher");
    if (isVisible == NO){
         leftArrow.visible = NO;
         rightArrow.visible = NO;
    }

    if (isVisible == YES){
         leftArrow.visible = YES;
          rightArrow.visible = YES;
    }

@end

Реализация уровня построения:

#import "HudLayer"  
@implementation ConstructLayer

-(void)someFunction{

  //Attempt to change the visibility of leftArrow and rightArrow

    HudLayer *hud = [[HudLayer alloc]init];
    [hud switcher: NO];
    [hud release];

}

Это должно работать, не так ли? Но это не так!
Я получаю доступ к методу [hud switcher:], но по какой-то причине он неправильно устанавливает свойство CCSprite.visibility.
Я помещаю заявление NSLog, которое печатает в моей консоли, доказывая, что оно обращается к нему. Это действительно странно, я не знаю, что с ним происходит. Я даже определил переменные внутри этой функции и напечатал их с помощью NSLog, и это сработало ...

1 Ответ

0 голосов
/ 20 апреля 2011

Это всего лишь предположение, поскольку у меня нет опыта работы с cocos2d, но в любом случае ...

Я думаю, что эта часть протекает очень плохо.Вы выделили (оставьте счет = 1), затем сохранили (оставьте счет = 2), затем полностью проигнорировали этот объект и указали свой вар другому.

 leftArrow = [[[CCSprite alloc]init]retain];
 leftArrow = [CCSprite imageWithFile:@"file.png"];
 rightArrow = [[[CCSprite alloc]init]retain];
 rightArrow = [CCSprite imageWithFile:@"file.png"];

Я полагаю, вы не видитеспрайт исчезнет.Из-за того, что вы сделали выше, вы, возможно, на самом деле устанавливаете видимые свойства правильно, но, поскольку вы создали два объекта leftArrow и два rightArrow, вы можете просто увидеть другой объект (тот, который был выделен, инициирован иretain'ed, на который нет указателей).

Кроме того, imageWithFile может возвращать автоматически выпущенный объект, вы должны посмотреть на это.

Редактировать (для моего второго комментария ниже):

Заменить

 leftArrow = [[[CCSprite alloc]init]retain];
 leftArrow = [CCSprite imageWithFile:@"file.png"];
 rightArrow = [[[CCSprite alloc]init]retain];
 rightArrow = [CCSprite imageWithFile:@"file.png"];

на

 leftArrow = [[CCSprite imageWithFile:@"file.png"] retain];
 rightArrow = [[CCSprite imageWithFile:@"file.png"] retain];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...