cocos2d使用CCSpeed动态更改动画速度

时间:2013-01-10 05:06:27

标签: iphone animation cocos2d-iphone

在简单的游戏中,角色的步行动画大约为15帧。基于加速度计的速度在任一方向上都会发生变化。我希望动画相应地加速或减速。我意识到,一旦动画初始化,你就无法改变延迟速度,而是需要创建一个新的动画。但由于速度几乎不断变化,如果我继续重新设置动画,它将始终停留在同一帧上。

有没有办法找到动画当前所在的帧,停止它,然后使用相同的帧创建一个新动画,但从最后一个动画结束开始?

否则,是否有人知道如何实现动态变化的动画延迟时间?

编辑:

我尝试使用CCSpeed从Learn Cocos2d 2中的示例执行此操作。以下是代码:

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

第二次编辑:

然后我尝试了这个:

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中添加延迟来解决这个没有出现的问题。

这不会给出任何错误,但没有任何反应。 谢谢!

3 个答案:

答案 0 :(得分:5)

无需重新创建动画。使用CCSpeed操作将CCAnimate操作作为其内部操作。然后,您可以修改CCSpeed操作的速度属性以加快或减慢动画。

另一种方法是自己推进框架。这很容易做到,你只需要一个预定的更新和一个定时器,告诉你何时切换到下一帧。只需更改每帧添加到计时器的数量,即可加快或减慢动画速度。如果计时器是>比特定值更改帧并将计时器重置为0.

答案 1 :(得分:1)

你可以在Cocos2d Game中做到:

-(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];

}

答案 2 :(得分:0)

我也遇到了同样的问题。在我的游戏中,每当我收集一些东那时我暂停了当前帧的动画,改变了它的延迟时间,然后又恢复了......现在正在工作