Как добавить ускорение моему персонажу в Pygame? - PullRequest
3 голосов
/ 19 января 2020

Я новичок в python и Pygame, и мне нужна помощь с чем-то, связанным с ускорением. Я следовал руководству на youtube о том, как сделать основу для платформерной игры, и я использовал его, чтобы создать игру, похожую на игру в Кирби. Одна из крошечных мелких деталей, которые я замечаю в игре с Кирби, заключается в том, как он скользит, когда вы двигаетесь в одном направлении, а затем быстро перемещаетесь в другом направлении, и в течение последних нескольких дней я выяснял, как заставить его работать. Решение, которое я придумал, состояло в том, чтобы сделать так, чтобы вместо того, чтобы персонаж двигался при каждом нажатии клавиши, персонаж ускоряется, а затем прекращает ускоряться, как только достигает максимальной скорости, а затем быстро замедляется и снова ускоряется, когда вы нажимаете другую кнопку. клавиша направления. Проблема в том, что я не знаю, как программировать ускорение. Кто-нибудь может мне помочь с этим?

Вот код, который я написал для игры (первый бит для столкновения, второй бит для фактического перемещения игрока):

def move(rect, movement, tiles):
collide_types = {'top': False, 'bottom': False, 'right': False, 'left': False}
rect.x += movement[0]
hit_list = collide_test(rect, tiles)
for tile in hit_list:
    if movement[0] > 0:
        rect.right = tile.left
        collide_types['right'] = True
    if movement[0] < 0:
        rect.left = tile.right
        collide_types['left'] = True
rect.y += movement[1]
hit_list = collide_test(rect, tiles)
for tile in hit_list:
    if movement[1] > 0:
        rect.bottom = tile.top
        collide_types['bottom'] = True
    if movement[1] < 0:
        rect.top = tile.bottom
        collide_types['top'] = True

return rect, collide_types

Второй бит :

player_move = [0, 0]
if move_right:
    player_move[0] += 2.5
elif run:
    player_move[0] += -3
if move_left:
    player_move[0] -= 2
elif run:
    player_move[0] -= -3
player_move[1] += verticle_momentum
verticle_momentum += 0.4
if verticle_momentum > 12:
    verticle_momentum = 12
elif slow_fall == True:
    verticle_momentum = 1

if fly:
    verticle_momentum = -2
    slow_fall = True
    if verticle_momentum != 0:
        if ground_snd_timer == 0:
            ground_snd_timer = 20

1 Ответ

3 голосов
/ 19 января 2020

Вместо непосредственного изменения положения персонажа при нажатии кнопки, вы должны изменить скорость. Так, например, принимая движение только по оси X:

acc = 0.02 # the rate of change for velocity
if move_right:
    xVel += acc 
if move_left:
    xVel -= acc 

# And now change your character position based on the current velocity
character.pose.x += xVel 

Другие вещи, которые вы можете добавить: сделайте так, чтобы, когда вы не нажимаете какие-либо клавиши, вы теряли импульс, чтобы вы могли остановиться. Вы можете сделать это, вычтя из скорости или добавив к ней определенный коэффициент затухания (который меньше вашей константы ускорения, но вам придется настраивать ее, когда вы экспериментируете со своей игрой).

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