Почему этот код работает за пределами основного l oop в Pygame - PullRequest
2 голосов
/ 08 марта 2020

Я новичок в использовании Pygame, и я следовал учебник на YouTube. У меня возникла проблема с движением, которое парень из учебного пособия мог двигать, просто удерживая кнопку, которую я не мог. Мне приходилось постоянно нажимать на кнопку, я точно следовал его коду.
Я искал в Интернете и обнаружил, что этот код

(pygame.key.set_repeat(True)

может решить проблему, но ему не сказали, где его поставить, вот код:

import pygame 
pygame.init()

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

pygame.display.set_caption("My First Pygame")

x = 50 
y = 425
width = 40
height = 60
vel = 5

isJump = True
jumpCount = 10 
pygame.key.set_repeat(True)
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 < 500 - width - vel:
            x += vel
        if not(isJump):    
            if keys[pygame.K_UP] and y > vel:
                y -=vel
            if keys[pygame.K_DOWN] and y < 500 -height - vel:
                y +=vel
            if keys[pygame.K_SPACE]:
                isJump = True
        else:
            if jumpCount >= -10:
                y -= (isJump ** 2) / 2
                jumpCount -= 1

            else:
                isJump = False
                jumpCount = 10


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


pygame.quit()

Сначала у меня был код, написанный под строкой, который говорит:

keys = pygame.key.get_pressed() 

, он не работал, но как только я вынул его из основного l oop и поместил его перед в то время как l oop теперь это работает. Я могу удерживать клавишу нажатой и заставлять моего персонажа двигаться без необходимости постоянного нажатия. Мой вопрос: почему это работает сейчас?

1 Ответ

1 голос
/ 08 марта 2020

Это вопрос Отступ . Вы поместили весь код в событие l oop, а не в приложение l oop.
Событие l oop выполняется один раз для каждого события. Приложение l oop выполняется один раз в каждом кадре.
Каждый раз, когда кнопка нажата или отпущена, генерируется событие кнопки. Событие KEYDOWN и KEYUP возвращается pygame.event.get() и выполняется событие l oop. Для непрерывного перемещения вы должны получить текущее состояние клавиш в приложении l oop и обновить положение объекта в каждом кадре.

Переместить код из события l oop в приложение l oop для решения вопроса. Например:

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

    # event loop
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    #<--| INDENTATION!     
    keys = pygame.key.get_pressed()

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

        else:
            isJump = False
            jumpCount = 10

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

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