Cocos2d: Запланируйте, что методы не отвечают после вызова replacecescene во ВТОРОЕ время - PullRequest
0 голосов
/ 09 февраля 2012

Первый метод "StartGame:" в Menu.h запущен, игра работает безукоризненно.

Однако во время воспроизведения, если пользователь возвращается в Меню - я использую

[[CCDirector sharedDirector]replaceScene:[Menu scene]];

, все типы анимации зависают и функции расписания не отвечают.

Какого черта происходит?

Ответы [ 3 ]

2 голосов
/ 29 августа 2012

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

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

Чтобы обойти это, мне пришлось либо переделать дизайн, чтобы сцены всегда создавались заново каждый раз, когда происходит переход, либо добавить твик в CCDirector:

-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup

На данный момент я добавил в CCDirector.replaceScene переопределение, которое принимает параметр очистки (аналогично другим сообщениям removeAndCleanup). Это позволяет соответствующему приложению сохранять сцены, когда оно хочет, без их очистки, когда приложение не хочет их очищать.

Реализация для этого:

-(void) replaceScene: (CCScene*) scene
{
    [self replaceScene:scene andCleanup:YES];
}

-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup
{
    NSAssert( scene != nil, @"Argument must be non-nil");

    NSUInteger index = [scenesStack_ count];

    sendCleanupToScene_ = andCleanup;
    [scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
    nextScene_ = scene; // nextScene_ is a weak ref
}

Если кто-то думает, что это глупый путь, пожалуйста, дайте мне знать.

2 голосов
/ 10 февраля 2012

Заменяли ли вы какой-либо из этих методов?

 -(void) onEnter;
 -(void) onEnterTransitionDidFinish;
 -(void) onExit;
 -(void) cleanup;

Если это так, убедитесь, что вы вызываете супер реализацию (т. Е. [super onEnter];) внутри каждого метода, в противном случае могут возникнуть всевозможные странные вещи.

0 голосов
/ 19 августа 2014

У меня тоже была проблема (в v3.1.1), и я не переопределяю ни один из обработчиков onEvent, поэтому вызов super (как предлагает @ LearnCocos2D) здесь не применим.

Я нашел решение, хотя. Вызов функции возобновления работы директора до или после вызова replaceScene устраняет проблему для меня.

[[CCDirector sharedDirector] replaceScene:scene];
[[CCDirector sharedDirector] resume];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...