Как исправить персонаж, постоянно ускоряющийся в обоих направлениях после замедления Pygame? - PullRequest
1 голос
/ 21 января 2020

Мне удалось успешно внедрить ускорение в мою игру Pygame, но есть небольшая проблема. Проблема в том, что после того, как персонаж замедляется, персонаж начинает ускоряться в одном направлении, замедляется и начинает ускоряться в другом направлении, замедляется и начинает ускоряться в противоположном направлении, повторяя эти две вещи бесконечно. Как мне заставить это остановиться?

Вот код, который я написал для ускорения:

if move_R == True:
    accel = PLAYER_ACCEL
if move_L == True:
    accel = -PLAYER_ACCEL

accel += veloc * PLAYER_FRICT
veloc += accel
player_xy[0] += veloc + 0.5 * accel

1 Ответ

2 голосов
/ 21 января 2020

Ускорение зависит только от входа, если нет входа, ускорение равно нулю:

accel = 0
if move_R:
    accel += PLAYER_ACCEL
if move_L:
    accel -= PLAYER_ACCEL

Скорость изменяется при ускорении, но уменьшается трением.

veloc = (veloc + accel) * (1 - PLAYER_FRICT)

Обратите внимание, что в определенный момент ускорение не может компенсировать трение. Полная энергия ускорения расходуется на трение.
Если veloc / (veloc + accel) равно 1 - PLAYER_FRICT, движение равномерное.

Положение игрока изменяется в зависимости от текущей скорости:

player_xy[0] += veloc

См. Пример:

import pygame

pygame.init()

size = 500, 500
window = pygame.display.set_mode(size)
clock = pygame.time.Clock()

border = pygame.Rect(0, 0, size[0]-40, 100)
border.center = [size[0] // 2, size[1] // 2]
player_xy = [size[0] // 2, size[1] // 2]
radius = 10
PLAYER_ACCEL, PLAYER_FRICT = 0.5, 0.02
veloc = 0

run = True
while run:
    clock.tick(120)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    move_R = keys[pygame.K_RIGHT]
    move_L = keys[pygame.K_LEFT]

    # set acceleration in this frame
    accel = 0
    if move_R:
        accel += PLAYER_ACCEL
    if move_L:
        accel -= PLAYER_ACCEL

    # change velocity by acceleration and reduce dependent on friction
    veloc = (veloc + accel) * (1 - PLAYER_FRICT)

    # change position of player by velocity
    player_xy[0] += veloc

    if player_xy[0] < border.left + radius:
        player_xy[0] = border.left + radius
        veloc = 0
    if player_xy[0] > border.right - radius:
        player_xy[0] = border.right - radius
        veloc = 0

    window.fill(0) 
    pygame.draw.rect(window, (255, 0, 0), border, 1)
    pygame.draw.circle(window, (0, 255, 0), (round(player_xy[0]), round(player_xy[1])), radius)
    pygame.display.flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...