
8-3 キーなどのイベント
同人誌について
この連載は、同人誌『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」のメインループから呼び出します。
キーの統合は、次のようになります。
キーの統合
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
次の内容については省略します。こちらは同人誌をご覧ください。
8-4 シーンとシーン管理
同人誌について
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)
このnoteの記事と、Webページに一部抜粋版を掲載しています。
技術系同人誌など まとめページ