0

我在 cocos2d iPhone 游戏中使用了 CCSpeed 动作。但是总是崩溃。

CCAnimation* animation = nil;
animation = [[CCAnimationCache sharedAnimationCache]  animationByName:ATTACK_ANIM];

if(animation)
{
    CCAnimate *animAction  = [CCAnimate actionWithAnimation:animation];

    id speed = [CCSpeed actionWithAction:animAction speed:0.13f];
    id calBlock = [CCCallBlock actionWithBlock:^{
                                                    //[self updateState:kTileState_Idle];
                                                }];
    CCSequence *sequence = [CCSequence actions:speed, calBlock, nil];        
    [self runAction:sequence];
}

但下面的代码工作正常..但无法改变动画速度。上面的代码有什么问题?

    CCAnimation* animation = nil;
    animation = [[CCAnimationCache sharedAnimationCache]  animationByName:quakeAnim];

    if(animation)
    {
        CCAnimate *animAction  = [CCAnimate actionWithAnimation:animation];
        id calBlock = [CCCallBlock actionWithBlock:^{
                                                        //[self updateState:kTileState_Idle];
                                                    }];
        CCSequence *sequence = [CCSequence actions:animAction, calBlock, nil];        
        [self runAction:sequence];
    }

这是另一个线程。但没有提供代码解决方案。

4

2 回答 2

1

您不能将 animation.delayPerUnit 设置为某个合适的值来改变其执行速度吗?我通常在每次使用它之前计算该数字......因此我不需要在将动画放入缓存之前保留我设置的初始“delayPerUnit”。

float totalAnimationTime = kSomeDesiredValue; // game logic dictates this, as well as
                                              // rendering requirements (too slow will be perceived)
animation.delayPerUnit = totalAnimationTime/animation.totalDelayUnits;

// totalDelayUnits is a property of the animation, usually equal to the number
// of frames.
于 2013-03-06T15:36:04.383 回答
1

你这样做是错的。;)

CCSpeed 不能按顺序使用。您仍然需要将 animAction 添加到序列中,但保留对 CCSpeed 动作 (ivar) 的引用。然后,每当您想更改动画速度时,请更改 CCSpeed 实例的 speed 属性。

使用 CCSped 需要您适当地管理序列的内存和 CCSpeed。

于 2013-03-06T20:28:34.990 回答