我是一个相当新鲜的人,并且一直在玩游戏以获得乐趣,而且我遇到了一些我无法理解的事情。
按下运行按钮时,角色会使用以下功能向前移动
func move(dt: CGFloat) {
position.x += moveRate * dt
}
按下跳转按钮时,角色会跳转到以下功能
func jump() {
physicsBody?.applyImpulse(CGVector(dx: 0, dy: jumpRate))
run(jumpAnimation!)
}
两者都很好,但考虑一下这个情况。玩家正在跑步,然后他们在移动的同时跳跃。在空中,玩家释放移动按钮,玩家的x位置停止。这显然感觉非常不自然,我希望玩家的x位置能够缓和。
现在我也用physicsBody?.applyForce(CGVector(dx: 1000, dy: 0))
移动了角色,这会产生这种效果,但他似乎只是获得了越来越多的速度,你不会得到一个恒定的速率或者#34;最高速度"可以这么说。
有人可以与我分享一些见解吗?我一般都喜欢学习关于spritekit和游戏开发的任何东西。谢谢!
答案 0 :(得分:3)
您应该尝试设置速度而不是设置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
,但应该降低。
尝试一下,我还没有测试过它,但这基本上就是我的做法。
答案 1 :(得分:2)
平台游戏和物理学有两种思想流派。
既然您正在使用物理跳跃,物理跳跃很有趣:
在物理系统中创建运动有三种方法:
随着时间的推移施加力量,增加或减少移动速度
使用字段来诱导动作(对此太复杂,而且很麻烦,但很有趣)
您尝试的是physicsBody?.applyForce(CGVector(dx: 1000, dy: 0))
随着时间的推移而施加的力量。上面列表中的第3个。你继续施加这个力的时间越长,角色移动得越快。
这些技术中的每一种都可以发挥作用,但它们都需要对其各种限制和模拟方法进行补偿。
对于您的方法,您需要监控速度并设置最大速度。达到最大速度后,如果玩家仍然按住按钮,则仅提供足够的力来保持速度(假设您使用某种形式的恒定阻力来减慢角色)。
监控速度与强制超时相结合创造了有趣的加速特性 - 例如非常强的初始加速度,然后随着玩家接近最大速度逐渐减小加速度。
当玩家释放按钮时减速是下一个焦点。在所有这些方法中,你需要一些能够减慢玩家速度的东西。这可以是物理引擎提供的反向力的应用,或摩擦或阻尼的使用。