Swift SpriteKit动画之间的正确过渡

Swift SpriteKit动画之间的正确过渡,swift,xcode,sprite-kit,Swift,Xcode,Sprite Kit,我有一个空闲的播放器动画,我想做一些动画之间的平稳过渡。空闲动画是默认的,从那个过渡我希望能够切换到另一个状态(比方说战斗),然后回到空闲状态。空闲角色动画的代码当前类似于: self.addChild(playerAnimation) playerAnimation.runAction(SKAction.repeatActionForever( SKAction.animateWithTextures(playerAnimationManager.idleManAnim

我有一个空闲的播放器动画,我想做一些动画之间的平稳过渡。空闲动画是默认的,从那个过渡我希望能够切换到另一个状态(比方说战斗),然后回到空闲状态。空闲角色动画的代码当前类似于:

self.addChild(playerAnimation)
playerAnimation.runAction(SKAction.repeatActionForever(
            SKAction.animateWithTextures(playerAnimationManager.idleManAnimation.textureArray, timePerFrame: 0.1)))
现在,这将永远持续下去,但我需要截取它并在其上添加一个新动画(这是同一个角色,处于新状态)。我在想,我应该停止闲置的动画,切换到新的,然后在完成后返回闲置,但我不相信这是链接动画的最佳方式,我还没有找到一个好的资源来解释如何进行


有什么建议吗?谢谢

根据纹理数组的长度,您可能可以执行此操作

我将尝试在不使用代码的情况下解释我如何使用
objective C
以及您如何使用
Swift

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

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

  • 最后,在
    repeatActionForEver
    空闲动画中,在
    animateWithTextures
    动画之后添加
    runBlock
    动画。在这个块中,定义一个静态变量(一个在反复调用块时会被记住的变量)并将其递增+1,添加一个类似于->
    if的“if语句”(my\u static\u var==纹理动画和idleFlag中的帧数)
    。在“if语句”中,将静态变量设置为0并调用“
    beginFightAnim
  • 在此之后,更改动画所需做的全部工作就是将
    idleFlag
    设置为
    YES

    希望它能起作用


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

    我想举一系列例子,让您更容易理解这件事。假设您的节点名为
    playerImation
    ,这是一个典型的atlasc,其中包含一个plist

    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!
    

    这听起来确实是一个合理的解决方案。让我试一下,看看效果如何,谢谢!这对你有用吗?上次我在animateWithTextures事件中尝试从精灵获取纹理时,它将返回原始纹理,而不是动画,我最终编写了自己的操作来处理此问题。是的,在发布之前尝试确保安全。我已将文件夹atlas创建的atlasc用于所有帧,当您构建应用程序并在内容包内搜索时,您会找到atlasc。我可以在动画中一步一步地看到所有帧的名称,所以,现在,我不知道关于它的问题帧的名称不是我所关心的,它是得到你使用的实际纹理,它实际上是打印idle1,idle2,idle3…等等?是的,伙计,我在动画中看到的正是,同时在控制台调试中打印的,你们看到印刷和显示的框架,你们是什么意思?我想知道这是否被更改或修复了,也许是因为我有不同的设置导致了问题,如果我再次遇到这个问题,我会回来找你们