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

Posted

技术标签:

【中文标题】Swift 3 - 当布尔为真时如何移动精灵节点?【英文标题】:Swift 3 - how to move sprite node when a bool is true? 【发布时间】:2017-03-19 16:15:13 【问题描述】:

好的,我在 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 为假),SKAction 才真正运行(顺利)。我认为这是因为它被一次又一次地调用。

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

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

【问题讨论】:

update: 内运行 SKAction 是错误的方法(通常),尤其是在您的情况下,动作的持续时间为 2 秒,并且 update: 执行了 60 次每秒它没有性能(也没有意义),因为您一遍又一遍地重新创建 SKAction 对象,以便将精灵从 A 点移动到 B 点。您需要并且应该为此只创建一个 SKAction 对象...就像下面@nateslager 的回答中所述。 当然,如果你正在实现类似homing missile 的东西,你可能想要使用update: 方法(没有SKActions)。如果你需要让一个节点从 A 点移动到 B 点,那么 action 会更方便。不过,关键是,不要以你正在做的方式将动作放入update: 方法中(每帧创建动作对象)。如果您仍然卡住,请尝试更多地描述所有内容(例如,您的目标是改变其位置还是静止的)并让我知道... 【参考方案1】:

当你打电话时

guy.run(action)

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

尝试将 moveGuy() 放在 mouseDown() 中。只要你点击,那家伙就会平稳地移动到他的目的地,但如果你停止点击,他不会停下来。您需要以某种方式停止该操作。你可以做的是替换

guy.run(action)

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

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

guy.removeAction(forKey: "moveGuy")

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

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

【讨论】:

谢谢!唯一的问题是由于持续时间,如果你在 mouseup 之后开始动作,一旦他移动了一点点到目的地,他的移动就会逐渐变慢。如何保持速度恒定?

以上是关于Swift 3 - 当布尔为真时如何移动精灵节点?的主要内容,如果未能解决你的问题,请参考以下文章

当布尔值为真时触发动画

当应该为真时,Android Studio 改造响应返回布尔值为假

基本布尔逻辑——如何仅在另一个条件为真时测试条件

当其他可观察对象为真时,从可观察对象中获取项目

当需要 ssl 为真时无法调用 EWS

JavaScript中逻辑运算符的使用