Замена сцены и остановка всех анимаций и звуков - PullRequest
0 голосов
/ 28 февраля 2011

У меня есть кнопка «Домой» на моей сцене, которая при нажатии переходит в главное меню.Я использую replaceScene, чтобы заменить текущую сцену (игровую сцену) сценой HomeMenu.По какой-то причине действия и звуки, которые происходят на игровой сцене, не останавливаются, когда я заменяю сцену.Я попробовал следующий код, но все же, находясь в главном меню, я слышу действия и звуки игры на игровой сцене.

// при срабатывании главного меню!- (void) homeMenuClicked: (CCMenuItem *) item {NSLog (@ "home menu clicked!");

CCScene * scene = [[CCDirector sharedDirector] runningScene];[scene stopAllActions];

[self.layer stopAllActions];

[self unloadSoundEffects];

[[CCDirector sharedDirector] replaceScene: [CCSlideInLTransition transitionWithDuration: 1.0 scene: [HomeScene scene]]];

}

Я также должен добавить, что в игровом слое также есть объект таймера (NSTimer), который запускается через 2 секунды или около того.

ОБНОВЛЕНИЕ 2:

Позвольте мне опубликовать код!Я думаю, что проблема заключается в том, что когда игрок угадывает правильный ответ, вызывается следующий метод:

[self updateForCorrectAnswer];

Внутри updateForCorrectAnswer У меня есть спектакль PerforSelector, который планируется запустить через 6-7 секунд.Я считаю, что PerforSelector является виновником.Если каким-то образом я могу остановить это от увольнения, то, я думаю, у меня все будет хорошо.

    [self performSelector:@selector(refreshScore) withObject:nil afterDelay:7.0]; 

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Не следует использовать NSTimer в качестве документов cocos2d.

/* call scheduleUpdate in initializing */
[self scheduleUpdate];

Он планирует обновление: метод, который будет вызываться каждый кадр, когда этот узел находится на сцене.

- (void)update:(ccTime)dt
{
    /* This method is automatically called every frame. */
}

scheduleUpdateWithPriority:, расписание: интервал: также доступны.

И почему бы вам не использовать подобное вместо executeSelector: withObject: afterDelay.

[self runAction:[CCSequence actions:[CCDelayTime actionWithDuration:7], [CCCallFunc actionWithTarget:self selector:@selector(refreshScore)], nil]];
0 голосов
/ 03 марта 2011

Если вы используете этот метод «[self executeSelector: withObject: afterDelay:]», cocos2d не будет управлять им в этом цикле выполнения. Вы должны использовать его вместо предыдущего:

[self schedule:interval:];

Затем в вашем методе "homeMenuClicked:" просто вызовите это:

[self.layer unschedule:@selector(refreshScore)];

Я не пробовал, но думаю, что будет лучше.

Дополнительную информацию вы можете найти в документации здесь .

...