PythonとPygameで作る レトロ風RPG 全コード

同人誌について

 この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。

 同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。

(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)


8-3 キーなどのイベント

公開:2024-04-22

説明と全体コード

 「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 に更新)

 技術系同人誌など まとめページ


トップページに戻る
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について