Цель - C: `self` не отвечает - PullRequest
0 голосов
/ 25 марта 2012

У меня есть слой cocos2d с именем ChoosePlayer, а в методе init я добавляю несколько спрайтов, используя [self addChild:]. Это просто и работает правильно. Но когда я пытаюсь сделать то же самое в другом методе, как указано ниже, он не работает:

-(void) avatarchanged {
    [self addChild:[CCSprite spriteWithFile:@"av1.png"]];
    [self runAction:[CCMoveBy actionWithDuration:1.0 position:ccp(100, 100)]];
    NSLog(@"added new avatar");
}

[self runAction:] также не отвечает. Так что, я думаю, проблема не в спрайте, а в самом self.

Между init и avatarchanged я показываю UIView поверх OpenGL View, выполняю там некоторые действия и возвращаюсь следующим образом:

-(void) selectAvatar {
    CGSize winSize = [CCDirector sharedDirector].winSize;
    flowCoverView = [[[FlowCoverView alloc] initWithFrame: CGRectMake(0, 0, 480, 320)] autorelease];
    flowCoverView.center = ccp(-80 + winSize.width / 2, 80 + winSize.height / 2);
    flowCoverView.delegate = self;
    flowCoverView.transform = CGAffineTransformMakeRotation(90*(3.14/180));

    [[CCDirector sharedDirector].openGLView.window addSubview:flowCoverView];
}

Когда необходимые действия выполняются, flowCoverView удаляется следующим образом:

- (void)flowCover:(FlowCoverView *)view didSelect:(int)cover {
    selectedavat = cover;
    [flowCoverView removeFromSuperview];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"avatarchanged" object:nil];
}

Уведомление, опубликованное выше, использовало мой метод avatarchanged, когда self не отвечает.

Редактировать: вот мой init метод:

-(id) init {
if( (self=[super init])) {
    self.isTouchEnabled = YES;

    BG = [CCSprite spriteWithFile:@"opponent.jpg"];
    BG.scale *= CC_CONTENT_SCALE_FACTOR() * 1;
    BG.position = ccp(240,160);
    [self addChild:BG];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(avatarchanged) name:@"avatarchanged" object:nil];
}
return self;    
}

Примечание: в моем проекте есть несколько глобальных переменных, объявленных с использованием extern, они могут как-то иметь отношение к моей проблеме, но я не уверен.

Может кто-нибудь помочь мне с этим?

Редактировать 2: изменилось avatarchanged следующим образом:

-(void) avatarchanged {
    if (self == nil) {
        NSLog(@"self is nil!!!!!!!!");
    } else {
        NSLog(@"pheww.. its not nil");
    }

    if (self.isRunning) {
        NSLog(@"running");
    } else {
        NSLog(@"not running");
    }

    [BG runAction:[CCRotateBy actionWithDuration:1.0 angle:100.0]];
    [self addChild:[CCSprite spriteWithFile:@"av1.png"]];
    NSLog(@"added new avatar");
    [self runAction:[CCMoveBy actionWithDuration:1.0 position:ccp(100, 100)]];
}

журнал показывает как

2012-03-26 11:16:21.213 Funsip[1550:207] pheww.. its not nil
2012-03-26 11:16:21.214 Funsip[1550:207] running
2012-03-26 11:16:21.224 Funsip[1550:207] added new avatar

runAction BG также не применяется, но выполнение того же метода в init работает идеально.

Редактировать 3: FlowCoverView, который я добавляю, реализуется внутренними вызовами OpenGL. Возможно, это может вызывать конфликты с настройкой состояний OpenGL в cocos2d. Но я не знаю OpenGL, чтобы искать подобные проблемы. Вот ссылка на страницу, где я взял потоковое представление от http://www.chaosinmotion.com/flowcover.html

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Находится ли «self» в рабочем режиме (self.isRunning)?если ничего не произойдет, с точки зрения cocos2d.Режим isRunning достигается, когда вы добавляете экземпляр ChoosePlayer к работающему потомку CCNode.Если вы забыли добавить его в работающий узел, он будет игнорироваться при розыгрышах, действиях и т. Д. ...

1 голос
/ 26 марта 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...