我有两个精灵在一个快速的游戏,有相同的行动清单(技术上[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

10-05 20:06