我对 swift 还很陌生,并且一直在开发一个有趣的游戏,但我遇到了一些我无法完全理解的事情。
当按下运行按钮时,角色向前移动,具有以下功能
func move(dt: CGFloat) {
position.x += moveRate * dt
}
并且当按下跳跃按钮时,角色用下面的函数跳跃
func jump() {
physicsBody?.applyImpulse(CGVector(dx: 0, dy: jumpRate))
run(jumpAnimation!)
}
两者都很好,但请考虑一下这个 senario。玩家正在奔跑,然后他们在移动的同时跳跃。在空中时,玩家松开移动按钮,玩家的 x 位置停止不动。这显然感觉很不自然,我希望玩家的 x 位置缓和一些。
现在我也玩过用 physicsBody?.applyForce(CGVector(dx: 1000, dy: 0))
移动角色,这会产生那种效果,但他似乎只是获得了更多和速度更快,可以这么说,您不会获得恒定速率或“最大速度”。
有人可以与我分享一些见解吗?我很乐意学习有关 spritekit 和一般游戏开发的任何知识。谢谢!
最佳答案
您应该尝试设置速度而不是设置 X 位置。设置位置时,您会绕过所有物理行为。
您还应该尝试仅在实际按下按钮时设置它。
func move(dt: CGFloat) {
if Math.abs(moveRate) > 0.1 { // If player initiates movement. You can increase the value 0.1 if you want to filter move values
velocity = CGVector(dx: moveRate, dy: veloxity.dy)
}
}
如果您的角色像在太空中一样无限移动,linearDamping
将很有用。它用于模拟空气摩擦,因此接近 1 的值意味着更多的摩擦,而接近 0 的值意味着更少的摩擦。
linearDamping = 0.85
此外,通过这种方式,moveRate
不依赖于 dt
,但应该降低它。
尝试一下,我还没有测试过,但我基本上就是这样做的。
关于ios - SpriteKit 跳跃和移动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41010268/