我已经在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序列再次启动一样。这是不好的,因为纹理是这样做的,以便关闭动画必须紧接在最后一个翻盖框架之后,并且在它们之间有另一个翻盖框架并不好看。欢迎任何可能的解决方案。我希望我足够清楚,谢谢。
答案 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