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 - 当布尔为真时如何移动精灵节点?的主要内容,如果未能解决你的问题,请参考以下文章