見出し画像

4-7 Pygameのマウス入力

同人誌について

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

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


マウス入力の例

 マウス入力の例を示します。

 マウス入力には、「マウスを操作した瞬間」を検出する方法と、「マウスの現在の状態」を検出する方法の2種類があります。前者は、ボタンのクリックなどの操作に向いています。後者は、キャラクターの移動などに向いています。

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

import pygame

def main():
    pygame.init()       # Pygameを初期化
    screen = pygame.display.set_mode((800, 600))    # 画面作成
    image = pygame.image.load("image/icon.png")     # 画像
    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.MOUSEBUTTONDOWN:    # ボタン下げ
                if event.button == pygame.BUTTON_LEFT:  # 左ボタン
                    print(event.pos, "DOWN")
            if event.type == pygame.MOUSEBUTTONUP:      # ボタン上げ
                if event.button == pygame.BUTTON_LEFT:  # 左ボタン
                    print(event.pos, "UP")
            if event.type == pygame.MOUSEMOTION:    # マウス移動
                print(event.pos)

        # 状態取得
        pressed = pygame.mouse.get_pressed()
        if pressed[0]:  # 左クリック
            image.set_alpha(128)   # 半透明
        else:
            image.set_alpha(255)   # 不透明
        screen.blit(image, pygame.mouse.get_pos()) # 描画
        pygame.display.flip()   # 画面フリップ
    pygame.quit()

if __name__ == "__main__":
    main()

 まずは『Pygame』の初期化処理です。

import pygame

def main():
    pygame.init()       # Pygameを初期化
    screen = pygame.display.set_mode((800, 600))    # 画面作成
    image = pygame.image.load("image/icon.png")     # 画像
    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.MOUSEBUTTONDOWN:    # ボタン下げ
                if event.button == pygame.BUTTON_LEFT:  # 左ボタン
                    print(event.pos, "DOWN")
            if event.type == pygame.MOUSEBUTTONUP:      # ボタン上げ
                if event.button == pygame.BUTTON_LEFT:  # 左ボタン
                    print(event.pos, "UP")
            if event.type == pygame.MOUSEMOTION:    # マウス移動
                print(event.pos)

 `event.type`が`pygame.MOUSEBUTTON~`のときに、マウスのボタンの状態を確認できます。また、`pygame.MOUSEMOTION`のときに、マウスの移動を確認できます。

 続いて、マウスの現在の状態の検出を示します。

        # 状態取得
        pressed = pygame.mouse.get_pressed()
        if pressed[0]:  # 左クリック
            image.set_alpha(128)   # 半透明
        else:
            image.set_alpha(255)   # 不透明
        screen.blit(image, pygame.mouse.get_pos()) # 描画
        pygame.display.flip()   # 画面フリップ
    pygame.quit()

 `pygame.mouse.get_pressed()`関数の戻り値を利用します。

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

操作した瞬間を検出する方法

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

        for event in pygame.event.get():    # イベント
            if event.type == pygame.QUIT: running = False   # 終了
            if event.type == pygame.MOUSEBUTTONDOWN:    # ボタン下げ
                if event.button == pygame.BUTTON_LEFT:  # 左ボタン
                    print(event.pos, "DOWN")
            if event.type == pygame.MOUSEBUTTONUP:      # ボタン上げ
                if event.button == pygame.BUTTON_LEFT:  # 左ボタン
                    print(event.pos, "UP")
            if event.type == pygame.MOUSEMOTION:    # マウス移動
                print(event.pos)

 `event`にはさまざまな情報が含まれています。そして、`event.type`が`pygame.MOUSE~`のときにマウスが操作されています。

 ボタン操作時は`event.button`の値を調べると、操作が発生したボタンが分かります。ボタンの種類は`pygame.BUTTON_~`の形式です。また、`event.pos`でマウス カーソルの位置を得られます。

現在の状態を検出する方法

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

        pressed = pygame.mouse.get_pressed()
        if pressed[0]:  # 左クリック
            image.set_alpha(128)   # 半透明
        else:
            image.set_alpha(255)   # 不透明
        screen.blit(image, pygame.mouse.get_pos()) # 描画

 `pygame.mouse.get_pressed()`の戻り値は、真偽値のリストです。要素0がボタン1、要素1がボタン2……です。マウス カーソルの位置は`pygame.mouse.get_pos()`で得られます。


同人誌について

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

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

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

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


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