我在运行新动作时曾经 stopAllActions 。我注意到使用 CCTintBy 操作时会出现一些问题,因为颜色会逐渐添加,并且调用"反向" (参见CCTint,(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];
}
答案 0 :(得分:1)
你知道你可以标记行动,对吧?
CCNode类具有以下方法:
stopActionByTag:
getActionByTag:
如果您运行新操作,则只需要告知在每种特定情况下需要停止哪些其他操作。对于复杂的动作用法,我建议将您的操作逻辑分为两组:游戏玩法和视觉游戏。
游戏动作是影响游戏玩法的所有动作,例如移动。视觉效果就是视觉效果,如倾斜,旋转,着色。这种区别的关键在于它可以更容易地确定行动的优先顺序。主要是,视觉动作不应该停止,运行或以其他方式影响游戏动作。