この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)
「src/mymod/game/event.py」の説明です。キー操作を管理するモジュールです。
複数のキーを、1つのキーに統合したり、実行状態、キー押下、キー保持の結果をオブジェクトにまとめて返したりします。この処理は、「main.py」のメインループから呼び出します。
キーの統合は、次のようになります。
キーの統合
入力キー1 | 入力キー2 | 統合キー | 意味 |
---|---|---|---|
K_LEFT |
K_a |
K_LEFT |
左 |
K_RIGHT |
K_d |
K_RIGHT |
右 |
K_UP |
K_w |
K_UP |
上 |
K_DOWN |
K_s |
K_DOWN |
下 |
K_SPACE |
K_RETURN |
K_SEL |
選択 |
K_k |
K_OPT |
オプション |
import pygame as pg
K_NONE = "none"K_LEFT = "left"K_RIGHT = "right"K_UP = "up"K_DOWN = "down"K_SEL = "select"K_OPT = "opt"
# ゲーム イベントclass GEvent: running: bool = True # 実行状態フラグ key_down: str = K_NONE # キー押下 key_keep: str = K_NONE # キー保持
# イベント処理def exec() -> GEvent: e = GEvent()
for event in pg.event.get(): if event.type == pg.QUIT: e.running = False # 終了 if event.type != pg.KEYDOWN: continue # キー押下でない
# キー押下 k = event.key r = K_NONE if k == pg.K_LEFT: r = K_LEFT # 左 if k == pg.K_RIGHT: r = K_RIGHT # 右 if k == pg.K_UP: r = K_UP # 上 if k == pg.K_DOWN: r = K_DOWN # 下 if k == pg.K_a: r = K_LEFT # 左 if k == pg.K_d: r = K_RIGHT # 右 if k == pg.K_w: r = K_UP # 上 if k == pg.K_s: r = K_DOWN # 下 if k == pg.K_SPACE: r = K_SEL # 選択 if k == pg.K_RETURN: r = K_SEL # 選択 if k == pg.K_k: r = K_OPT # オプション e.key_down = r
# キー保持 k = pg.key.get_pressed() r = K_NONE if k[pg.K_LEFT]: r = K_LEFT # 左 if k[pg.K_RIGHT]: r = K_RIGHT # 右 if k[pg.K_UP]: r = K_UP # 上 if k[pg.K_DOWN]: r = K_DOWN # 下 if k[pg.K_a]: r = K_LEFT # 左 if k[pg.K_d]: r = K_RIGHT # 右 if k[pg.K_w]: r = K_UP # 上 if k[pg.K_s]: r = K_DOWN # 下 if k[pg.K_SPACE]: r = K_SEL # 選択 if k[pg.K_RETURN]: r = K_SEL # 選択 if k[pg.K_k]: r = K_OPT # オプション e.key_keep = r
return e
まずはインポート部分を示します。
import pygame as pg
このモジュールではpygame
というフレーズが大量に出てくるのでpg
という短い名前にします。
統合キーの定義です。
K_NONE = "none"K_LEFT = "left"K_RIGHT = "right"K_UP = "up"K_DOWN = "down"K_SEL = "select"K_OPT = "opt"
ゲーム イベントを示すGEvent
クラスです。このクラスのインスタンスを、処理の戻り値として使います。
# ゲーム イベントclass GEvent: running: bool = True # 実行状態フラグ key_down: str = K_NONE # キー押下 key_keep: str = K_NONE # キー保持
イベント処理をおこなうexec()
クラスです。
まずは、戻り値用のGEvent
クラスのインスタンスe
を作成します。
# イベント処理def exec() -> GEvent: e = GEvent()
次に終了確認をおこないます。キーを押していない場合は、continue
文で処理を飛ばします。
for event in pg.event.get(): if event.type == pg.QUIT: e.running = False # 終了 if event.type != pg.KEYDOWN: continue # キー押下でない
キーを押している場合は、キーを記録します。複数キーの同時押しには対応していません。
# キー押下 k = event.key r = K_NONE if k == pg.K_LEFT: r = K_LEFT # 左 if k == pg.K_RIGHT: r = K_RIGHT # 右 if k == pg.K_UP: r = K_UP # 上 if k == pg.K_DOWN: r = K_DOWN # 下 if k == pg.K_a: r = K_LEFT # 左 if k == pg.K_d: r = K_RIGHT # 右 if k == pg.K_w: r = K_UP # 上 if k == pg.K_s: r = K_DOWN # 下 if k == pg.K_SPACE: r = K_SEL # 選択 if k == pg.K_RETURN: r = K_SEL # 選択 if k == pg.K_k: r = K_OPT # オプション e.key_down = r
キーを保持している場合は、キーを記録します。こちらも、複数キーの同時押しには対応していません。
# キー保持 k = pg.key.get_pressed() r = K_NONE if k[pg.K_LEFT]: r = K_LEFT # 左 if k[pg.K_RIGHT]: r = K_RIGHT # 右 if k[pg.K_UP]: r = K_UP # 上 if k[pg.K_DOWN]: r = K_DOWN # 下 if k[pg.K_a]: r = K_LEFT # 左 if k[pg.K_d]: r = K_RIGHT # 右 if k[pg.K_w]: r = K_UP # 上 if k[pg.K_s]: r = K_DOWN # 下 if k[pg.K_SPACE]: r = K_SEL # 選択 if k[pg.K_RETURN]: r = K_SEL # 選択 if k[pg.K_k]: r = K_OPT # オプション e.key_keep = r
最後に、イベントの状態を格納したe
を戻します。
return e
次の内容については省略します。こちらは同人誌をご覧ください。
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)