Почему мой персонаж не прыгает? Pygame

Рейтинг: 0Ответов: 1Опубликовано: 26.03.2023

Вот сам код, чтобы я не делал персонаж не прыгает, в чем проблема?


clock = pygame.time.Clock()

pygame.init()
screen = pygame.display.set_mode((1920, 1080))
pygame.display.set_caption('Dota 3')
icon = pygame.image.load('images/dota3.png')
pygame.display.set_icon(icon)

background = pygame.image.load('images/background.png')
walk_right = [
    pygame.image.load('images/player_right/player_right1.png'),
    pygame.image.load('images/player_right/player_right2.png'),
    pygame.image.load('images/player_right/player_right3.png'),
    pygame.image.load('images/player_right/player_right4.png'),
    pygame.image.load('images/player_right/player_right5.png'),
    pygame.image.load('images/player_right/player_right6.png'),
    pygame.image.load('images/player_right/player_right7.png'),
    pygame.image.load('images/player_right/player_right8.png'),
]
walk_left = [
    pygame.image.load('images/player_left/player_left1.png'),
    pygame.image.load('images/player_left/player_left2.png'),
    pygame.image.load('images/player_left/player_left3.png'),
    pygame.image.load('images/player_left/player_left4.png'),
    pygame.image.load('images/player_left/player_left5.png'),
    pygame.image.load('images/player_left/player_left6.png'),
    pygame.image.load('images/player_left/player_left7.png'),
    pygame.image.load('images/player_left/player_left8.png'),
]

player_animation_count = 0
bg_x = 0

player_speed = 5
player_x = 150
player_y = 250

is_jump = False
jump_count = 10

background_sound = pygame.mixer.Sound('sounds/background_music.mp3')
background_sound.play()


running = True
while running:

    screen.blit(background, (bg_x, 0))
    screen.blit(background, (bg_x + 1920, 0))

    keys = pygame.key.get_pressed()

    if keys[pygame.K_a]:
        screen.blit(walk_left[player_animation_count], (player_x, 800))
    else:
        screen.blit(walk_right[player_animation_count], (player_x, 800))

    if keys[pygame.K_a] and player_x > 50:
        player_x -= player_speed
    elif keys[pygame.K_d] and player_x < 550:
        player_x += player_speed

    if keys[pygame.K_w]:
        is_jump = True

    if is_jump is True:

        if jump_count >= -10:

            if jump_count < 0:
                player_y += (jump_count ** 2) // 2
            else:
                player_y -= (jump_count ** 2) // 2

            jump_count -= 1

        else:
            is_jump = False
            jump_count = 10



    if player_animation_count == 3:
        player_animation_count = 0
    else:
        player_animation_count += 1

    bg_x -= 2
    if bg_x == -1920:
        bg_x = 0


    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()

    clock.tick(144)import pygame

clock = pygame.time.Clock()

pygame.init()
screen = pygame.display.set_mode((1920, 1080))
pygame.display.set_caption('Dota 3')
icon = pygame.image.load('images/dota3.png')
pygame.display.set_icon(icon)

background = pygame.image.load('images/background.png')
walk_right = [
    pygame.image.load('images/player_right/player_right1.png'),
    pygame.image.load('images/player_right/player_right2.png'),
    pygame.image.load('images/player_right/player_right3.png'),
    pygame.image.load('images/player_right/player_right4.png'),
    pygame.image.load('images/player_right/player_right5.png'),
    pygame.image.load('images/player_right/player_right6.png'),
    pygame.image.load('images/player_right/player_right7.png'),
    pygame.image.load('images/player_right/player_right8.png'),
]
walk_left = [
    pygame.image.load('images/player_left/player_left1.png'),
    pygame.image.load('images/player_left/player_left2.png'),
    pygame.image.load('images/player_left/player_left3.png'),
    pygame.image.load('images/player_left/player_left4.png'),
    pygame.image.load('images/player_left/player_left5.png'),
    pygame.image.load('images/player_left/player_left6.png'),
    pygame.image.load('images/player_left/player_left7.png'),
    pygame.image.load('images/player_left/player_left8.png'),
]

player_animation_count = 0
bg_x = 0

player_speed = 5
player_x = 150
player_y = 250

is_jump = False
jump_count = 10

background_sound = pygame.mixer.Sound('sounds/background_music.mp3')
background_sound.play()


running = True
while running:

    screen.blit(background, (bg_x, 0))
    screen.blit(background, (bg_x + 1920, 0))

    keys = pygame.key.get_pressed()

    if keys[pygame.K_a]:
        screen.blit(walk_left[player_animation_count], (player_x, 800))
    else:
        screen.blit(walk_right[player_animation_count], (player_x, 800))

    if keys[pygame.K_a] and player_x > 50:
        player_x -= player_speed
    elif keys[pygame.K_d] and player_x < 550:
        player_x += player_speed

    if keys[pygame.K_w]:
        is_jump = True

    if is_jump is True:

        if jump_count >= -10:

            if jump_count < 0:
                player_y += (jump_count ** 2) // 2
            else:
                player_y -= (jump_count ** 2) // 2

            jump_count -= 1

        else:
            is_jump = False
            jump_count = 10



    if player_animation_count == 3:
        player_animation_count = 0
    else:
        player_animation_count += 1

    bg_x -= 2
    if bg_x == -1920:
        bg_x = 0


    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()

    clock.tick(144)```

Ответы

▲ 2

Основная проблема то что у Вас позиция отрисовки героя всегда на 800 (player_x, 800).

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

  • Отрисовку лучше выполнять только единожды в конце цикла.
  • Клавиши считывать не всегда а только по событию.
  • вместо таких услови if player_animation_count == 3 можете использовать число деления по модулю player_animation_index = player_animation_count % 2 будет 0 или 1 (а player_animation_count % 3 будет 0, 1 или 2) и т.п.
  • Старайтесь не использовать повторы в коде, это упростит его редактирование.

это:

walk_left = [
    pygame.image.load('images/player_left/player_left1.png'),
    pygame.image.load('images/player_left/player_left2.png'),
    pygame.image.load('images/player_left/player_left3.png'),
    pygame.image.load('images/player_left/player_left4.png'),
    pygame.image.load('images/player_left/player_left5.png'),
    pygame.image.load('images/player_left/player_left6.png'),
    pygame.image.load('images/player_left/player_left7.png'),
    pygame.image.load('images/player_left/player_left8.png'),
]

можно записать так:

walk_left = [ pygame.image.load(f'images/player_left/player_left{x}.png')
    for x in range(1, 9)]

Код:

keys = pygame.key.get_pressed() # инициация клавиш
while running:
    clock.tick(144)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
        # считываем клавиши только по событиям разгружая процесс
        if event.type == pygame.KEYDOWN or event.type == pygame.KEYUP:
            keys = pygame.key.get_pressed()
    
    if keys[pygame.K_a] and player_x > 50:
        player_x -= player_speed
    elif keys[pygame.K_d] and player_x < 550:
        player_x += player_speed
    if keys[pygame.K_w]:
        is_jump = True

    if is_jump is True:
        if jump_count >= -10:
            if jump_count < 0:
                player_y += (jump_count ** 2) // 2
            else:
                player_y -= (jump_count ** 2) // 2
            jump_count -= 1
        else:
            is_jump = False
            jump_count = 10

    if player_animation_count == 3:
        player_animation_count = 0
    else:
        player_animation_count += 1

    bg_x -= 2
    if bg_x == -1920:
        bg_x = 0

    screen.blit(background, (bg_x, 0))
    screen.blit(background, (bg_x + 1920, 0))
    screen.blit(figure[player_animation_count], (player_x, player_y))            
    pygame.display.update()