向左移动时,如何解决错误的减速度?

时间:2019-01-13 16:19:28

标签: 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) >= 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

向右移动时效果很好,但是向左移动时对象没有按时停下来。相反,它会减速到一个点,然后以很慢的速度继续运行一段时间,然后停止。

1 个答案:

答案 0 :(得分:0)

首先,让我们看一下算法背后的数学原理。

按下按钮时,速度和位置基于加速度 a t (函数运行的次数)处变化,初始值为v < sub> 0 和x 0

  

v = v 0 + a * t

     

x = x 0 +Σ(i = 1至t)i * a
  或
  x = x 0 +(t 2 + t)* a / 2

当释放按钮(加速度为0)时,速度 v 呈几何下降

  

v = v 0 * 0.91 t

在10次调用后,我们有〜0.39 v,在100次调用之后是〜10 -5 v。这意味着在视觉上,位置 x 减速并停止, v 太小而无法在一段时间后产生变化。

数学与游戏中所见一致。

问题是为什么该算法在左侧不起作用。
虽然应该一样,但是左右。

区别是左侧

    按下 LEFT 后,
  • 速度 v 更有可能为负
  • 位置 x 在某些时候可能变为负值(必须检查)

由于提供的代码(可能)未涵盖要更改的部分,因此建议如下:

  • 如果abs( v )小于10 -5 或其他位置不变的小值,则可以将速度设为0视觉上(小于一个像素)。
  • 确保在限制范围内检查 x 值,尤其是对于负值。
  • 调试:显示/记录 v x 值,尤其是在释放 LEFT 之后。这样,当整个程序运行时,您可以更轻松地确定问题的根源。

如果这不能解决您的问题,则可以编辑问题并添加更多相关代码。