我有两个精灵在一个快速的游戏,有相同的行动清单(技术上[SKAction])。它们都在动作序列的不同点上,我需要将它们按最完整(有动作)到最不完整的顺序排列。我如何得到一个精灵的进展(或至少是它的行动步骤)?最好是,我想知道这一步的完成率。
为了示例代码:
let sprite1 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5)
let sprite2 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5)
let sprite3 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5)
sprite1.position = CGPoint(x: -100, y: 0)
sprite2.position = CGPoint(x: 0, y: 0)
sprite3.position = CGPoint(x: 100, y: 0)
let sequence : [SKAction] = [SKAction.move(by: CGVector(dx: 50, dy: 0), duration: 1.5),
SKAction.rotate(byAngle: CGFloat(M_PI / 2), duration: 1.0),
SKAction.move(by: CGVector(dx: 0, dy: 50), duration: 1.5),
SKAction.rotate(byAngle: CGFloat(M_PI / 2), duration: 1.0),
SKAction.move(by: CGVector(dx: -50, dy: 0), duration: 1.5)]
sprite1.run(SKAction.sequence(sequence))
//wait 1 second
sprite2.run(SKAction.sequence(sequence))
//wait another second
sprite3.run(SKAction.sequence(sequence))
var spriteAccord : [SKSpriteNode] = //insert ranking code
最佳答案
只要精灵的速度是恒定的(也就是说没有子弹时间效应),我就用字典来存储开始时间:
var startingTimes = [SKNode:NSTimeInterval]()
然后储存当一个精灵开始他的序列
sprite1.run(SKAction.sequence(sequence))
startingTimes[sprite1 as! SKNode] = currentTime
最后,按开始时间排序
let sortedStartingTimes = startingTimes.sort(){
(time1,time2)->Bool in
return time1 <= time2
}
然后,只要遍历字典,或者获取第一个条目,无论您需要在这里做什么。
这可以弹出到操场来测试上述代码:
var startingTimes = [String:NSTimeInterval]()
startingTimes["A"] = 1
startingTimes["C"] = 3
startingTimes["B"] = 2
let sortedStartingTimes = startingTimes.sort(){
(time1,time2)->Bool in
return time1 <= time2
}
print("start")
for time in startingTimes
{
print(time)
}
print("sort")
for time in sortedStartingTimes
{
print(time)
}
完成的百分比要复杂一点。你需要获取你当前的启动时间,然后根据这个计算出你在精灵中的位置。
所以我一共有3个步骤,每1秒钟。
我现在的启动时间是1.5秒。
var deltaTime = currentTime - startingTime
我做了1.5步1次,结果是。5秒
deltaTime -= step1Time
deltaTime>0,我进入了一个新的阶段
我花了。5步2的时间,所以结果是。5秒
deltaTime -= step2Time
deltaTime所以deltaTime/step2time,这是我在step2时间线中的百分比
let completionPercentage = deltaTime / step2Time