Swift:检查SKActions的进度

时间:2016-07-12 15:12:12

标签: ios swift animation sprite-kit sprite

我在快速游戏中有几个精灵有相同的动作列表(技术上[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

2 个答案:

答案 0 :(得分:1)

您可以在现有操作之间插入runBlock个操作。然后,您可以在块中增加计数器,以通过操作跟踪每个节点的进度。

答案 1 :(得分:1)

只要精灵的速度是恒定的(AKA没有子弹时间效果)我只会使用字典存储起始时间:

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&gt; 0,我迈出了新的一步

我需要.5 - 第2步,结果是.5秒

deltaTime -= step2Time

deltaTime&lt; = 0我在这一步

所以deltaTime / step2time,这是我在step2时间轴中的百分比

  let completionPercentage = deltaTime / step2Time