【pygame】チャプター2-2:マウスでキャラクターを操作しよう

一つ前のページではキーボードでキャラクターを動かす方法について学習しました。
今回は マウスでキャラクターを動かす方法 について見ていきましょう。
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
・Chapter2-1:キーボードでキャラクターを動かそう
・Chapter2-2:マウスでキャラクターを動かそう ◁今回はここ
・Chapter2-3:画面にボタンを表示しよう
・Chapter2-4:紙芝居を作ろう
・Chapter2-5:ノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Extra1:横スクロールのアクションゲームを作ろう
ゲームではキャラクターを操作する手段として、キーボード以外にもマウスを使用することがよくあります。
例えば、マウスでキャラクターを好きな場所に移動させたり、クリックして特定の動作をさせたりすることが可能です。
今回の記事では、マウスを使ってキャラクターを動かす方法を学びます。具体的には、次のようなことを学びます。
- マウスの入力を取得する方法
- マウスの位置にキャラクターを移動させる方法
- 左クリックと右クリックで異なる動作をさせる方法
これらの基本を理解すると、ドラッグ&ドロップやクリックでキャラクターを操作するゲームが作れるようになります。
まずは、pygameにおけるマウス入力の基本から見ていきましょう!

マウス入力の基本を理解しよう
マウスを使ってキャラクターを動かすためには、pygameでマウスの入力を取得する方法を理解する必要があります。
pygameでは、以下の二つの状態を取得することができます。
- マウスのボタンがクリックされたか
- マウスのカーソルがどこにいるか(座標)

クリック状態の取得|mouse.get_pressed()関数の使い方
マウスのボタンが押されているかどうかを確認するには、pygame.mouse.get_pressed()関数 を使用します。
(一つ前のChapterで学習した pygame.key.get_pressed と似ていますね)
この関数はマウスのボタンの押下状態をリストで返します。
mdown = pygame.mouse.get_pressed() # get_pressedメソッドにて「今押されているボタン」を取得して変数mdownに代入
この mdown には、以下の3つの値が格納されます。
| インデックス | ボタン | 
|---|---|
| mdown[0] | 左クリック | 
| mdown[1] | 中クリック(ホイール) | 
| mdown[2] | 右クリック | 
例えば左クリックが押されているかどうかを確認するには、次のように条件分岐を行います。
if mdown[0]:  # もし左クリックが押されているなら
    print("左クリックが押されました!")カーソル座標の取得|mouse.get_pos()関数の使い方
マウスカーソルの現在の位置を取得するには、pygame.mouse.get_pos()関数 を使用します。
この関数はマウスの現在位置 (x, y) のタプルを返します。
(mx, my) = pygame.mouse.get_pos()
print(f"マウスの位置: {mx}, {my}")例えば、ゲームの中でマウスの位置にキャラクターを表示したい場合は、blit() 関数を使ってキャラクター画像を描画することができます。
screen.blit(画像変数, (mx, my))
瞬間的なクリックを検出|event.get()関数の使い方
pygame.mouse.get_pressed() は、ボタンが押されている間ずっと True を返しますが、一度だけクリックを検出したい場合は、pygame.event.get() を使います。
for event in pygame.event.get():
    if event.type == pygame.MOUSEBUTTONDOWN:  # マウスボタンが押された瞬間
        print("マウスがクリックされました!")
    elif event.type == pygame.MOUSEBUTTONUP:  # マウスボタンが離された瞬間
        print("マウスが離されました!")マウスの位置に画像を表示する方法
マウスカーソルの現在位置を取得し、その位置に画像を描画することで、キャラクターをマウスの動きに合わせて表示できます。
次のコードではマウスの座標を取得し、その位置に犬の画像 (inu.png) を描画します。
↓↓の画像を使い、ぜひ画面上でマウスをクリックしたまま動かしてみてください。

# 初期化(ゲームの準備をする)
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((800,600))
img_path = Path(__file__).parent / "images" / "inu.png" # 画像のパスを取得
inu = pygame.image.load(str(img_path))
# メインループ
while True:
    # 画面を初期化する
    screen.fill(pygame.Color("WHITE"))
    # ユーザー入力
    mdown = pygame.mouse.get_pressed()
    (mx, my) = pygame.mouse.get_pos()
    #画面を作る
    if mdown[0]:
        screen.blit(inu, (mx-100, my-100))
    if mdown[2]:
        pygame.draw.rect(screen, pygame.Color("RED"),(mx, my, 100, 100))
    #描写処理
    pygame.display.update()
    pygame.time.Clock().tick(60)
    # 終了処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()まとめ|マウス入力を使いこなそう
ここまで、pygameを使ってマウス操作でキャラクターを動かす方法を学んできました。
次の章ではマウスを使ってボタンを押す方法を学びます。
ボタンのクリック判定や、クリックした際の処理を実装し、さらにインタラクティブなゲームを作れるようになりましょう!
- サイト改善アンケート|ご意見をお聞かせください(1分で終わります)
- 
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。 
 そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。1分だけ、ご協力いただけますと幸いです。 【pygame】サイト改善アンケート
マウス操作の疑問解消|FAQとよくあるトラブル
初心者がつまずきやすいポイントをFAQとしてまとめ、またよくあるトラブルとその解決法をわかりやすく整理しました。
理解を深めたいときや、ふと疑問に感じたときに役立ててください。
FAQ|マウスでキャラクターを動かす方法に関するよくある質問
今回の記事に関する「よくある質問」とその解答について、以下の内容を参考にしてください。
- Q1. マウスでキャラクターを操作するゲームを作るメリットは何ですか?
- 
マウス操作は直感的で、初心者でも簡単にキャラクターを動かせるのが最大のメリットです。 また、ドラッグ&ドロップやクリックによるアクションなど、幅広いインタラクションを実現できるため、ゲームの表現力やユーザー体験が向上します。 
- Q2. pygameでキャラクターをマウスに追従させる基本的な方法は何ですか?
- 
pygame.mouse.get_pos()を使って現在のマウス座標を取得し、その座標にキャラクターの位置を更新するのが基本です。ループ内で毎フレーム座標を取得・更新することで、スムーズに追従させられます。 
- Q3. マウスボタンの状態によってキャラクターの挙動を変えるにはどうすれば良いですか?
- 
pygame.mouse.get_pressed()を活用すると、マウスのボタンが押されているかどうかを判定できます。例えば、左ボタンを押したときだけ特定の動作をさせる、ドラッグ中だけ移動させるなど、細かな制御が可能です。 
マウスでキャラクターを動かす際によくあるトラブルと解決法
今回の記事に関する「よくあるトラブル」とその原因、解決法について、以下の内容を参考にしてください。
キャラクターがマウスに追従しない
- トラブルの原因と対処法を見る
- 
トラブルの原因- マウス座標の取得やキャラクターの位置更新処理が正しく行われていない
- イベントループ内でpygame.mouse.get_pos()の呼び出しが抜けている
 トラブルの解決法メインループ内で毎フレーム pygame.mouse.get_pos()を呼び出しているか確認し、取得した座標をキャラクターの描画位置として使用しているか確認してください。また、キャラクターの座標更新処理に誤りがないか、実際のコードの該当部分をチェックしましょう。 
クリックしてもキャラクターが反応しない
- トラブルの原因と対処法を見る
- 
トラブルの原因- pygame.mouse.get_pressed()の使い方にミスがある
- マウスボタンの判定箇所や条件式の記述ミス
 トラブルの解決法クリック判定に使っている pygame.mouse.get_pressed()の戻り値をどのように扱っているか確認してください。例えば、 if pygame.mouse.get_pressed()[0]:のように左クリックを判定しているか、インデックス番号や条件式に間違いがないかソースコードを確認してみましょう。
キャラクターが画面外に出てしまう
- トラブルの原因と対処法を見る
- 
トラブルの原因マウス座標をそのままキャラクター位置に反映しているため、ウィンドウ端での制御が抜けている トラブルの解決法マウスの座標値が画面サイズを超えていないかチェックしてください。 キャラクターのサイズやウィンドウサイズを考慮し、座標がウィンドウ内に収まるように処理を追加する必要があります。 必要に応じて min()やmax()関数などで値の範囲を制限しましょう。



