【问题标题】:Xcode SpriteKit SKAction not changing properties of an SKSpriteNode?Xcode SpriteKit SKAction 不改变 SKSpriteNode 的属性?
【发布时间】:2017-07-02 09:27:37
【问题描述】:

如果我创建一个SKSpriteNode,并在节点上运行SKAction,则该操作在模拟器上运行,但节点的属性没有改变。 例如。在以下示例中,在模拟器中,节点从 (50,50) 开始并在 1 秒内移动到 (0,0)。但是,最后的 print 语句会打印 (50,50) 而不是新位置 (0,0)

let test = SKSpriteNode()

test.position = CGPoint(x: 50.0, y: 50.0)
test.size = CGSize(width: 20.0, height: 20.0)
test.color = UIColor.black
addChild(test)

test.run(SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0))
print("(\(test.position.x), \(test.position.y))")

我能想到的唯一原因是 print 语句在 SKAction 执行之前执行。如果是这种情况,那么我以后如何执行依赖于获取SKSpriteNode的位置值的代码?

【问题讨论】:

  • 您不需要添加更多SKAction 来打印位置

标签: swift xcode sprite-kit swift3 skaction


【解决方案1】:

在 SpriteKit 中,SKAction 类有许多实例方法,但您不需要添加更多代码,例如 SKAction.sequence 和另一个 SKAction 来打印您的位置。

其实你有run(_:completion),你可以找到官方文档here那个

在动作完成时调用完成块

所以你的代码按原样完成,只需像这个例子一样添加完成语法:

test.run(SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0), completion:{ 
   print("(\(test.position.x), \(test.position.y))")
})

【讨论】:

    【解决方案2】:

    节点的初始位置在它移动到所需位置之前打印出来,您需要做的是在节点到达所需位置时打印节点的位置。

    您可以使用如下顺序修复它:

    let test = SKSpriteNode()
    test.position = CGPoint(x: 50.0, y: 50.0)
    test.size = CGSize(width: 20.0, height: 20.0)
    test.color = UIColor.red
    addChild(test)
    
    let moveAction = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0)
    let printAction = SKAction.run {
      print("(\(test.position.x), \(test.position.y))")
    }
    let sequence = SKAction.sequence([moveAction, printAction])
    
    test.run(sequence)
    

    已经测试过了,希望对你有帮助

    祝你好运!! :]

    【讨论】:

    • 谢谢!这正是我想要的!
    • 太棒了!很高兴为您提供帮助。
    【解决方案3】:

    我能想到的唯一原因是 print 语句在 SKAction 执行之前执行。

    你完全正确!

    那么我以后如何执行依赖于获取 SKSpriteNode 位置值的代码?

    通过组合SKAction.sequenceSKAction.run 方法调用。

    sequence 方法返回一个动作,该动作由一系列依次运行的动作组成。

    run 方法返回一个操作,当运行该操作时,将执行您作为参数传入的代码块。

    您想在“移动”完成后打印位置,因此创建如下操作:

    let runCodeAction = SKAction.run { 
        print("(\(test.position.x), \(test.position.y))") 
    }
    

    然后,使用sequence 创建一个动作序列:

    let sequence = SKAction.sequence(
        [SKAction.move(to: CGPoint(x: 0, y: 0), duration: 1.0), runCodeAction])
    

    现在运行这个序列:

    test.run(sequence)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      相关资源
      最近更新 更多