イベントのフック

イベントのフック(検知)を定義すると Pygame Zero はそのイベントに対応する処理を呼び出してくれるようになっています。この仕組みにより、イベント・ループの仕組みをわざわざ自分で書く必要はありません。

ゲーム・ループのフック

通常、ゲームのプログラムでは次のようなゲーム・ループを書く必要があります

while game_has_not_ended():
    process_input()
    update()
    draw()

そしてもっと複雑な入力処理を書く必要があるのですが、Pygame Zero を使うと update()draw() という関数をゲームプログラムに定義するだけで済みます。

draw()

ゲームのスクリーンの再描画が必要なとき、Pygame Zero はこの関数を呼び出します。

draw() に引数はありません。

Pygame Zero は何も変更がなく、再描画の必要がなければ処理をスキップするようになっています。ゲーム・ループの繰り返しで、次の条件が当てはまるときだけスクリーンの再描画が行われます。

  • 関数 update() が定義されているとき(後述)。
  • クロック・イベントが発生したとき。
  • 入力イベントが発生したとき。

ここで注意してほしいのは、draw 関数で表示内容を変更したり動かしたりするときの書き方です。たとえば次のコードは間違っています。エイリアンをスクリーン上で横に動かしたいのですが、意図したようには動きません。

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

以下が正しいコードです。表示内容を変えたり動かしたり、あるいは単にスクリーンに色を塗りたいときは、 update() を使います

def draw():
    alien.draw()

def update():
    alien.left += 1
update() または update(dt)

Pygame Zero はゲームを進めるためにこの関数を呼び出します。この関数は1秒間に60回、くり返し呼び出されます。

update 関数はアプローチの異なる二通りの書き方があります。

簡単なゲームの場合、 update() 呼び出しから次の呼び出しまでの1ステップに必要な時間はわずか、ほんの一瞬とみなせます。おそらくその時間がどれくらいか気にすることもないでしょう。この場合1フレームで行う処理は、オブジェクトをある決まったピクセル数だけ動かしたり、あるいは決まった割合で加速させたり、などです。

より高度なアプローチは、呼び出しから呼び出しの間にかかった時間をベースに運動と物理の計算を行うことです。この方法を使うとアニメーションを滑らかに表示できる一方で、計算量が大きくなる可能性があり、またその計算に時間が長くかかったときに予想外の振舞いをしないよう注意しなければなりません。

時間ベースのアプローチを使用する場合は、update が一つの引数を受け取るようにします。関数updateに引数が設定されている場合、Pygame Zero は秒単位の経過時間を引数として渡します。この結果、その時間に応じた動きを計算をすることが可能になります。

イベント処理のフック

ゲームループのフックと同様に、Pygame Zero プログラムでは特定の名前で関数を定義することにより、入力イベントも処理することができます。

update() と同じように、Pygame Zero はイベントハンドラ関数を調べてその呼び出し方法を判別します。ですからイベントハンドラ関数の引数は必須ではありません。たとえば Pygame Zero は以下の on_mouse_down 関数のバリエーションの内、どれを使ってもちゃんと呼び出してくれます。

def on_mouse_down():
print("マウスのボタンがクリックされました")
def on_mouse_down(pos):
print("マウスのボタンが", pos, "の位置でクリックされました")
def on_mouse_down(button):
print("マウスの", button, "ボタンがクリックされました")
def on_mouse_down(pos, button):
print("マウスの", button, "ボタンが", pos, "の位置でクリックされました")

判別は引数の名前によって行なわれます。ですから引数を使う場合、名前は正確に入力する必要があります。それぞれのイベント・フックで使用できる引数の内訳を以下に記載します。

on_mouse_down([pos][, button])

マウスボタンが押されたときに呼び出されます。

パラメータ:
  • pos -- (x, y)形式のタプルで、ボタンが押されたときのマウス・ポインタの位置を示します。
  • button -- 列挙型 mouse の値で押されたボタンがどれかを示します。
on_mouse_up([pos][, button])

マウスボタンが離されたときに呼び出されます。

パラメータ:
  • pos -- (x, y)形式のタプルで、ボタンが離されたときのマウス・ポインタの位置を示します。
  • button -- 列挙型 mouse の値で離されたボタンがどれかを示します。
on_mouse_move([pos][, rel][, buttons])

マウスが動かされたときに呼び出されます。

パラメータ:
  • pos -- (x, y)形式のタプルで、動かした先のマウス・ポインタの位置を示します。
  • rel -- (delta_x, delta_y)形式のタプルで、マウス・ポインタの位置の変化量を示します。
  • buttons -- 列挙型 mouse の値の集合です。移動の間押されていたボタン(複数)を示します。

マウスのドラッグを処理したいときは、次のコードを参考にしてください

def on_mouse_move(rel, buttons):
    if mouse.LEFT in buttons:
        # マウスがドラッグされた。`rel` を使って続く処理を記述する
        ...
on_key_down([key][, mod][, unicode])

キーが押されたときに呼び出されます。

パラメータ:
  • key -- 整数で、押されたキーを示します(下記参照)。
  • unicode -- キーで入力された文字。ただし制御文字のように表示できない文字の場合もあります。キーに対応しているユニコードが無い場合は空文字列となります。
  • mod -- 押された修飾キーのビットマスク。
on_key_up([key][, mod])

キーが離されたときに呼び出されます。

パラメータ:
  • key -- 整数で、離されたキーを示します(下記参照)。
  • mod -- 押された修飾キーのビットマスク。
on_music_end()

音楽のトラック が完了したときに呼び出されます。

ただしトラックにループ設定がされている場合、この関数が呼び出されることはないので注意してください。

マウスのボタンとキー

組込みのオブジェクト mousekeys は前述のイベントでどのボタンやキーが押されたのかを示すために使われます。

マウスのスクロールホイールのイベントは次に記載したボタンの定数 WHEEL_UP または WHEEL_DOWN のボタン操作として扱われます。

class mouse

マウスのボタンを示す組込みの列挙型オブジェクトで、 on_mouse_* ハンドラに渡されます。

LEFT
MIDDLE
RIGHT
WHEEL_UP
WHEEL_DOWN
class keys

キーを示す組込みの列挙型オブジェクトで、 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

そのほかにも修飾キーを表す定数があります。

class keymods

on_key_up または on_key_down イベント発生のとき押されていた修飾キーを示す定数です。

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