0

我有一个在场景中使用的 CCSprite,并创建了多个 CCAnimation 动作以使用单个 CCSpriteFrameCache sharedSpriteFrameCache 应用到它。虽然一切正常并且我可以在动画之间切换,但我觉得我做得很糟糕,我想通过检索 CCSprite 上正在运行的动作来简化我的代码,以便在运行下一个动作之前单独停止它们它。

为了帮助创建一些上下文,让我们假设以下情况:

  • 我们有一个名为 mySprite 的 CCSprite

  • 我们定义了 3 个独立的 CCAnimation 动作,分别用于向右行走、向左行走和向前坐着,分别称为:actionAnimWalkRight、actionAnimWalkLeft 和 actionAnimSitForward。

  • 我们想让精灵在有人触摸 mySprite 右侧的屏幕时向右走,当有人触摸 mySprite 左侧的屏幕时向左走,当有人触摸 mySprite 时坐下。

我用来完成此操作的方法如下:

  1. 将 CCSprite 作为一个孩子放置在场景中。
  2. 使用以下命令告诉精灵运行一个动作: [self runAction:actionWalkRight];
  3. 当我想在有人触摸后更改动作时,我有一个名为 stopAllAnimationActions 的方法,我会在应用一个新动作之前调用它,该动作会停止任何动画动作,无论正在运行什么。基本上列出了我定义的所有 CCAnimation/CCActions 并单独停止每个,因为我不想使用 stopAllActions。如下:[self stopAction:actionWalkRight]; [self stopAction:actionWalkLeft]; [self stopAction:actionSitForward];
  4. 然后我在上述方法触发后应用新动画: [self runAction:actionWalkLeft];

虽然这可行,但仅仅因为我不确切知道正在运行的内容而停止我知道没有运行的项目似乎是一个糟糕的设计。因此,仅在非常复杂的情况下寻找建议和最佳推荐做法来执行此类操作,因此很难跟踪每一种可能的情况。对于任何反馈,我们都表示感谢。

4

2 回答 2

1

我建议您简化流程并利用原生 Cocos 功能,包括stopAllActions. 不要重复使用动作,总是从头开始创建它们,因为 Cocos 开发人员已经很好地讨论了重复使用动作可能是错误的。

Cocos 进行了很好的优化,并且像这样的特性stopAllActions并不是性能消耗。实际上,它可能会比您的方法更快。

于 2012-04-20T05:12:33.780 回答
1

创建动作时,使用常量设置该动作的标签:

actionWalkRight.tag= kCurrentAction;
[self runAction:actionWalkRight];

然后,通过该标签检索正在运行的操作并停止它。

[self stopActionByTag:kCurrentAction];
于 2012-04-20T15:10:28.713 回答