我正在尝试创建一种用于在赛道上跑赛车的遗传算法。每辆车都会获得随机指令,这些指令会对汽车施加一定的力并将汽车旋转一定的度数。为了分配给每辆车的新指令,我在调度队列中使用了一个延迟时间,它为前一条指令增加了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)
}
}
}
2D数组newCar是所有指令的列表。
任何帮助都会受到大力赞赏,因为我现在已经试图解决这个问题了!!
非常感谢,任何问题都可以随意提出!
答案 0 :(得分: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
一次