Я новичок в Python и пытаюсь сделать простую игру, в которой вы можете перемещать квадрат влево, вправо и заставлять его прыгать. Последние несколько дней я безуспешно пытаюсь сделать движение прыжка. Кто-нибудь может мне помочь?

import pygame
pygame.init()

xscreen, yscreen = 1000, 500
screen = pygame.display.set_mode((xscreen, yscreen))
pygame.display.set_caption("Pygame")

width, height = 50, 50
x, y = 950, 200
vel, jumping_points = 10, 10

run = True
while run:
    pygame.time.delay(100)

    # Checks if the player wants to quit the game.
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # Checks if a key was pressed and moves the square accordingly.
    keys = pygame.key.get_pressed()

    if keys[pygame.K_RIGHT] and x + width < xscreen:
        x += vel
    if keys[pygame.K_LEFT] and x > 0:
        x -= vel
    # Unfinished jump movement.
    if keys[pygame.K_SPACE] and y > 0:
        while True:
            if jumping_points >= -10:
                y -= (jumping_points ** 2) / 5
                jumping_points -= 1
                animation()
            else:
                jumping_points = 10
                break

    # Updates the screen surface.
    animation()

pygame.quit()

Редактирование: удалено, не имеет значения для вопроса.

user5318008

Ответов: 1

Ответы (1)

Никогда не пытайтесь реализовать цикл, управляющий игрой, внутри цикла приложения. Используйте цикл приложения. Добавьте переменную jump = False. Установите переменную при нажатии SPACE. Используйте событие KEYDOWN вместо pygame.key.get_pressed(). Реализуйте алгоритм перехода в цикле приложения вместо дополнительного цикла:

jump = False

запуск = True
while run:
    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                прыжок = True


    # Незавершенное движение прыжка.
    if jump:
        if jumping_points >= -10:
            y -= jumping_points
            точки_прыжка -= 1
        else:
            точки_перехода = 10
            прыжок = False

    # [...]

Далее необходимо изменить формулу, используемую для расчета прыжка. Результат (jump_points ** 2) всегда будет положительным, и игрок никогда не спустится:

y -= (jumping_points ** 2) / 5

y -= jumping_points

или

y -= (jumping_points ** 2) / 5 * (1 if jumping_points > 0 else -1)

Используйте pygame.time.Clock для управления количеством кадров в секунду и, соответственно, скоростью игры.

Метод tick() объекта pygame.time.Clock задерживает игру таким образом, что каждая итерация цикла занимает одинаковое время. См. pygame.time.Clock.tick():

.

Этот метод должен вызываться один раз за кадр.

Это означает, что цикл:

clock = pygame.time.Clock()
run = True
while run:
   clock.tick(60)

запускается 60 раз в секунду.


Минимальный пример:

import pygame
pygame.init()

xscreen, yscreen = 1000, 500
screen = pygame.display.set_mode((xscreen, yscreen))
pygame.display.set_caption("Pygame")
часы = pygame.time.Clock()

def animation():
    screen.fill(0)
    pygame.draw.rect(screen, (255, 0, 0), (x, y, 20, 20))
    pygame.display.flip()

ширина, высота = 50, 50
x, y = 950, 200
vel, jumping_points = 10, 10
прыжок = False


бежать = True
while run:
    clock.tick(60)

    # Проверяет, хочет ли игрок выйти из игры.
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                прыжок = True

    # Проверяет, была ли нажата клавиша, и соответствующим образом перемещает квадрат.
    keys = pygame.key.get_pressed()

    if keys[pygame.K_RIGHT] and x + width < xscreen:
        x += vel
    если keys[pygame.K_LEFT] and x > 0:
        x -= vel

    # Незавершенное движение прыжка.
    if jump:
        if jumping_points >= -10:
            
            # либо
            # y -= jumping_points
            # или
            y -= (jumping_points ** 2) / 5 * (1 если jumping_points > 0 иначе -1)
            
            точки_перехода -= 1
        иначе:
            точки_перехода = 10
            прыжок = False

    # Обновляет поверхность экрана.
    анимация()

pygame.quit()

2022 WebDevInsider