概説
Pygame ではユーザ入力はイベントとして扱われます。
キーボードやマウスの操作、ウィンドウ関連のイベントを取得し、適切に処理することがゲームの基本です。
ここではイベントループの扱い方、キー入力の取得方法、マウス入力の扱い方を説明します。
イベントループの基本
Pygame のイベントは pygame.event.get() や pygame.event.poll() で取得します。
一般的なパターンは、ゲームループ内でイベントを順次取り出して種類ごとに処理することです。
QUIT イベントはウィンドウを閉じる操作に対応します。
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
# キーが押された瞬間の処理
pass
elif event.type == pygame.KEYUP:
# キーが離された瞬間の処理
pass
キー入力の2つの取得方法
キー入力は「イベント」と「状態」の2種類の取得方法があります。
イベント(KEYDOWN/KEYUP)は押下・解放の瞬間を扱うのに適し、pygame.key.get_pressed() は現在押されているキーの状態をフレーム単位で扱うのに適しています。
# イベント方式(瞬間処理)
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
shoot()
# 状態方式(継続処理)
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= speed * dt
if keys[pygame.K_RIGHT]:
x += speed * dt
キー定数の例
主なキーは pygame.K_LEFT / K_RIGHT / K_UP / K_DOWN / K_SPACE / K_ESCAPE などの定数で表されます。日本語キーボードや入力モードによる差に注意してください。
マウス入力
マウス入力は MOUSEBUTTONDOWN / MOUSEBUTTONUP / MOUSEMOTION イベントで取得できます。
座標やボタン番号は event.pos, event.button で取得します。
GUI 要素やエイミングなどで利用します。
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
if event.button == 1: # 左クリック
handle_left_click(x, y)
elif event.type == pygame.MOUSEMOTION:
mx, my = event.pos
コントローラ(ジョイスティック)
ジョイスティックやゲームパッドを扱う場合、pygame.joystick モジュールを使用して接続デバイスを初期化し、JOYAXISMOTION, JOYBUTTONDOWN などを処理します。
複数デバイスの管理や軸の正規化に注意してください。
pygame.joystick.init()
if pygame.joystick.get_count() > 0:
joy = pygame.joystick.Joystick(0)
joy.init()
# イベント処理内で
if event.type == pygame.JOYBUTTONDOWN:
print("Button pressed", event.button)
入力処理のベストプラクティス
入力処理はゲームロジックから独立して実装するとテストやデバッグがしやすくなります。
イベントの消費漏れや大量イベントによるパフォーマンス低下を避けるため、必要なイベントのみ処理し、それ以外は無視するかまとめて捨てる工夫をします。
キーの連射や長押し判定は状態方式とイベント方式を組み合わせて実装すると柔軟です。
| イベント | 用途 |
|---|---|
| KEYDOWN/KEYUP | 押下・解放の瞬間の処理 |
| MOUSEBUTTONDOWN | クリック処理(座標取得) |
| JOYAXISMOTION | ジョイスティックの軸移動 |