Ios 斯威夫特中精灵速度变化的问题

Ios 斯威夫特中精灵速度变化的问题,ios,swift,performance,sprite-kit,skaction,Ios,Swift,Performance,Sprite Kit,Skaction,我在SpriteKit中工作,我有一个数组中的随机精灵,使用SKActions以一定的速度和频率从屏幕顶部向下移动。我试图创造一个慢动作效果,使这些下落的精灵看起来下降得更慢,但继续以相同的距离下落,然后在五秒钟后恢复速度。更改精灵速度几秒钟后出现问题,一些精灵彼此之间的距离越来越近,这表明每次向下移动之间的时间发生了变化。我不确定是否有太多的定时动作同时发生,而精灵速度的变化会影响这些动作 let spriteArray = [SKSpriteNode]() let movingArray

我在SpriteKit中工作,我有一个数组中的随机精灵,使用SKActions以一定的速度和频率从屏幕顶部向下移动。我试图创造一个慢动作效果,使这些下落的精灵看起来下降得更慢,但继续以相同的距离下落,然后在五秒钟后恢复速度。更改精灵速度几秒钟后出现问题,一些精灵彼此之间的距离越来越近,这表明每次向下移动之间的时间发生了变化。我不确定是否有太多的定时动作同时发生,而精灵速度的变化会影响这些动作

let spriteArray = [SKSpriteNode]() 
let movingArray = [SKSpriteNode]() 
var slowMotion = false

override func didMove(to view: SKView) {
    func createSprites()
    func moveSprite()
}
func createSprites(){
    for _ in 0...10 {
        let sprite = SKSpriteNode(color: .red, size: CGSize(width: 10, height: 10)
        sprite.position = CGPoint(x: self.size.width/2, y: self.size.height + sprite.size.height)
        sprite.zPosition = 1
        self.addChild(sprite)
        spriteArray.append(sprite)
    }
}
func moveSprite(){
    let sprite = spriteArray.randomElement()
    spriteArray.remove(at: spriteArray.firstIndex(of: sprite))
    movingArray.append(sprite)
    if slowMotion == true {
        sprite.speed = 0.5
    }
    let moveSprite = SKAction.moveTo(y: -self.size.height * 0.1, duration: 3)
    let returnSprite = SKAction.run { [weak self] in
        guard let self = self else { return }
        sprite.speed = 1
        sprite.removeAllActions()
        sprite.position.y = CGFloat(self.size.height + sprite.size.height)
        self.spriteArray.append(sprite)
        self.movingArray.remove(at: self.movingArray.firstIndex(of: sprite))
    }
    let spriteSequence = SKAction.sequence([moveSprite, returnSprite])
    sprite.run(spriteSequence, withKey: "movingDown")
    
    let wait = SKAction.wait(forDuration: 1 )
    let moveNextSprite = SKAction.run {
        [weak self] in
        guard let self = self else { return }
        self.moveSprite()
    }
    self.run(SKAction.sequence([wait, moveNextSprite])
}
func slowMotion(){
    let slowDown = SKAction.run {
        [weak self] in
        guard let self = self else { return }
        self.slowMotion = true
        for sprite in self.movingArray{
            sprite.speed = 0.5
            sprite.action(forKey: "movingDown")?.speed = 0.5
        }
    }
    let wait = SKAction.wait(forDuration: 5)
    let resumeSpeed = SKAction.run {
        [weak self] in
        guard let self = self else { return }
        self.slowMotion = false
        for sprite in self.movingArray{
            sprite.speed = 1
            sprite.action(forKey: "movingDown")?.speed = 1
        }
    }
    let slowMotionSequence = SKAction.sequence([slowDown, wait, resumeSpeed])
    world.run(slowMotionSequence, withKey: "slowMotion")
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch: AnyObject in touches {
        if slowMotion == false {
            slowMotion()
        }
    }
}
让spriteArray=[SKSpriteNode]()
让movingArray=[SKSpriteNode]()
var slowMotion=false
覆盖func didMove(到视图:SKView){
func createSprites()
func moveSprite()
}
func createSprites(){
对于0…10中的uu{
设sprite=SKSpriteNode(颜色:。红色,尺寸:CGSize(宽度:10,高度:10)
sprite.position=CGPoint(x:self.size.width/2,y:self.size.height+sprite.size.height)
sprite.zPosition=1
self.addChild(精灵)
spriteArray.append(精灵)
}
}
func moveSprite(){
设sprite=spriteArray.randomElement()
移除(位于:spriteArray.firstIndex(of:sprite))
movingArray.append(精灵)
如果slowMotion==true{
sprite.speed=0.5
}
让moveSprite=SKAction.moveTo(y:-self.size.height*0.1,持续时间:3)
让returnSprite=SKAction.run{[weak self]在
guard let self=self-else{return}
sprite.speed=1
sprite.removeAllActions()
sprite.position.y=CGFloat(self.size.height+sprite.size.height)
self.spriteArray.append(精灵)
self.movingArray.remove(位于:self.movingArray.firstIndex(of:sprite))
}
让spriteSequence=SKAction.sequence([moveSprite,returnSprite])
sprite.run(spriteSequence,带键:“下移”)
let wait=SKAction.wait(持续时间:1)
让moveNextSprite=SKAction.run{
[虚弱的自我]在
guard let self=self-else{return}
self.moveSprite()
}
self.run(SKAction.sequence([wait,moveNextSprite])
}
func slowMotion(){
让减速=SKAction.run{
[虚弱的自我]在
guard let self=self-else{return}
self.slowMotion=true
为了在自我移动阵列中的精灵{
sprite.speed=0.5
精灵。动作(福克斯:“下移”)?。速度=0.5
}
}
let wait=SKAction.wait(持续时间:5)
让resumeSpeed=SKAction.run{
[虚弱的自我]在
guard let self=self-else{return}
self.slowMotion=false
为了在自我移动阵列中的精灵{
sprite.speed=1
精灵。动作(福克斯:“下移”)?。速度=1
}
}
让slowMotionSequence=SKAction.sequence([减速、等待、恢复速度])
world.run(慢动作序列,带键:“慢动作”)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
用于触摸:触摸中的任何对象{
如果slowMotion==false{
慢动作
}
}
}