Pygame не отвечает в первый раз - PullRequest
1 голос
/ 09 января 2020

Я просто добавляю несколько последних штрихов к моей игре про танки, но есть одна маленькая вещь, которая беспокоит меня. Просто на экране меню, когда пользователь нажимает другой набор клавиш для доступа к разным вещам, таким как экран инструкций, экран игры или экран ввода пользовательского имени пользователя, требуется два нажатия кнопки для ответа, а не нужное одно нажатие. Вот небольшая выдержка из кода:

menu = True
instruct = False 
run = False 
name1 = False  
name2 = False     

while menu:
    pygame.event.get()
    theKey = pygame.key.get_pressed()

    if theKey[pygame.K_RETURN]:
        menu = False
        run = False
        instruct = True
        name1 = False

    if theKey[pygame.K_LSHIFT] or theKey[pygame.K_RSHIFT]:
        menu = False
        run = True
        begin = time.time()

    if theKey[pygame.K_BACKSPACE]:
        menu = False
        run = False
        instruct = False
        name1 = True
        user_input = ''
    menu_screen()

FONT = pygame.font.Font(None, 40)  # A font object which allows you to render text.
BG_COLOR = pygame.Color('gray12')
BLUE = pygame.Color('dodgerblue1')
USEFONT = pygame.font.Font(None, 70)
yourText1 = "Player 1, Enter Your Name: "
yourText2 = "Player 2, Enter Your Name: "
userNamePrompt = USEFONT.render(yourText1, True, BLUE)    
userNamePrompt2 = USEFONT.render(yourText2, True, BLUE)    


while name1:
    theKey = pygame.key.get_pressed()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            name1 = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_BACKSPACE:
                user_input = user_input[:-1]
            elif event.key == pygame.K_RETURN:
                name1 = False 
                name2 = True
                user2_input = ''
            else:
                user_input += event.unicode

    screen.fill(BG_COLOR)
    # Create the text surface.
    text = FONT.render(user_input, True, BLUE)
    # And blit it onto the screen.
    screen.blit(userNamePrompt, (20,20))
    screen.blit(text, (20, 300))
    pygame.display.flip()
    clock.tick(30)



while name2:
    theKey = pygame.key.get_pressed()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            name1 = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_BACKSPACE:
                user2_input = user2_input[:-1]
            elif event.key == pygame.K_RETURN:
                name2 = False
                run = True
                begin = time.time()
            else:
                user2_input += event.unicode


    screen.fill(BG_COLOR)
    # Create the text surface.
    text = FONT.render(user2_input, True, BLUE)
    # And blit it onto the screen.
    screen.blit(userNamePrompt2, (20,20))
    screen.blit(text, (20, 300))
    pygame.display.flip()
    clock.tick(30)

playName1 = user_input
playName2 = user2_input

while instruct:
    pygame.event.get()
    theKey = pygame.key.get_pressed()

    if theKey[pygame.K_BACKSPACE]:
        instruct = False
        run = False
        menu = True


    if theKey[pygame.K_LSHIFT] or theKey[pygame.K_RSHIFT]:
        instruct = False
        run = True
        begin = time.time()
    instruct_screen()

В этом случае код занимает два нажатия кнопки «возврат» или «ввод», чтобы открыть экран инструкций, и два нажатия клавиши «Shift», чтобы отобразить экран игры. - и я пытался это исправить, но безрезультатно. Кто-нибудь знает, почему это может происходить и что / как код должен быть изменен для того, чтобы он работал как нужно?

1 Ответ

0 голосов
/ 09 января 2020

Это потому, что вы звоните pygame.key.get_pressed() дважды, один раз в меню l oop и один раз на имя1 l oop. Каждый раз, когда вы вызываете его, он выталкивает событие нажатия клавиши из стека, поэтому во второй раз он будет ждать второго нажатия клавиши. Вы должны сохранить результат в первый раз и использовать его во втором l oop.

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