在正确的时间停止纹理动画,并在Spritekit Swift中启动另一个纹理动画
我已经在一个Spritekit独立游戏项目上工作了大约5个月,现在我必须让我的英雄飞起来,并使用纹理动画来拍打翅膀。当“飞行模式”启动,英雄跳跃时,翅膀必须显示并开始拍打。为此,我制作了3个不同的动画:在正确的时间停止纹理动画,并在Spritekit Swift中启动另一个纹理动画,swift,animation,sprite-kit,textures,skaction,Swift,Animation,Sprite Kit,Textures,Skaction,我已经在一个Spritekit独立游戏项目上工作了大约5个月,现在我必须让我的英雄飞起来,并使用纹理动画来拍打翅膀。当“飞行模式”启动,英雄跳跃时,翅膀必须显示并开始拍打。为此,我制作了3个不同的动画: wigsOpenAnimation = SKAction.repeatAction(openAtlasAnimation, count: 1) wingsFlapAnimation = SKAction.repeatActionForever(flapAtlasAnimation) wingsC
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”是最后一个flap帧纹理。问题是,使用此代码,在开始关闭动画之前,Flap1会再次显示,因此就像是Flap序列再次开始一样。这是不好的,因为纹理的制作使得关闭动画必须紧跟在最后一个襟翼帧之后,而在这两者之间有另一个襟翼帧看起来并不好。欢迎任何可能的解决方案。我希望我说得够清楚了,谢谢
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秒
=100毫秒
在运行WingClose动画之前,可能会手动将纹理设置为您想要的纹理?是的,这可能是个好主意,但我用另一种方法解决了它。在告诉它等待多长时间时,我之前输入了“WingsFrequence”,现在我减去了每次帧更新之间经过的时间量(例如,如果你有60帧,它将是1/60秒),这样它就不会运行额外的帧。无论如何,谢谢你的建议!我认为没有比这更简单的方法了。该方法简单有效。