Cocos2d iphone 如何在cocos2d中从Sprite检索操作

Cocos2d iphone 如何在cocos2d中从Sprite检索操作,cocos2d-iphone,Cocos2d Iphone,我在场景中使用了一个CCSprite,并创建了多个CCAnimation操作,所有这些操作都使用单个CCSpriteFrameCache sharedSpriteFrameCache应用于它。虽然一切正常,而且我能够在动画之间切换,但我感觉自己做得很差,希望通过检索CCSprite上正在运行的操作来简化代码,从而在运行下一个操作之前逐个停止这些操作 为了帮助创建一些上下文,让我们假设以下情况: 我们有一个叫mySprite的精灵 我们分别为向右行走、向左行走和向前坐姿定义了3种不同的动画动作:

我在场景中使用了一个CCSprite,并创建了多个CCAnimation操作,所有这些操作都使用单个CCSpriteFrameCache sharedSpriteFrameCache应用于它。虽然一切正常,而且我能够在动画之间切换,但我感觉自己做得很差,希望通过检索CCSprite上正在运行的操作来简化代码,从而在运行下一个操作之前逐个停止这些操作

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

  • 我们有一个叫mySprite的精灵

  • 我们分别为向右行走、向左行走和向前坐姿定义了3种不同的动画动作:actionAnimWalkRight、actionAnimWalkLeft和actionAnimSitForward

  • 我们想让精灵在有人触摸mySprite右侧屏幕时向右行走,在有人触摸mySprite左侧屏幕时向左行走,在有人触摸mySprite时坐下
我使用的方法如下:

  • 将CCSprite作为孩子放置在场景中
  • 告诉精灵使用:[self-runAction:actionWalkRight]运行操作
  • 当我想在有人触摸后更改动作时,我有一个名为stopAllAnimationActions的方法,在应用新动作之前,我会调用该方法,该动作会停止任何动画动作,无论正在运行什么。基本上列出了我定义的所有cAnimation/cActions,并单独停止每个操作,因为我不想使用stopAllActions。如下:[自停止操作:actionWalkRight];[自停止动作:actionWalkLeft];[自停止动作:动作向前]
  • 然后,在上述方法触发后,使用:[self-runAction:actionWalkLeft]应用新动画
    虽然这是可行的,但它似乎是一个糟糕的设计,因为我不知道到底是什么在运行,就停止了我知道没有运行的项目。因此,在非常复杂的情况下,只需寻求建议和最佳推荐做法就可以做到这一点,因此很难跟踪每一种可能的情况。如有任何反馈,我们将不胜感激。

    我建议您简化流程,并充分利用本机Cocos功能,包括
    stopAllActions
    。不要重复使用动作,总是从头开始创建它们,因为Cocos开发人员已经很好地讨论过重复使用动作可能有问题


    Cocos经过了很好的优化,像
    stopAllActions
    这样的功能并不是性能的强项。实际上,它可能比您的方法快。

    创建操作时,请使用常量设置该操作的标记:

    actionWalkRight.tag= kCurrentAction;
    [self runAction:actionWalkRight];
    
    然后,通过该标记检索正在运行的操作并停止它

    [self stopActionByTag:kCurrentAction];
    

    谢谢Saikat!这是很有帮助的,因为我没有想过使用通用标记来检索它。这是一个很好的建议。谢谢andrews…这也是一个很好的信息。我不知道重复使用操作会导致bug,因为我对此没有任何问题。不幸的是,我不能使用stopAllActions,因为这也会停止我的移动动作,不仅仅是在我特定情况下的动画,还要感谢另一个指针!