0

我正在尝试创建一种遗传算法,用于在赛道上运行赛车。每辆汽车都会收到随机指令,这些指令会向汽车施加力并将汽车旋转一定的度数。为了将分配给每辆车的新指令间隔开,我在调度队列中使用了一个延迟时间,它在前一条指令的基础上增加了 0.2 秒。例如

0 秒 - 第一条指令
0.2 秒 - 第二条指令
0.4 秒 - 第三条指令

等等...

我遇到的问题是,在执行了几条指令后,我开始注意到指令之间的延迟更长,以至于在 2 秒后应用了一条新指令。

下面是我的代码。

func carAction(newCar: [[CGFloat]], racecar: SKSpriteNode) {
        var caralive = true
        let max = 1000
        var count = 0
        let delayTime = 200000000
        var deadlineTime = DispatchTime.now()
        while count < max {
            let angleChange = newCar[count][1]
            let speedChange = newCar[count][0]
            count += 1
            deadlineTime = deadlineTime + .nanoseconds(delayTime)
            DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
                if caralive == true {
                    print(DispatchQueue.main)
                    racecar.physicsBody?.angularVelocity = 0
                    let rotate = SKAction.rotate(byAngle: (angleChange * .pi / 180), duration: 0.2)
                    racecar.run(rotate)
                    let racecarRotation : CGFloat = racecar.zRotation
                    var calcRotation : Float = Float(racecarRotation) + Float(M_PI_2)
                    let Vx = speedChange * CGFloat(cosf(calcRotation))
                    let Vy = speedChange * CGFloat(sinf(calcRotation))
                    let force = SKAction.applyForce(CGVector(dx: Vx, dy: Vy), duration: 0.2)
                    racecar.run(force)
                    let total = self.outerTrack.count
                    var initial = 0
                    while initial < total {
                        if racecar.intersects(self.outerTrack[initial]) {
                            racecar.removeFromParent()
                            self.numberOfCars -= 1
                            initial += 1
                            caralive = false
                            break
                        } else {
                            initial += 1
                        }
                    }
                } else {
    //                print(self.numberOfCars)
                }
            }
        }

二维数组 newCar 是所有指令的列表。

任何帮助将不胜感激,因为我多年来一直试图解决这个问题!

非常感谢提前,任何问题都可以随时提出!

4

1 回答 1

1

你应该这样做:

func scheduledTimerWithTimeInterval(){
    // Scheduling timer to Call the function "updateCounting" with the interval of 1 seconds
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("moveCarsFunction"), userInfo: nil, repeats: true)
}

并调用scheduledTimerWithInterval一次

最初在这里回答

于 2018-02-17T14:08:05.663 回答