はんぎょねこの憂鬱

耳から変な汁が出てきた

Pythonゲームプログラミング #4 キー入力

#0 環境構築
#1 メインループ
#2 画像表示
#3 アニメーション
#4 キー入力
#5 サウンド
#6 衝突判定
#7 ステートマシン
#8 マップチップ
#9 スクロール

キー入力

pygameを使ったゲームプログラミングについて説明していきます。

  • Windows10
  • Python3.6.1
  • pygame1.9.3

今回はキー入力です。

ゲームに必要なキー入力のパターン

ゲームに使うキー入力のパターンは大きく分けて3つあります。「押した瞬間」「押しているか」「はなした瞬間」です。

f:id:dungeonneko:20170515111610p:plain

pygameにはキー入力用の関数が用意されていますが、ここには「押しているか」やリピート情報などのテキスト入力向けのものしかありません。押した瞬間などの検出はメインループの回で解説したイベント処理で取得できますが、プログラム内でそのまま利用するには手間がかかります。そこで、今回はゲームで使いやすいキー入力クラスを自作することにします。

キー入力クラスの実装

「押した瞬間」と「はなした瞬間」は前フレームのキーが「押されていたか」を保存しておけば、簡単に判定することができます。pygame.key.get_pressedを使えばキーが押されているかが判定できるので、これを毎フレーム保存しておくようにします。

  • 押した瞬間 = 前フレームはキーが押されていなかった && 今は押されている
  • はなした瞬間 = 前フレームはキーが押されていた && 今は押されていない

キー入力クラスの実装例

Z, X, Cキーでそれぞれ「押した瞬間」「押しているか」「はなした瞬間」が確認できます。注意すべき点として、キー情報の更新をおこなうとフレームの情報が上書きされてしまうので、KeyState.update関数は毎フレーム一度だけ呼び出すようにしておく必要があります。こういったクラスを作成しておけば、ジョイスティックやキーコンフィグなどを適用したい場合も、拡張が簡単になります。