在正确的时间停止纹理动画SKAction并在Spritekit Swift中启动另一个

时间:2016-04-15 15:34:55

标签: swift animation sprite-kit textures skaction

我已经在Spritekit独立游戏项目上工作了大约5个月,而且我已经到了我必须让我的英雄飞行的地步,并且使用纹理动画让翅膀翻动。当"飞行模式"开始,英雄跳跃的翅膀必须显示并开始拍打。为此我制作了3个不同的动画:

wigsOpenAnimation = SKAction.repeatAction(openAtlasAnimation, count: 1)
wingsFlapAnimation = SKAction.repeatActionForever(flapAtlasAnimation)
wingsCloseAnimaiton = SKAction.repeatAction(closeAtlasAnimation, count: 1)

然后使用第一个襟翼动画连接打开动画的序列:

wingsSequence = SKAction.sequence([wingsOpenAnimation,wingsFlapAnimation])

然而,当英雄的土地必须关闭他的翅膀,这是我曾经这样做的一段代码:

        if (self.onGround == true) || (self.flyMode == false) {
        if String(wings.texture).rangeOfString("Flap8") != nil {


            wings.runAction(SKAction.waitForDuration(wingsFrequency)) {
                self.wings.removeActionForKey("wingsSequence")
                self.wings.runAction(self.wingsCloseAnimaiton)


            }

        }
    }

我把这段代码放在更新功能中," Flap8"是最后一个翻盖框架纹理。问题是,使用此代码,在开始关闭动画之前,Flap1再次显示,因此它会像Flap序列再次启动一样。这是不好的,因为纹理是这样做的,以便关闭动画必须紧接在最后一个翻盖框架之后,并且在它们之间有另一个翻盖框架并不好看。欢迎任何可能的解决方案。我希望我足够清楚,谢谢。

1 个答案:

答案 0 :(得分:0)

  

Swift 4.0代码

这是我使用的策略:

    Sprite.run(SKAction.repeatForever(SKAction.animate(with: Sprite1TextureArray, timePerFrame: 0.15)))

        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(900) /**Amount of frames * timePerFrame*/, execute: {
                  //Your second animation  
                  self.Sprite.run(SKAction.repeatForever(SKAction.animate(with: self.Sprite2TextureArray, timePerFrame: 0.15)))
        })

基本上,它的作用是在您希望的时间内运行动画,然后在您指定的秒数或毫秒数后用新的动画替换动画。

提示:0.1 Seconds = 100 milliseconds