如何在cocos2d-x中切换精灵animation?

我有一个“GameCharacter”类,在游戏中我有一个主角的精灵,我正确加载了框架和animation。 我可以在单个触摸或滑动手势之间切换animation。 现在我可以在animation之间旋转。

在我的场景中,我有这样的触摸function:

_mychar->RunAnimation(id); 

其中id是animation的ID,只是一个整数,我随着每一次触摸而改变。

该方法是这样工作的:

 void GameCharacter::RunAnimation(int a){ _sprite->stopAllActions(); if(a<_animation.size() && a>=0){ _sprite->runAction( CCRepeatForever::create(_animation[a])); } } 

_animation[]只是一个带有CCAnimate*对象的vector(当我销毁GameCharacter的时候我会释放它们)。

我有2个空闲的animation,我想随机切换它们,例如,我想“排队”第一次animation3到5次,第二次1到2次,并重复这样的永远…也,我想通过触摸使这个角色运行另一个animation直到它结束(例如一个跳转animation),当它结束时,就可以中断这个“无限的随机空闲animation”。 我不知道如果我解释得好,我希望你能理解我。

animation的ID是:

  • 0-idle1(3帧)
  • 1-空闲2(6帧)
  • 2跳(12帧)
  • 3步行(12帧)

现在,我只需要能够在空闲状态(animation0和1之间的随机时间)中获得角色,并且只要触摸,跳转animation就完成一次,最后再次空闲开始。

稍后我会解决步行animation。

提前致谢!

Solutions Collecting From Web of "如何在cocos2d-x中切换精灵animation?"

首先,我需要通知你,我的答案需要对RunAnimation()中的方法进行一些细微的修改,以便能够让这个答案起作用。

就个人而言,我不建议您使用该版本的RunAnimation()函数,因为它始终以CCRepeatForever方式执行代码。 我的答案可以适用于你的情况,稍微修​​改你的RunAnimation()。 我建议你caching所有的animation ,并加载/创建角色阶段的行动 ,然后当你需要播放它们,你在不同的function,即播放它。 walk(),idle()。 以后我们可以结合使用它们。

请注意,我的意思是animation和动作。 这将有利于更复杂的animation处理,类似于后来的beat'em up游戏的组合系统。 它更干净。 总而言之,如果我们需要覆盖所有的案例并正确地处理问题,那么这个问题就非常复杂,你会在下面的Ideas部分看到为什么。

基本上你必须利用CCRepeat和CCSequence来创建一个用于运行animation的组合动作。 一如既往,让CCRepeatForever远离其他CCActions上下文。 它不应该混在一起。 我总是把CCRepeatForever作为一个特殊情况(特殊照顾),我需要注意。

第一个问题

关于播放第一个空闲animation的3-5倍,然后是第二个空闲animation的1-2倍,然后无限循环他们,你可以使用类似的代码来做到这一点,如下所示。

 CCAction *_cached_idleAction = CCRepeatForever::create(CCSequence::createWithTwoActions(CCRepeat::create(_cached_idle_anim_1, 5), CCRepeat::create(_cached_idle_anim_2, 3))); 

然后你使用

 _cached_idleAction 

variables在你的空闲()函数。

 void GameCharacter::idle() { stopAllActions(); runAction(_cached_idleAction); } 

第二个问题

关于跳转和漫游animation后运行空闲animation,这涉及到某种跟踪方法。 因为我们不应该把CCRepeatForever与其他CCAction混合在一起(要清楚它不会与CCSequence混合和匹配,所以尽量避免结合这两个)。

解决scheme是你创建一个单独的函数来播放像下面这样的空闲animation。

 void GameCharacter::followUpAction(){ // simple case idle(); } 

这跨越了2例

1)不重复永久动作(跳转)后进入闲置状态

 CCSequence *_cached_jumpAction = CCSequence::createWithTwoActions(CCRepeat::create(_cached_jump_anim, 1), CCCallFunc::create(this, callfunc_selector(GameCharacter::followUpAction))); 

那么你通常通过跳转()跳转如下。

 void GameCharacter::jump() { stopAllActions(); runAction(_cached_jumpAction); } 

跳转animation完成播放后,将无休止地播放空闲animation。

2)重复 – 永远的行动(步行)后去空闲

因为你正在走路(这是永远重复的),你需要打电话

 stopAllActions() 

先停下来,然后叫walk()。 因此这意味着没有像第一种情况那样的自动感觉。 你需要通过代码来检测它,这个时候你需要停止它,然后再运行另一个重复的动作。

思路

以上细节适用于正常和简单的情况。 为了覆盖所有情况,妥善处理事情,我们需要跟踪

  • 当前状态的动作(或说animation)的行为(或演奏)。

    您可能需要在为所有角色的动作创建的每个动作中注入CCCallFunc,以便在播放此类animation时设置其状态。 当您调用runAction()时,您不会设置状态,因为animation将播放下一帧,与设置状态不同,还要记住我们可以在一个动作中链接不同的动作(状态)。

  • previousAction和currentAction

    stopAllActions()不是一种治疗方法。 如果你在中间调用这个,并且打算切换animation,那么你很可能会有很高的机会来阻止其他与animation无关的动作。 由于敌人的命中效果,击退翻译。 这样一个角色就会冻结,这种反击效果也不会适用。 为了解决这个问题,我们必须跟踪这两个行动,并相应地制止, 而不是全部

  • followUpAction()是一个关键