[ios]Swift ︰ 检查 SKActions 研究进展

标签: sprite-kit ios Swift
发布时间: 2017/4/3 19:07:18
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

一对夫妇的精灵在 swift 有相同的操作列表的游戏 (技术上 [SKAction])。他们都在行动序列中的不同点,我需要把它们按排列次序的最完整的 (拥有行动) 至少完成。那怎么Sprite的进步 (或至少一步行动都是在)?优选地,我想要的一步,是对完成百分比。

为了示例代码︰

    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

解决方法 1:

只要Sprite的速度是常数 (AKA 没有子弹时间效应) 我就用一本字典来存储起动次数︰

var startingTimes = [SKNode:NSTimeInterval]()

然后将存储时Sprite开始他的序列

sprite1.run(SKAction.sequence(sequence))
startingTimes[sprite1 as! SKNode] = currentTime

最后,按 startingTime 进行排序

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)
}

要完成的百分比是更复杂一点。 你需要把你的 currentTime-startingTime,然后找出在此基础你要处于你的Sprite。

所以每 1 秒有这 3 个步骤,总有。

我的 currentTime-startingTime 是 1.5 秒。

var deltaTime = currentTime - startingTime

我采取 1.5-步骤 1 的时间,所以结果是.5 秒

deltaTime -= step1Time

deltaTime > 0,我在新的一步

我采取.5-步骤 2 的时间,所以结果是.5 秒

deltaTime -= step2Time

deltaTime < = 的 0,我在这一步

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

  let completionPercentage = deltaTime / step2Time
赞助商