https://www.pygame.org/docs/ref/key.html
Moduł 'key' służy do obsługi klawiatury.
Po naciśnięciu i zwolnieniu klawisza klawiatury kolejka zdarzeń pygame.event otrzymuje odpowiednio zdarzenia typu pygame.KEYDOWN i pygame.KEYUP. Oba zdarzenia mają atrybuty 'key' (ID klawisza, liczba int) oraz 'mod' (maska bitowa klawiszy modyfikujących).
Faktycznie mamy dwa sposoby na sprawdzenie, co robi urządzenie wejściowe
(input device).
(1) Bezpośrednie sprawdzenie stanu urządzenia, np. przez
pygame.key.get_pressed() [moduł pygame.key]
lub pygame.mouse.get_pos() [moduł pygame.mouse].
Otrzymamy stan urządzenia 'w chwili wywołania funkcji'.
Problemem może być "zgubienie" jakiegoś zdarzenia.
(2) Sprawdzenie atrybutów zdarzenia pobranego z kolejki zdarzeń
[moduł pygame.event].
Tutaj analizujemy zdarzenie, które nastąpiło w przeszłości,
mniej lub bardziej odległej od chwili obecnej.
Zaletą jest pewność, ze zdarzenia będą czekały w kolejce na przetworzenie.
Pojawia się problem ze stwierdzeniem, czy dwa klawisze są wciśnięte
jednocześnie, czy nie (trzeba pamiętać, że jeden klawisz jest wciśnięty,
ale jeszcze nie zwolniony).
Wnioski: należy wybrać takie podejście, które najlepiej spełni
nasze oczekiwania. Przy (1) mamy szybką reakcję, przy (2) mamy pewność,
że nie zgubimy żadnego naciśnięcia klawisza.
# box2.py
import sys
import pygame
# COLORS
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
# INITIALIZE THE GAME
pygame.init() # to zawsze na starcie
size = width, height = (400, 400)
screen = pygame.display.set_mode(size) # display Surface
pygame.display.set_caption('Box')
# CLOCK
FPS = 60 # frames per second setting
clock = pygame.time.Clock()
# LOAD IMAGES
box = pygame.Rect(10, 10, 180, 180) # Rect object
box_color = white # początkowy kolor kwadratu
# MAIN GAME LOOP
while True:
# HANDLE EVENTS
for event in pygame.event.get():
if event.type == pygame.QUIT: # QUIT Event
pygame.quit()
sys.exit(0)
# Wykrywanie wciśnięcia i puszczenia klawisza.
# SPOSÓB I - badanie zdarzeń.
elif event.type == pygame.KEYDOWN:
# print("event down dict {}".format(event.__dict__))
# atrybuty key, mod, unicode, scancode
if event.key == pygame.K_ESCAPE:
print("Właśnie wciśnięto ESC")
elif event.key == pygame.K_r:
print("Właśnie wciśnięto R")
elif event.key == pygame.K_g:
print("Właśnie wciśnięto G")
elif event.key == pygame.K_b:
print("Właśnie wciśnięto B")
elif event.type == pygame.KEYUP:
# print("event up dict {}".format(event.__dict__))
# atrybuty key, mod, scancode
if event.key == pygame.K_ESCAPE:
print("Właśnie puszczono ESC")
# CHECKING INPUTS
# SPOSÓB II - badanie stanu urządzenia (pygame.key).
keys = pygame.key.get_pressed() # tablica/tuple 0/1
# Tablica dostarcza informacji, że klawisz jest trzymany wciśnięty.
# Do indeksowania tablicy używa się ID klawiszy.
# UWAGA Tej metody nie należy używać do pobierania tekstu od usera
# (można zgubić klawisze).
#print(keys)
# Nie używamy elif, bo klawisze mogą być jednocześnie wciśnięte.
if keys[pygame.K_LEFT]: # klawisze kursorów
box.x = 10
if keys[pygame.K_RIGHT]:
box.x = 210
if keys[pygame.K_UP]:
box.y = 10
if keys[pygame.K_DOWN]:
box.y = 210
if keys[pygame.K_r]:
box_color = red
if keys[pygame.K_g]:
box_color = green
if keys[pygame.K_b]:
box_color = blue
if keys[pygame.K_q]:
pygame.quit()
sys.exit(0)
# DRAWING
screen.fill(black) # na nowo czarny ekran
pygame.draw.rect(screen, box_color, box)
pygame.display.flip()
clock.tick(FPS)