我有一个空闲的播放器动画,我想在一些动画之间进行平滑过渡。空闲动画是默认动画,从那个转换我希望能够切换到另一个状态(让我们说战斗),然后再回到空闲状态。空闲角色动画的代码目前如下:
self.addChild(playerAnimation)
playerAnimation.runAction(SKAction.repeatActionForever(
SKAction.animateWithTextures(playerAnimationManager.idleManAnimation.textureArray, timePerFrame: 0.1)))
现在,这计划暂时继续进行,但我需要拦截它并在其上添加一个新动画(在新状态下是相同的角色)。我以为我应该停止空闲动画,切换到新动画,然后在完成后再回到空闲状态,但我不相信这是链接动画的最佳方式,我还没有真正找到一个好的资源解释如何去做。
有什么建议吗?谢谢!
答案 0 :(得分:1)
根据纹理数组的缩短程度,您可以执行此操作。
我会尝试在没有代码的情况下解释我如何使用objective C
并使用Swift
首先创建一个可由此类文件中的任何子例程调用的属性或变量。它应该是Boolean
,应设置为NO
。你可以称之为idleFlag
。
接下来制作一个将动画更改为战斗模式的方法。此更改将通过删除空闲动画并将其替换为战斗动画。此方法还将idleFlag
设置为NO
。让我们调用方法" beginFightAnim
"
repeatActionForEver
空闲动画中,在animateWithTextures
动画之后,添加runBlock
动画。在这个块中定义一个静态变量(一个将在块中反复调用块时记住的变量)并将其递增+1,添加一个" if语句"看起来像这样 - > if (my_static_var == number_of_frames_in_texture_animations && idleFlag)
。在" if语句"将静态变量设置为0并调用" beginFightAnim
" 在此之后,您只需将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!