Python 3.x 向左移动时,如何修正错误的减速?

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) >=

我刚开始在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) >= 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
是一个正数?你有没有试过只有当玩家向左走的时候才否定它?在没有看到完整代码的情况下,很难说出如何修复它。简单的回答是:不要依赖于无穷小的浮点数。添加将“小速度”设置为零的条件。