Swift3 Swift 3-当布尔值为真时,如何移动精灵节点?

Swift3 Swift 3-当布尔值为真时,如何移动精灵节点?,swift3,sprite-kit,swift-playground,Swift3,Sprite Kit,Swift Playground,好的,我在Swift 3游乐场工作,只需要在用户鼠标按下时将精灵节点移动到某个点,释放时停止。到目前为止,我已经: override func mouseDown(with event: NSEvent) { mouseIsDown = true } override func mouseDragged(with event: NSEvent) { } override func mouseUp(with event: NSEvent) { mouseIsDown

好的,我在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)
精灵套件将对该家伙执行此操作,直到完成。您是对的,moveGuy()会一次又一次地被调用(每次帧更新时,即每~33毫秒(假设每秒30帧)

尝试将moveGuy()放置在mouseDown()中。只要你点击,这个家伙就会平稳地移动到他的目的地,但如果你停止点击,他不会停止。你需要以某种方式停止行动。你能做的就是更换

guy.run(action)

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

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


我强烈推荐阅读,以便更好地理解如何使用它们

update:
中运行
SKAction
通常是错误的,尤其是在您的情况下,操作的持续时间为2秒,更新:每秒执行60次。它没有性能,(也没有意义),因为您正在一次又一次地重新创建
SKAction
对象,以便将精灵从点a移动到点B。您需要并且应该为此只创建一个SKAction对象。。。正如下面@nateslager的回答中所述。当然,如果您正在实现类似的内容,您可能希望使用
update:
方法(不使用
SKActions
)。如果需要使节点从点a移动到点B,则操作更方便。不过,关键是,不要像您这样将动作放入
update:
方法(在每个帧中创建动作对象)。如果你仍然被卡住,试着描述更多的事情(例如,你的目标改变了位置或者是静止的),让我知道…谢谢!唯一的问题是由于持续时间的原因,当鼠标移动到目的地一点后,如果你在鼠标移动后开始动作,他移动的速度会逐渐变慢。如何保持速度恒定?
guy.run(action, withKey: "moveGuy")
guy.removeAction(forKey: "moveGuy")