見出し画像

4-6 Pygameのキー入力

同人誌について

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

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


キー入力の例

 キー入力の例を示します。

 キー入力には、「キーを押した瞬間」を検出する方法と、「キーが現在押されているか」を検出する方法の2種類があります。前者は、メニューの選択や決定の操作に向いています。後者は、キャラクターの移動などに向いています。

 「example_pygame/key.py」を示します。

import pygame

def main():
    pygame.init()       # Pygameを初期化
    screen = pygame.display.set_mode((800, 600))    # 画面作成
    image = pygame.image.load("image/icon.png")     # 画像読み込み
    x, y = 0, 0         # XY座標
    running = True      # 実行継続フラグ

    while running:
        pygame.display.update()     # 画面を更新
        screen.fill(pygame.Color(0, 0, 0))  # 画面を塗りつぶす

        for event in pygame.event.get():    # イベント
            if event.type == pygame.QUIT: running = False   # 終了
            if event.type == pygame.KEYDOWN:    # キー押下
                if event.key == pygame.K_r: x = 0; y = 0    # Rでリセット

        keys = pygame.key.get_pressed() # キー保持
        if keys[pygame.K_LEFT]:  x -= 0.5   # 左
        if keys[pygame.K_RIGHT]: x += 0.5   # 左
        if keys[pygame.K_UP]:    y -= 0.5   # 上
        if keys[pygame.K_DOWN]:  y += 0.5   # 下

        screen.blit(image, (x, y))  # 描画
        pygame.display.flip()   # 画面フリップ
    pygame.quit()

if __name__ == "__main__":
    main()

 まずは『Pygame』の初期化処理です。画像を読み込み、XY位置を用意します。このあとXY位置をキー操作で動かして、画像の描画位置を変更します。

import pygame

def main():
    pygame.init()       # Pygameを初期化
    screen = pygame.display.set_mode((800, 600))    # 画面作成
    image = pygame.image.load("image/icon.png")     # 画像読み込み
    x, y = 0, 0         # XY座標
    running = True      # 実行継続フラグ

 メイン ループの中で、キー入力の判定をおこないます。ここでは、キーを押した瞬間の検出を示します。

    while running:
        pygame.display.update()     # 画面を更新
        screen.fill(pygame.Color(0, 0, 0))  # 画面を塗りつぶす

        for event in pygame.event.get():    # イベント
            if event.type == pygame.QUIT: running = False   # 終了
            if event.type == pygame.KEYDOWN:    # キー押下
                if event.key == pygame.K_r: x = 0; y = 0    # Rでリセット

 `event.type`が`pygame.KEYDOWN`のときに、`event.key`に`pygame.K_r`が入っているか確認します。この条件を満たすとき、キーボードの「R」キーが押されています。このとき、XY座標を`0`に戻します。

 続いて、キーが現在押されているかの検出を示します。

        keys = pygame.key.get_pressed() # キー保持
        if keys[pygame.K_LEFT]:  x -= 0.5   # 左
        if keys[pygame.K_RIGHT]: x += 0.5   # 左
        if keys[pygame.K_UP]:    y -= 0.5   # 上
        if keys[pygame.K_DOWN]:  y += 0.5   # 下

        screen.blit(image, (x, y))  # 描画
        pygame.display.flip()   # 画面フリップ
    pygame.quit()

 `pygame.key.get_pressed()`関数の戻り値を利用します。上下左右が押されているあいだ、XY座標を`0.5`ずつ、その方向に移動します。

 これらの処理を、より詳しく見ていきましょう。

押した瞬間を検出する方法

 `pygame.event.get()`を使います。そして`for in`文で`event`を得ます。

        for event in pygame.event.get():    # イベント
            if event.type == pygame.QUIT: running = False   # 終了
            if event.type == pygame.KEYDOWN:    # キー押下
                if event.key == pygame.K_r: x = 0; y = 0    # Rでリセット

 `event`にはさまざまな情報が含まれています。そして、`event.type`が`pygame.KEYDOWN`のときにキーが押されています。

 キーが押されているときに`event.key`の値を調べると、どのキーが押されているか分かります。キーの種類は`pygame.K_~`の形式です。ここでは`pygame.K_r`を使い、「R」キーを押したかを調べています。

 ドキュメントの「key」のページに、キーの種類の表があります。

https://www.pygame.org/docs/ref/key.html

現在押されているかを検出する方法

 `pygame.key.get_pressed()`を使います。

        keys = pygame.key.get_pressed() # キー保持
        if keys[pygame.K_LEFT]:  x -= 0.5   # 左
        if keys[pygame.K_RIGHT]: x += 0.5   # 左
        if keys[pygame.K_UP]:    y -= 0.5   # 上
        if keys[pygame.K_DOWN]:  y += 0.5   # 下

 `pygame.key.get_pressed()`の戻り値は、真偽値のリストです。`pygame.K_~`で要素を調べると、そのキーが押されているかが分かります。キーの種類は、先ほどと同じです。


同人誌について

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

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

 このnoteの記事と、Webページに一部抜粋版を掲載しています。

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


いいなと思ったら応援しよう!