运行新动作时,我曾经使用过stopAllActions。我注意到使用CCTintBy操作时会出现一些问题,因为逐渐添加了颜色并且未调用(停止时)调用了“反向”(请参见CCTintBy中的(CCActionInterval *)反向功能)。

这使我对我目前的方法和对CCActions的理解感到疑惑。

例如。每当运行新动作时,我都会调用[self stopAllActions],但这与CCTintBy动作的使用并不相称(它确实也停止了该动作,并使精灵保留了一半的颜色,并且原色会变为相反的颜色)函数不会因为被stopAllActions停止而被调用)。

在我的项目中,我将为您提供最常见的操作。我在想而不是调用stopAllActions,而仅在特定动作尚未运行时才调用该动作。这是个好习惯吗?

 -(void) runExplosionAnimation
 {
[self stopAllActions];
//here should verify if the action is not already running and if so stop it
//To do so I should have a member variable like: CCAction * explosionAnim = [CCSequence actions: [CCAnimate actionWithDuration:0.4f animation:anim restoreOriginalFrame:false],  [CCHide action],  nil];
//Plus a boolean to distinguish if it is already running..

CCAnimation* anim = [[CCAnimationCache sharedAnimationCache] animationByName:@"bbb"];
if(anim!=nil){
    [self runAction:[CCSequence actions: [CCAnimate actionWithDuration:0.4f animation:anim restoreOriginalFrame:false],  [CCHide action],  nil]];
}
else{
    [self loadSharedAnimationIfNeeded];
}
}


使用布尔值确定CCTintBy操作是否仍在运行的一种方法是在再次调用CCTintBy操作之前,手动恢复原始颜色。

-(void) gotHitWithFactor:(int)factor
    {
[self runGotHitAnimation];

self.hitPoints -= factor * 1;
if (self.hitPoints <= 0)
{
    isAlive=false;
    [self runExplosionAnimation]; //Will also set enemy visibility to false
}
 }

-(void) runGotHitAnimation
{
    //hitAction is initialized as [CCTintBy actionWithDuration:0.1f red:100 green:100 blue:111];

    [self stopAction:hitAction];
    self.color = originalColour; //Where originalcolour is initialized as self.colour
    [self runAction:hitAction];
}

最佳答案

您知道您可以标记动作,对吗?

CCNode类具有以下方法:

stopActionByTag:
getActionByTag:


如果您运行新操作,则只需告诉每种情况下需要停止的其他操作。对于复杂的操作,我建议将您的操作按逻辑分为两组:游戏性和视觉性。

游戏性动作是影响游戏性的所有动作,例如运动。视觉就是视觉效果,例如倾斜,旋转,着色。这种区别的意义在于,它使对操作进行优先级排序变得更加容易。主要地,视觉动作绝不能停止,运行或以其他方式影响游戏动作。

关于ios - Cocos2d:处理 Action ,动画, Action 序列和CCTintBy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13902291/

10-10 19:19