在Swift中改变精灵速度的问题

问题描述

我在SpriteKit中工作,我从数组中获得了随机的Sprite,这些Sprite使用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()
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...