Swift 3 - 当 bool 为真时如何移动 sprite 节点?

Swift 3 - how to move sprite node when a bool is true?

好的,我在 Swift 3 个游乐场工作,需要仅在用户按下鼠标时将精灵节点移动到某个点,松开鼠标时停止。到目前为止我有:

override func mouseDown(with event: NSEvent) {
   mouseIsDown = true
}

override func mouseDragged(with event: NSEvent) {       
}

override func mouseUp(with event: NSEvent) {
    mouseIsDown = false
}

func moveGuy() {
    let action = SKAction.move(to: CGPoint(x: size.width / 2,y: 200), duration: 2)
    action.timingMode = .easeInEaseOut
    guy.run(action)   
}

//UPDATE
override func update(_ currentTime: CFTimeInterval) {
    if(mouseIsDown)
    {
       moveGuy()
    }
}

这有点管用,问题是在我释放鼠标(mouseIsDown 为 false)后 SKAction 实际上 运行(顺利)。我认为这是因为它被一次又一次地调用。

通常我会以小增量使用 moveBy 动作,但我需要我的节点移动到特定点。

如何让我的节点仅在鼠标按下时移动到某个点?

当你打电话时

guy.run(action)

sprite-kit 会 运行 对这个家伙的动作直到完成。你是对的,moveGuy() 被一次又一次地调用(每次帧更新时,即假设 30fps 每 ~33ms)。

尝试将 moveGuy() 放在 mouseDown() 中。只要你点一下,小家伙就会很顺利地移动到目的地,但你不点,他就不会停下来。您需要以某种方式停止操作。你可以做的是替换

guy.run(action)

guy.run(action, withKey: "moveGuy")

这会将一个键与您的操作相关联,您稍后可以在 mouseUp() 中查找:

guy.removeAction(forKey: "moveGuy")

在此之后,只有当您按下鼠标时,您的节点才会移动到一个点。但是正如您所指出的,如果您重新单击,节点的移动仍然是不规则的。尝试将 .easeInEaseOut 更改为 .linear。然后运动将是一致的,尽管在 starting/stopping.

时是突然的

我强烈推荐阅读 documentation on SKActions 以更好地了解如何使用它们。