Почему Pygame отстает и как это исправить? - PullRequest
1 голос
/ 03 апреля 2020

довольно простой вопрос. У меня есть код ниже, который я только что сделал из учебника по пигмеям, и он нелепо отстает. Прыжок длится вечность, удерживая клавиши со стрелками, они не двигаются достаточно часто, в основном, частота кадров абсурдно низкая. Есть идеи как это исправить?

pygame.init()

win = pygame.display.set_mode((1000,1000))

pygame.display.set_caption("First Game")

x = 50
y = 50
width = 40
height = 60
vel = 15

isJump = False
jumpCount = 10

run = True
while run:
    pygame.time.delay(100)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT] and x > vel:
            x -= vel
        if keys[pygame.K_RIGHT] and x < 1000 - width:
            x += vel
        if not isJump:
            if keys[pygame.K_UP] and y > vel:
                y -= vel
            if keys[pygame.K_DOWN] and y < 1000 - height - vel:
                y += vel
            if keys[pygame.K_SPACE]:
                isJump = True
        else:
            if jumpCount >= -10:
                neg = 1
                if jumpCount < 0:
                    neg = -1
                y -= (jumpCount ** 2) * 0.5 * neg
                jumpCount -= 1
            else:
                isJump = False
                jumpCount = 10

        win.fill((0, 0, 0))
        pygame.draw.rect(win, (255, 0, 0), (x, y, width, height))
        pygame.display.update()

pygame.quit()

1 Ответ

1 голос
/ 03 апреля 2020

Это вопрос Отступ . Ваша игра отстает, потому что вы рисуете в событии l oop, а не в приложении l oop. Обратите внимание, что событие l oop выполняется один раз для каждого события, которое происходит (например, при нажатии кнопки или перемещении мыши). Приложение l oop выполняется непрерывно.
Сдвиг кода, который обновляет объекты, и dr aws сцена из события l oop в приложение, чтобы решить проблему:

while run:
    pygame.time.delay(100)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # INDENTATION !
    # move from event loop to application loop
    #<--|

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and x > vel:
        x -= vel
    if keys[pygame.K_RIGHT] and x < 1000 - width:
        x += vel
    if not isJump:
        if keys[pygame.K_UP] and y > vel:
            y -= vel
        if keys[pygame.K_DOWN] and y < 1000 - height - vel:
            y += vel
        if keys[pygame.K_SPACE]:
            isJump = True
    else:
        if jumpCount >= -10:
            neg = 1
            if jumpCount < 0:
                neg = -1
            y -= (jumpCount ** 2) * 0.5 * neg
            jumpCount -= 1
        else:
            isJump = False
            jumpCount = 10

    win.fill((0, 0, 0))
    pygame.draw.rect(win, (255, 0, 0), (x, y, width, height))
    pygame.display.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...