Как я могу исправить неправильное замедление при движении влево? - PullRequest
0 голосов
/ 13 января 2019

Я только начал изучать разработку игр в 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 голосов
/ 14 января 2019

Во-первых, давайте посмотрим на математику алгоритма.

Когда кнопка нажата, скорость и положение изменяются в зависимости от ускорения a , при t (число раз выполнения функции), начальные значения v 0 и х 0

v = v 0 + a * t

x = x 0 + Σ (i = 1 до t) i * a
или
х = х 0 + (т 2 + т) * а / 2

И когда кнопка отпущена (ускорение равно 0), скорость v уменьшается геометрически

v = v 0 * 0,91 t

после 10 вызовов у нас ~ 0,39 В, после 100 вызовов ~ 10 -5 v. Это означает, что визуально позиция x замедляется и останавливается, v слишком мало, чтобы через некоторое время что-то изменить.

Математика соответствует тому, что видно в играх.

Вопрос в том, почему этот алгоритм не работает с левой стороны.
Хотя должно работать одинаково, влево и вправо.

Разница в том, левая сторона,

  • скорость v более вероятно, будет отрицательным после нажатия LEFT
  • позиция x может в какой-то момент стать отрицательной (и должна быть проверена)

Поскольку предоставленный код (вероятно) не охватывает часть, подлежащую изменению, некоторые рекомендации:

  • Вы можете увеличить скорость до 0, если abs ( v ) меньше, скажем, 10 -5 или других небольших значений, из-за которых позиция не изменяется визуально ( меньше пикселя).
  • Убедитесь, что значения x проверены на пределе, особенно для отрицательных значений.
  • Отладка: отображение / журнал v и x значений, особенно после того, как LEFT выпущены. Таким образом, когда вся программа работает, вам будет легче определить, когда возникла проблема.

Если это не решит вашу проблему, вы можете отредактировать свой вопрос и добавить более подходящий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...