Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在正确的时间停止纹理动画,并在Spritekit Swift中启动另一个纹理动画_Swift_Animation_Sprite Kit_Textures_Skaction - Fatal编程技术网

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

在正确的时间停止纹理动画,并在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

我已经在一个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”是最后一个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秒),这样它就不会运行额外的帧。无论如何,谢谢你的建议!我认为没有比这更简单的方法了。该方法简单有效。