2016-07-24 61 views
3

我有一个空闲的玩家动画,我想在一些动画之间做一个平滑的过渡。闲置的动画是默认的动画,从那个转换我想能够切换到另一个状态(让我们说打架),然后回到闲置状态。对于闲置的角色动画的代码是目前这样的:SpriteKit动画之间的适当转换

self.addChild(playerAnimation) 
playerAnimation.runAction(SKAction.repeatActionForever(
      SKAction.animateWithTextures(playerAnimationManager.idleManAnimation.textureArray, timePerFrame: 0.1))) 

现在,这个计划永远继续下去,现在,但我需要拦截,并在此基础之上添加一个新的动画(这是相同的角色,处于新的状态)。我在想,我应该停止闲置的动画,切换到新的,然后在完成时回到空闲状态,但我不相信这是链接动画的最佳方式,我还没有真正找到一个很好的资源来解释如何去做吧。

有什么建议吗?谢谢 !

回答

1

根据你的纹理数组的多短,你可能可以做到这一点。

我会尝试我如何使用objective C和使用Swift

  1. 首先使属性或变量,可以通过在这个类文件中的任何子程序调用看到没有代码来解释。它应该是Boolean并且应该设置为NO。你可以称它为idleFlag

  2. 接下来制作一个方法,将动画更改为对抗模式。这种变化将通过删除空闲动画并将其替换为拼图动画来实现。该方法也设置为idleFlagNO。我们将方法称为“beginFightAnim

  3. 最后,在您的repeatActionForEver空闲动画中,紧接着您的animateWithTextures动画,添加runBlock动画。在这个模块中定义一个静态变量(一个将在块的调用中被记住的变量)并将其增加+1,添加一个“if语句”,看起来像这样 - >if (my_static_var == number_of_frames_in_texture_animations && idleFlag)。而在“if语句”静态变量设置为0,并呼吁“beginFightAnim

这一切后,你必须做的改变动画设置idleFlagYES

希望它的作品!

如果您有任何问题,请在下面评论。

+0

这听起来的确是一个合理的解决方案。让我尝试一下,看看它是如何工作的,谢谢! – Spyros

0

我想做一系列的例子,使它更容易理解这件事。假设你有你的节点称为playerAnimation,与如果你想在实时拦截动画知道什么框架在那一瞬间运行,你可以做,你必须

player-idle1.png 
player-idle2.png 
player-idle3.png 
... 

一个plist中的典型atlasc:

override func update(currentTime: CFTimeInterval) { 
    if String(playerAnimation.texture).rangeOfString("player-idle") != nil { 
     print(String(playerAnimation.texture)) 
    } 
} 

此时,在您为动作分配“钥匙”(withKey:"idleAnimation")后,您可以在开始下一个动画时停止特定的空闲动作。

的另一个好处是建立一个结构,以每次知道您的播放器状态,并在每次启动一个新的动作或动画时间修改这个变量:

enum PlayerStatus: Int { 
    case Idle = 1 
    case Fight = 2 
    case Run = 3 
    case Jump = 4 
    case Die = 5 
    ... 
} 

var currentStatus: PlayerStatus! 
+0

这是否适合您?上次我在animateWithTextures事件中尝试从sprite获取纹理时,它会返回原始纹理,而不是动画,我最终编写了自己的操作来处理这个问题。 – Knight0fDragon

+0

是的,试图在发布之前保证安全。我使用我的文件夹地图集创建的atlasc与我的所有框架,当您构建应用程序并在内容包中搜索时,您会发现atlasc。我可以在动画过程中一步一步地看到所有的帧名,所以现在我不知道关于它的问题。 –

+0

帧名不是我所关心的,它获得了您使用的实际纹理,它实际上是打印idle1,idle2,idle3..etc? – Knight0fDragon