3

シンプルなゲームでは、キャラクターは約 15 フレームの歩行アニメーションを持っています。加速度計に基づいて、どちらの方向の速度も変化します。それに応じてアニメーションの速度を上げたり下げたりしたかったのです。アニメーションが初期化されると、遅延速度を変更することはできず、代わりに新しいアニメーションを作成する必要があることに気付きました。しかし、速度はほぼ常に変化するため、アニメーションをリセットし続けると、常に同じフレームでスタックしてしまいます。

アニメーションが現在どのフレームにあるかを見つけて停止し、同じフレームで新しいアニメーションを作成しますが、最後のアニメーションが終了した時点から開始する方法はありますか?

そうでなければ、動的に変化するアニメーションの遅延時間をどのように実装することができるかについて、誰か考えがありますか?

編集:

Learn Cocos2d 2 の例から、CCSpeed を使用してこれを実行しようとしました。コードは次のとおりです。

CCRepeatForever *walkLeftRepeat = [CCRepeatForever actionWithAction:[CCAnimation animationWithSpriteFrames:walkLeftFrames]];

self.walkLeft = [CCSpeed actionWithAction:walkLeftRepeat speed:animationWalkingSpeed];

次の警告が表示されます: 'CCRepeatForever *' をタイプ 'CCActionInterval *' のパラメーターに送信する互換性のないポインター タイプ

これが私がフォローしている例です:

CCRepeatForever* repeat = [CCRepeatForever actionWithAction:rotateBy];
CCSpeed* speedAction = [CCSpeed actionWithAction:repeat speed:0.5f];

2番目の編集:

それから私はこれを試しました:

CCAnimation *walkLeftRepeat = [CCAnimation animationWithSpriteFrames:walkLeftFrames];
CCAnimate *temp = [CCAnimate actionWithAnimation:walkLeftRepeat];
CCAnimate*temp2 = [CCRepeatForever actionWithAction:temp];
self.walkLeft = [CCSpeed actionWithAction:temp2 speed:animationWalkingSpeed];
[_guy runAction:_walkLeft];

最終編集。この表示されない問題は、ccanimation に遅延を追加することで修正されました。

これによりエラーは発生しませんが、何も起こりません。ありがとう!

4

3 に答える 3

5

アニメーションを再作成する必要はありません。内部アクションとして CCAnimate アクションとともに CCSpeed アクションを使用します。次に、CCSpeed アクションの速度プロパティを変更して、アニメーションの速度を上げたり下げたりできます。

別の方法は、自分でフレームを進めることです。スケジュールされた更新と、次のフレームにいつ変更するかを知らせるタイマーが必要なだけです。フレームごとにタイマーに追加する量を変更するだけで、アニメーションの速度を上げたり下げたりできます。タイマーが特定の値よりも大きい場合は、フレームを変更してタイマーを 0 にリセットします。

于 2013-01-10T12:41:40.990 に答える
1

Cocos2d ゲームでそれを行うことができます:

-(void)preLoadAnim
{
     CCAnimation* animation = nil;
    animation = [[CCAnimationCache sharedAnimationCache]  animationByName:@"ANIMATION_HERO"];

    if(!animation)
    {
        CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache];

        NSMutableArray *animFrames = [NSMutableArray array];

        for( int i=1;i<=4;i++)
        {
            CCSpriteFrame *frame = [cache spriteFrameByName:[NSString stringWithFormat:@"HeroRun_%d.png",i]];
            [animFrames addObject:frame];
        }

        animation = [CCAnimation animationWithSpriteFrames:animFrames];

        animation.delayPerUnit = 0.5f; 
        animation.restoreOriginalFrame = NO;

        [[CCAnimationCache sharedAnimationCache] addAnimation:animation name:animName];
    }
}

-(void)runHeroSlowMode
{
     CCAnimation* animation = nil;
    animation = [[CCAnimationCache sharedAnimationCache]  animationByName:@"ANIMATION_HERO"];

    animation.delayPerUnit = 1.0f; 

    CCAnimate *animAction  = [CCAnimate actionWithAnimation:animation];
    CCRepeatForever *runningAnim  = [CCRepeatForever actionWithAction:animAction];
    runningAnim.tag = kTagHeroRunAction;

    [self stopActionByTag: kTagHeroRunAction];

    [heroSprite runAction:runningAnim];

}


-(void)runHeroFastMode
{
     CCAnimation* animation = nil;
    animation = [[CCAnimationCache sharedAnimationCache]  animationByName:@"ANIMATION_HERO"];

    animation.delayPerUnit = 0.1f; 

    CCAnimate *animAction  = [CCAnimate actionWithAnimation:animation];
    CCRepeatForever *runningAnim  = [CCRepeatForever actionWithAction:animAction];
    runningAnim.tag = kTagHeroRunAction;

    [self stopActionByTag: kTagHeroRunAction];
    [heroSprite runAction:runningAnim];

}
于 2013-01-10T07:06:42.143 に答える
0

私も同じ問題に直面していました。私のゲームでは、何かを集めるたびに速度が上がります。その時点で、現在のフレームでアニメーションを一時停止し、遅延時間を変更してから再開しました....今は機能しています

于 2015-04-07T09:15:53.990 に答える