Python 3.x 向左移动时,如何修正错误的减速?
我刚开始在pygame中学习游戏开发,我希望玩家停止按键时,玩家对象会减速 这就是我目前的情况:Python 3.x 向左移动时,如何修正错误的减速?,python-3.x,pygame,Python 3.x,Pygame,我刚开始在pygame中学习游戏开发,我希望玩家停止按键时,玩家对象会减速 这就是我目前的情况: def update(self): self.accel_x = 0 keys = pg.key.get_pressed() if keys[pg.K_LEFT]: self.accel_x = -0.2 if keys[pg.K_RIGHT]: self.accel_x = 0.2 if abs(self.vx) >=
def update(self):
self.accel_x = 0
keys = pg.key.get_pressed()
if keys[pg.K_LEFT]:
self.accel_x = -0.2
if keys[pg.K_RIGHT]:
self.accel_x = 0.2
if abs(self.vx) >= max_speed:
self.vx = self.vx/abs(self.vx) * max_speed
if self.accel_x == 0:
self.vx *= 0.91
self.vx += self.accel_x
self.vy += self.accel_y
self.rect.x += self.vx
self.rect.y += self.vy
它在向右移动时工作正常,但在向左移动时对象不会按时停止。相反,它会减速到一个点,然后继续以非常慢的速度运行一段时间,然后停止。首先,让我们看看算法背后的数学原理 当按下按钮时,速度和位置根据加速度a在t(功能运行次数)发生变化,初始值为v0和x0 v=v0+a*t x=x0+∑(i=1到t)i*a
或
x=x0+(t2+t)*a/2 当松开按钮(accel为0)时,速度v呈几何下降 v=v0*0.91t 10次呼叫后,我们有~0.39 v,100次呼叫后~10-5 v。这意味着,从视觉上看,位置x减速并停止,v太小,在一段时间后无法产生差异 数学与游戏中看到的是一致的 问题是为什么该算法在左侧不起作用。
虽然它应该工作相同,左和右 不同的是,左边
- 按下左键后,速度v更可能为负值
- 位置x可能在某个点变为负值(必须进行检查)
- 如果abs(v)小于(比如)10-5或其他小值,位置在视觉上不会改变(小于一个像素),则可以强制速度为0
- 确保x值检查在极限,尤其是负值
- 调试:显示/记录v和x值,尤其是在释放LEFT之后。这样,当整个程序运行时,您将更容易确定问题是何时产生的
如果这不能解决您的问题,您可以编辑您的问题并添加更多相关代码。我假设
max\u speed
是一个正数?你有没有试过只有当玩家向左走的时候才否定它?在没有看到完整代码的情况下,很难说出如何修复它。简单的回答是:不要依赖于无穷小的浮点数。添加将“小速度”设置为零的条件。