見出し画像

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ページに一部抜粋版を掲載しています。

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


この記事が気に入ったらサポートをしてみませんか?