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