SpriteKit动画之间的正确过渡

时间:2016-07-24 21:34:02

标签: swift xcode sprite-kit

我有一个空闲的播放器动画,我想在一些动画之间进行平滑过渡。空闲动画是默认动画,从那个转换我希望能够切换到另一个状态(让我们说战斗),然后再回到空闲状态。空闲角色动画的代码目前如下:

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

现在,这计划暂时继续进行,但我需要拦截它并在其上添加一个新动画(在新状态下是相同的角色)。我以为我应该停止空闲动画,切换到新动画,然后在完成后再回到空闲状态,但我不相信这是链接动画的最佳方式,我还没有真正找到一个好的资源解释如何去做。

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:1)

根据纹理数组的缩短程度,您可以执行此操作。

我会尝试在没有代码的情况下解释我如何使用objective C并使用Swift

  1. 首先创建一个可由此类文件中的任何子例程调用的属性或变量。它应该是Boolean,应设置为NO。你可以称之为idleFlag

  2. 接下来制作一个将动画更改为战斗模式的方法。此更改将通过删除空闲动画并将其替换为战斗动画。此方法还将idleFlag设置为NO。让我们调用方法" beginFightAnim"

  3. 最后,在repeatActionForEver空闲动画中,在animateWithTextures动画之后,添加runBlock动画。在这个块中定义一个静态变量(一个将在块中反复调用块时记住的变量)并将其递增+1,添加一个" if语句"看起来像这样 - > if (my_static_var == number_of_frames_in_texture_animations && idleFlag)。在" if语句"将静态变量设置为0并调用" beginFightAnim"
  4. 在此之后,您只需将idleFlag设置为YES即可更改动画。

    希望它有效!

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

答案 1 :(得分:0)

我想做一系列示例,以便更容易理解此事。假设您的节点名为playerAnimation,这是一个带有plist的典型atlasc

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

如果你想实时拦截你的动画以了解当时正在运行的帧,你可以这样做:

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!