Учусь писать игры на python (pygame), персонаж при каждом прыжке проваливается

Учусь писать игры через уроки в ютубе. Написал вот такой код, но персонаж почему при каждом прыжке проваливается. Не могу понять почему.
И можете объяснить зачем в коде нужны make_jump = False и jump_counter = 30 и что они делают.
Объясните, буду благодарен.

import pygame

pygame.init()

display_width = 1000
display_height = 600

display = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption("Run Dino")

icon = pygame.image.load('dino.png.')
pygame.display.set_icon(icon)

user_width = 60
user_height = 100
user_x = display_width // 3
user_y = display_height - user_height - 100

clock = pygame.time.Clock()

make_jump = False
jump_counter = 30

def run_game():
    global make_jump
    game = True

    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            make_jump = True

        if make_jump:
            jump()

        display.fill((255, 255, 255))

        pygame.draw.rect(display, (247, 240, 22), (user_x, user_y, user_width, user_height))
        pygame.display.update()
        clock.tick(60)

def jump():
    global user_y, jump_counter, make_jump
    if jump_counter >= -30 :
        user_y -= jump_counter //2
        jump_counter -= 1
    else:
        jump_counter = 30
        make_jump = False
run_game()

Так разберитесь как прыжок реализован. И заодно разберитесь как работает основной цикл, для чего нужен pygame.time.Clock().

Когда make_jump стал True, то после этого на каждой итерации вызывается функция jump и там изменяются значения jump_counter и позиции игрока пока jump_counter не станет -30.

1 лайк

Хм, и правда.

Видимо автор ошибся в расчетах )

В любой непонятной ситуации надо добавлять отладочный вывод.

Например, так:

 def jump():
     global user_y, jump_counter, make_jump
     if jump_counter >= -30 :
+        print('{} {}'.format(jump_counter, user_y))
         user_y -= jump_counter //2
         jump_counter -= 1
     else:
         jump_counter = 30
         make_jump = False
1 лайк

Спасибо большое, я поменял значение jump_counter >= -30 на jump_counter >= -29. И все заработало как надо. Правда я все ровно не понял зачем нужна эта переменная :sweat_smile:

Чтобы прыжок отрисовывать постепенно, а не сразу телепортироваться.

1 лайк