2015-11-01 38 views
-1

Функция pygame.key.get_pressed() работает не так, как ожидалось, на моем Mac OSX (10.11.1), используя Python 3 и Pygame.Почему pygame.key.get_pressed не работает должным образом?

После импорта pygame и time модуля проверить, если ж ключа (pygame.K_w) нажимаются с помощью простого if -statement и Pygames pygame.key.get_pressed() функцию.

Но тест не пройден и It didn't work печатается очень много времени:

#!/usr/bin/env python3 
import pygame, time 
pygame.init() 

while True: 
    keypressed = pygame.key.get_pressed() 

    time.sleep(5) 
    print("5 seconds later") 

    if keypressed[pygame.K_w]: 
     print("it worked") 
    else: 
     print("It didn't work") 
+0

как это не работает? – Anthony

ответ

3

Первая проблема заключается в том, что вам не на самом деле создать окно Pygame. Используйте функцию pygame.display.set_mode() для инициализации окна или экрана для отображения. Обычно это делается перед вызовом основного цикла обработки событий в программе Pygame:

import pygame 
pygame.init() 

#initialize a display with 100 x 100 pix resolution 
display = pygame.display.set_mode((100,100)) 

while True: 
    #some code 

Поскольку вы не используете какую-либо функцию событий в вашем основном цикле игры, Pygame не может обрабатывать внутренние действий, такие как ключевую информация о состоянии Информация. Чтобы избежать этого вы должны вызвать pygame.event.pump() внутри цикла событий:

while True: 
    #internally process pygame event handlers 
    pygame.event.pump() 
    keypressed = pygame.key.get_pressed() 

    time.sleep(5) 
    print("5 seconds later") 

    if keypressed[pygame.K_w]: 
     print("it worked") 
    else: 
     print("It didn't work") 

Теперь ваша программа должна признать pygame.K_w ключевые действия, но только каждые 5 секунд, так как вы спите игру, используя питон time.sleep() функцию.

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

  • вызов вместо pygame.event.pump() функции pygame.event.wait() ждать события и сон игру, когда нет событий происходит:

    import pygame 
    pygame.init() 
    
    display = pygame.display.set_mode((100,100)) 
    
    while True: 
        #wait for a single event from the queue 
        pygame.event.wait() 
        keypressed = pygame.key.get_pressed() 
    
        if keypressed[pygame.K_w]: 
         print("it worked") 
        else: 
         print("It didn't work") 
    
  • использовать pygame.time.Clock объект для установки частота кадров для вашей программы:

    import pygame 
    pygame.init() 
    
    display = pygame.display.set_mode((100,100)) 
    
    clock = pygame.time.Clock() 
    
    while True: 
        pygame.event.pump() 
        keypressed = pygame.key.get_pressed() 
    
        if keypressed[pygame.K_w]: 
         print("it worked") 
        else: 
         print("It didn't work") 
    
        #compute how many milliseconds have passed since the previous call 
        clock.tick(30) 
    
1

Прежде всего, вы должны инициализировать окно pygame, а затем вызвать свою функцию, которая будет обрабатывать все ваши события (например, ждать нажатия клавиши и реагирования на нее после этого).

import pygame 
pygame.init() 
screensize = (100, 100) #choose the size, in pixels. 
window = pygame.display.set_mode(screensize) #Initialize your pygame window! 
gameloop() 

Ваш игровой цикл является функцией, которая выглядит следующим образом:

while not finished: 
    finished = doStuff() #returns True if the game should end. 
pygame.quit() 

Переменная «закончена», как предполагается, чтобы программа могла знать, когда предполагается до конца, например, после нажатия «X» в верхнем правом углу окна. Внутри этой функции мы будем слушать все события, такие как нажатие клавиши, ее отпускание, удерживание и т. Д.

def doStuff(): 
    events = pygame.event.get() #Use this function to get all the events that happened, then iterate through it. 
    finished = False 
    for event in events: 
     if event.type == pygame.KEYDOWN and event.key == pygame.K_w: 
      print("It worked!") 
     if event.type == pygame.QUIT: 
      final = True 
     else: 
      print("It didn't work") 
     #more events here 
    return finished 
Смежные вопросы