0

なぜこれが起こっているのか、私は自分の仕事の生涯を理解することはできません。私は CCLayer から派生したクラスを持っています。クラスを初期化するときに、そのようにメソッド呼び出しをスケジュールしています

//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;

}

それでも、プログラムを実行すると、コンソールステートメントは、条件がクールダウンごとに2回渡されていることを示しています

012-06-29 09:52:57.667 テスト ゲーム[5193:707] アイドル アニメーションの再生

2012-06-29 09:52:57.701 テスト ゲーム[5193:707] アイドル アニメーションの再生

2012-06-29 09:53:05.750 テスト ゲーム[5193:707] アイドル アニメーションの再生

2012-06-29 09:53:05.851 テスト ゲーム[5193:707] アイドル アニメーションの再生

アイドル アニメーションの再生が終了したときにゲームがクラッシュするバグを修正しようとしていますが、これが何らかの原因であると確信しています。

4

1 に答える 1

0

セレクターのスケジュールを解除している場所がわかりません。フレームが開始されるたびに呼び出されるのは通常の動作であり、レイヤーの割り当てが解除されるまでにフレームが必要なため、2回トリガーされることがわかります。

1回限りのメソッド呼び出しが必要な場合は、次のようにします。

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

    // rest of the code here
}

Cocos2d 2.0には、代わりに使用できるscheduleOnceメソッドがあります。

于 2012-06-29T11:18:22.273 に答える