Haki zdarzeń

Pygame Zero automatycznie wyłapie i będzie wywoływać zdefiniowane przez Ciebie haki zdarzeń. To podejście oszczędza Ci potrzeby implementowania maszynerii pętli zdarzeń samemu.

Haki pętli gry

Typowa pętla gry wygląda mniej więcej tak:

while gra_nie_skończona():
    przetwarzaj_wejście()
    aktualizuj()
    rysuj()

Przetwarzanie wejścia jest trochę bardziej skomplikowane, ale Pygame Zero pozwala Ci łatwo zdefiniować funkcje update() („aktualizuj”) i draw() („rysuj”) w swoim module gry.

draw()

Wywoływana przez Pygame Zero kiedy potrzebuje odrysować zawartość okna gry.

draw() nie może przyjmować żadnych argumentów.

Pygame Zero próbuje ustalić, kiedy trzeba odrysować ekran gry, żeby uniknąć rysowania jeśli nic się nie zmieniło. W każdym kroku pętli gry ekran zostanie odrysowany w następujących sytuacjach:

  • Gdy masz zdefiniowaną funkcję update() (zobacz niżej).

  • Gdy zegar uruchomi jakieś zdarzenie.

  • Gdy nastąpi zdarzenie wejścia.

Możesz się na to naciąć, jeśli spróbujesz zmienić stan gry albo uruchomić jakąś animację wewnątrz funkcji draw. Na przykład, ten kod jest błędny: nie ma gwarancji, że kosmita będzie się przesuwał po ekranie:

def draw():
    alien.left += 1
    alien.draw()

Prawidłowy kod używa update() by zmieniać albo animować obiekty, a draw tylko do rysowania zawartości ekranu:

def draw():
    alien.draw()

def update():
    alien.left += 1
update() albo update(dt)

Wywoływane przez Pygame Zero jako krok w logice Twojej gry. Ta funkcja będzie wywoływana w kółko, 60 razy an sekundę.

Są dwa podejścia do pisania funkcji update.

W prostych grach możesz przyjąć, że pomiędzy wywołaniami update upływa bardzo krótki czas (ułamek sekundy). Może nawet nie interesować Cię, jaki to jest czas: możesz po prostu przesuwać obiekty o określoną liczbę pikseli co klatkę (albo przyspieszać je w określonym tempie, itd.).

Bardziej zaawansowanym podejściem jest bazowanie ruchu i obliczeń fizycznych na odstępie czasu który faktycznie upłynął pomiędzy wywołaniami. To może dać płynniejszą animację, ale obliczenia robią się przez to trudniejsze, i musisz bardziej uważać, by unikać nieprzewidywalnych zachowań gdy odtępy czasu stają się większe.

Aby użyć podejścia opartego na czasie, możesz zmienić funkcję update tak by przyjmowała jeden parametr. Jeśli Twoja funkcja update przyjmuje argument, Pygame Zero przekaże do niej upływ czasu w sekundach. Możesz go użyć w swoich obliczeniach ruchu.

Haki obsługi zdarzeń

Podobnie do haków pętli gry, Twój program w Pygame Zero może reagować na zdarzenia wejścia, definiując funkcje o specjalnych nazwach.

Trochę podobnie jak w przypadku update(), Pygame Zero przyjrzy się Twoim funkcjom obsługi zdarzeń, by dowiedzieć się, jak je wywoływać. Nie muszą więc one przyjmować argumentów. Na przykład, Pygame Zero bez problemu wywoła każdą z tych wersji funkcji on_mouse_down:

def on_mouse_down():
    print("Kliknięto przcisk myszy")

def on_mouse_down(pos):
    print("Kliknięto przycisk myszy w punkcie", pos)

def on_mouse_down(button):
    print("Kliknięto przycisk myszy", button)

def on_mouse_down(pos, button):
    print("Kliknięto przycisk myszy", button, "w punkcie", pos)

Robi to, sprawdzając nazwy parametrów, dlatego muszą być one nazwane dokładnie tak jak powyżej. Każde zdarzenie ma inny zestaw parametrów którego możesz użyć, zgodnie z poniższym opisem.

on_mouse_down([pos][, button])

Wywoływane po wciśnięciu przycisku myszy.

Parametry
  • pos – Zestaw (x, y) wskazujący lokalizację wskaźnika myszy w momencie wciśnięcia przycisku.

  • button – Jedna z wartości wyliczenia mouse, wskazująca, który przycisk został wciśnięty.

on_mouse_up([pos][, button])

Wywoływane po puszczeniu przycisku myszy.

Parametry
  • pos – Zestaw (x, y) wskazujący lokalizację wskaźnika myszy w momencie puszczenia przycisku.

  • button – Jedna z wartości wyliczenia mouse, wskazująca, który przycisk został puszczony.

on_mouse_move([pos][, rel][, buttons])

Wywoływane podczas ruchu myszy.

Parametry
  • pos – Zestaw (x, y) wskazujący lokalizację, do której został przesunięty wskaźnik myszy.

  • rel – Zestaw (delta_x, delta_y) reprezentujący zmianę pozycji wskaźnika myszy.

  • buttons – Zestaw wartości wyliczenia mouse, wskazujący przyciski wciśnięte podczas ruchu.

Aby obsłużyć przeciąganie myszą, użyj kodu takiego jak ten:

def on_mouse_move(rel, buttons):
    if mouse.LEFT in buttons:
        # nastąpiło przeciąganie myszą, zrób coś z `rel`
        ...
on_key_down([key][, mod][, unicode])

Wywoływane po wciśnięciu klawisza.

Parametry
  • key – Liczba oznaczająca wciśnięty klawisz (zob. niżej).

  • unicode – Tam gdzie to stosowne — znak który został wpisany. Nie wszystkie klawisze dają w rezultacie widoczne znaki — wiele może być znakami kontrolnymi. W przypadku, gdy klawisz nie odpowiada znakowi Unicode, ten parametr będzie pustym napisem.

  • mod – Mapa bitowa wciśniętych klawiszy modyfikujących.

on_key_up([key][, mod])

Wywoływane po puszczeniu klawisza.

Parametry
  • key – Liczba oznaczająca puszczony klawisz (zob. niżej).

  • mod – Mapa bitowa wciśniętych klawiszy modyfikujących.

on_music_end()

Wywoływane po zakończeniu ścieżki z muzyką.

Zwróć uwagę, że ta funkcja nie będzie wywołana, jeśli muzyka jest ustawiona jako zapętlona.

Przyciski i klawisze

Wbudowane obiekty mouse („mysz”) i keys („klawisze”) służą do ustalania, które przyciski lub klawisze były wciśnięte podczas powyższych zdarzeń.

Zwróć uwagę, że zdarzenia kręcenia kółkiem myszy pojawiają się jako wciśnięcia przycisku zdefiniowanych niżej stałymi WHEEL_UP („kółko w górę”) i WHEEL_DOWN („kółko w dół”).

class mouse

Wbudowane wyliczenie przycisków, które można odbierać funkcjami obsługi on_mouse_*.

LEFT
MIDDLE
RIGHT
WHEEL_UP
WHEEL_DOWN
class keys

Wbudowane wyliczenie klawiszy, które można odbierać funkcjami obsługi on_key_*.

BACKSPACE
TAB
CLEAR
RETURN
PAUSE
ESCAPE
SPACE
EXCLAIM
QUOTEDBL
HASH
DOLLAR
AMPERSAND
QUOTE
LEFTPAREN
RIGHTPAREN
ASTERISK
PLUS
COMMA
MINUS
PERIOD
SLASH
K_0
K_1
K_2
K_3
K_4
K_5
K_6
K_7
K_8
K_9
COLON
SEMICOLON
LESS
EQUALS
GREATER
QUESTION
AT
LEFTBRACKET
BACKSLASH
RIGHTBRACKET
CARET
UNDERSCORE
BACKQUOTE
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
DELETE
KP0
KP1
KP2
KP3
KP4
KP5
KP6
KP7
KP8
KP9
KP_PERIOD
KP_DIVIDE
KP_MULTIPLY
KP_MINUS
KP_PLUS
KP_ENTER
KP_EQUALS
UP
DOWN
RIGHT
LEFT
INSERT
HOME
END
PAGEUP
PAGEDOWN
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
F13
F14
F15
NUMLOCK
CAPSLOCK
SCROLLOCK
RSHIFT
LSHIFT
RCTRL
LCTRL
RALT
LALT
RMETA
LMETA
LSUPER
RSUPER
MODE
HELP
PRINT
SYSREQ
BREAK
MENU
POWER
EURO
LAST

Dodatkowo, masz dostęp do zestawu stałych reprezentujących klawisze modyfikujące:

class keymods

Stałe reprezentujące klawisze modyfikujące, które mogą być wciśnięte podczas zdarzeń on_key_up/on_key_down.

LSHIFT
RSHIFT
SHIFT
LCTRL
RCTRL
CTRL
LALT
RALT
ALT
LMETA
RMETA
META
NUM
CAPS
MODE