如何让SpriteKit中精灵的移动速度保持恒定?
让SpriteKit精灵保持恒定移动速度的解决方案
嘿,这个问题我练手SpriteKit的时候也踩过同款坑!固定duration为1秒确实会让精灵移动速度跟着点击距离忽快忽慢,不过咱们完全不用替换现有的SKAction.move(to:)方法,用点简单的数学计算就能搞定恒定速度的需求。
核心思路
速度的基础公式是 速度 = 距离 / 时间,反过来推导就是 时间 = 距离 / 速度。咱们只需要先算出精灵当前位置到点击位置的直线距离,再除以你想要的固定速度,就能得到对应的移动时长——这样不管点击位置远近,精灵的移动速度都会保持一致。
修改后的代码示例
先定义一个固定速度(单位是「点/秒」,可以根据游戏手感调整数值),然后在触摸事件里完成距离计算和时长推导:
// 定义固定移动速度,比如每秒移动200个屏幕点 let constantSpeed: CGFloat = 200.0 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches { let targetLocation = touch.location(in: self) let currentLocation = ZombieNode.position // 计算精灵当前位置到目标位置的直线距离 let distance = hypot(targetLocation.x - currentLocation.x, targetLocation.y - currentLocation.y) // 避免点击精灵本身时出现除以0的错误 guard distance > 0 else { return } // 根据固定速度计算所需的移动时长 let duration = TimeInterval(distance / constantSpeed) // 可选:取消之前的移动动作,让精灵立刻响应最新点击 ZombieNode.removeAllActions() // 执行恒定速度的移动动作 ZombieNode.run(SKAction.move(to: targetLocation, duration: duration)) } }
额外小提示
- 加上
ZombieNode.removeAllActions()可以避免玩家连续点击时,精灵同时执行多个移动动作导致行为混乱,让它立刻响应最新的触摸指令。 - 你可以随时调整
constantSpeed的数值来适配游戏手感,数值越大移动越快,反之则越慢,非常灵活。
内容的提问来源于stack exchange,提问作者leocoolguy 0
相关产品推荐
相关产品推荐

