2012-06-29 2 views
0

Я не могу на всю жизнь разобраться, почему это происходит. У меня есть класс, полученный из CCLayer. Я запланировав вызов метода как и при инициализации классаСостояние таймера передается дважды, с использованием cocos2d scheduler

//create an update method for keeping track of how long its been since an animation has played 
    [self schedule:@selector(playIdleAnimation:)]; 

И метод

//an update method that will play an idle animation after a random period of idleness 
-(void) playIdleAnimation:(ccTime) dt { 

//if the user isn't playing an animation, increment the time since last animation variable 
if ([bodySprite numberOfRunningActions] == 0) { 

    timeSinceLastAnimation += (float)dt; 

    //now check to see if we have surpassed the time set to cause an idle animation 
    if (timeSinceLastAnimation > (arc4random() %14) + 8) { 

     //reset the cooldown timer 
     timeSinceLastAnimation = 0; 

     [bodySprite stopAllActions]; 

     //play the idle animation 
     //[bodySprite runAction:[CCAnimate actionWithAnimation:waitAnimation restoreOriginalFrame:NO]]; 

     NSLog(@"PLAYING IDLE ANIMATION"); 
       } 
} 
//player is currently playing animation so reset the time since last animation 
else 
    timeSinceLastAnimation = 0; 

} 

Но все же, когда я иду, чтобы запустить программу заявление консоли показывает состояние передается в два раза каждый перезарядка

012-06-29 09: 52: 57,667 Test Game [5193: 707] ИГРА IDLE АНИМАЦИЯ

2012-06-29 09: 52: 57,701 Test Game [5193: 707] ИГРА IDLE АНИМАЦИЯ

2012-06-29 09: 53: 05,750 Test Game [5193: 707] ИГРА IDLE АНИМАЦИЯ

2012-06-29 09: 53: 05,851 Test Game [5193: 707] ИГРА IDLE АНИМАЦИЮ

Я пытаюсь исправить ошибку, в которой игра заканчивается, когда я заканчиваю игру бездействующей анимации, и я уверен, что это имеет какое-то отношение к ней.

ответ

0

Я не вижу, где вы планируете селектор. Готов поспорить, что это обычное поведение, которое нужно вызвать когда-либо кадровые удары, и вы видите, что его запускают дважды, потому что он принимает фрейм для освобождения слоя.

Если вы хотите вызов метода одноразового, сделайте следующее:

-(void) playIdleAnimation:(ccTime) dt { 
    [self unschedule:_cmd]; 

    // rest of the code here 
} 

Cocos2d 2,0 имеет метод ScheduleOnce, который можно использовать вместо этого.

+0

Спасибо за помощь, но незапланирование не помогло. Мне удалось решить проблему, указав интервал расписания на каждые 0,5 секунды. Остается загадкой, почему его зовут дважды. Возможно, запланированные методы работают по потоку? – user819640