【pygame】チャプター2-1:キーボードでキャラクターを操作しよう

一つ前のチャプターではpygameの基本について学習しました。
今回からは キャラクターや画像を操作する方法 について見ていきましょう。
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
 ・Chapter2-1:キーボードでキャラクターを動かそう ◁今回はここ
 ・Chapter2-2:マウスでキャラクターを動かそう
 ・Chapter2-3:画面にボタンを表示しよう
 ・Chapter2-4:紙芝居を作ろう
 ・Chapter2-5:ノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Extra1:横スクロールのアクションゲームを作ろう
ゲームを作るとき、キャラクター等の画像が画面上で動くことはとても重要です。
静止した画像だけではインタラクティブな要素が少なく、ゲームとしての面白さが半減してしまいます。
そこで、今回は キーボードの左右キーを使ってキャラクターを動かす方法 を学んでいきます。
これは「ユーザーの入力を受け取ってゲームを操作する」ことの第一歩です。
この章を学ぶことで、ゲームにおける基本的な操作性を実装できるようになります。さっそく、キーボード入力を取得する方法から見ていきましょう!

キーボード入力の基礎|連続状態と瞬間イベント
ゲームではプレイヤーの操作に応じてキャラクターを動かす必要があります。
今回は、キーボードの左右キーを押したときにキャラクターを移動させる方法 を学びます。

連続入力の取得|key.get_pressed()関数の使い方
pygameでは pygame.key.get_pressed()関数 を使用することで、今どのキーが押されているかを判定できます。
この関数は、現在押されているすべてのキーの状態をリストのような形で返します。
例えば、右矢印キー (→) や左矢印キー (←) が押されたかどうかを判定するには、以下のように記述します。
# ユーザーのキー入力を取得
key = pygame.key.get_pressed() # get_pressed関数にて「今押されているキー」を取得して変数keyに代入
# 右矢印キーが押された場合
if key[pygame.K_RIGHT]: # もし変数keyに「右矢印キーが押された」と格納されていたら
    print("右キーが押されています")
# 左矢印キーが押された場合
if key[pygame.K_LEFT]: # もし変数keyに「左矢印キーが押された」と格納されていたら
    print("左キーが押されています")このコードを実行すると、プレイヤーが右キーを押したときに "右キーが押されています"、左キーを押したときに "左キーが押されています" というメッセージが、コンソールに表示されます。
ぜひ実際にコードを書き、確認してみましょう。
Chapter1-5で学習したフレームレートを活用し、1秒間に10回程度ループするように設定すると分かりやすくなります。
瞬間イベントの取得|KEYDOWN/KEYUPとevent.get()関数
pygame.event.get()関数 を使うと、瞬間的なイベントを取得することができます。
pygameには、例えばpygame.KEYDOWN と pygame.KEYUP というイベントがあり、これらを使うと「キーが押された瞬間」または「キーが離された瞬間」を検知できます。
for event in pygame.event.get():		# イベントキューから全てのイベントを一つずつ取得し得て処理
    if event.type == pygame.KEYDOWN:	# もし「キーが押された」というイベントなら
        if event.key == pygame.K_RIGHT:	# もし「右矢印キーが押された」と格納されていたら
            print("右キーが押された!")
    if event.type == pygame.KEYUP:		# もし「キーが離された」というイベントなら
        if event.key == pygame.K_RIGHT: # もし「右矢印キーが押された」と格納されていたら
            print("右キーが離された!")| 取得方法 | 動作 | 使いどころ | 
|---|---|---|
| pygame.key.get_pressed() | 押されている間ずっと True | 移動など連続的な動作 | 
| pygame.KEYDOWN | キーが押された瞬間のみ True | 効果音を鳴らす、ジャンプ処理など | 
| pygame.KEYUP | キーが離された瞬間のみ True | キーリリース時の処理 | 
「キャラクターを左右に移動させる」場合は、pygame.key.get_pressed() を使うのが適しています。
一方で、ジャンプのように「1回のキー入力で1つの動作を実行したい」ときはpygame.event.get()関数 と pygame.KEYDOWN を使うと良いでしょう。
移動処理の基本|キーボード入力で座標を変更しよう
キャラクターを左右に動かすために、キーボードの左右キーの入力に応じてX座標を増減させましょう。
例えば、右キーが押されたら myrect.x を増やし、左キーが押されたら myrect.x を減らせば表示されるキャラクターの位置が変わります。
キーボード入力に応じてキャラクターを左右に動かすコードを見てみましょう。
vx = 0 # 移動量(デフォルトは0)
key = pygame.key.get_pressed() # キーボードの入力を取得
if key[pygame.K_RIGHT]: # もし右キーが押されたら
    vx = 5				# 移動量をプラス5
if key[pygame.K_LEFT]:  # もし左キーが押されたら
    vx = -5			    # 移動量をマイナス5
myrect.x += vx # 移動量の分だけキャラのx座標を変更このコードでは、vx という変数を移動量として設定し、キー入力によって vx を 5(右移動)または -5(左移動)に変更しています。
その後、myrect.x += vx によって、X座標を変更しています。

向きに合わせた画像反転|左右切り替えの基本
キーボードの左右キーを使ってキャラクターを動かす方法を学習しました。
しかし、画像の犬は右を向いているので、左に移動するときは後ずさりするようになってしまいました。
左に移動するときには左を向くのが自然です。
この問題を解決するために、pygameの pygame.transform.flip()関数 を使って画像を反転させましょう。
画像の反転|transform.flip()関数の使い方
pygameでは pygame.transform.flip()関数 を使うことで、簡単に逆向きの画像を作ることができます。
pygame.transform.flip(画像, 左右反転, 上下反転)
例えば、以下のコードは先ほどの inu.png を左右反転させる例です。
# 画像を読み込む img_path = Path(__file__).parent / "images" / "inu.png.png" inuR = pygame.image.load(str(img_path)) # 通常の画像(右向き) inuL = pygame.transform.flip(inuR, True, False) # 左右反転(左向きの画像) # カッコ内の最後のFalseをTrueにすると上下も反転する。
このようにして、一枚の画像から右向き/左向きの二つのデータを用意し、それぞれ別の変数に格納しておきます。
入力に応じた画像切り替え|左向き/右向きの管理
キャラクターの右向き・左向きの画像を準備できました。
次に、どちらの画像を表示するかを制御するフラグを作成しましょう。
# キャラクターの向きを判定するフラグ
rightFlag = True  # 右向きフラグ。Trueなら右向き画像を、Falseなら左向き画像を表示させる。
# キーボードの入力を取得
key = pygame.key.get_pressed()
# 右キーが押された場合
if key[pygame.K_RIGHT]:
    vx = 5  # 右へ移動
    rightFlag = True  # 右向きに変更
# 左キーが押された場合
if key[pygame.K_LEFT]:
    vx = -5  # 左へ移動
    rightFlag = False  # 左向きに変更
# 画像を描画
if rightFlag:
    screen.blit(inuR, myrect)  # 右向きフラグがTrueなら右向き画像を表示
else:
    screen.blit(inuL, myrect)  # 右向きフラグがFalseなら左向き画像を表示このコードでは、rightFlag という変数を使って、キャラクターが現在どちらの方向を向いているかを記録しています。
右キーを押したときは rightFlag = True、左キーを押したときは rightFlag = False にすることで、どちらの画像を表示するかを切り替えています。
まとめ
今回の記事を通じて、キーボードでキャラクターを動かす基礎を学びました。
次のステップでは、マウスを使ってキャラクターを動かす方法を学びます!
マウスを使った操作は、クリックやドラッグを活用したゲーム作りの基本になりますので、ぜひ引き続き学習を進めていきましょう。
- サイト改善アンケート|ご意見をお聞かせください(1分で終わります)
- 
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。 
 そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。1分だけ、ご協力いただけますと幸いです。 【pygame】サイト改善アンケート
キーボード操作の疑問解消|FAQとよくあるトラブル
初心者がつまずきやすいポイントをFAQとしてまとめ、またよくあるトラブルとその解決法をわかりやすく整理しました。
理解を深めたいときや、ふと疑問に感じたときに役立ててください。
FAQ|キーボード操作に関するよくある質問
今回の記事に関する「よくある質問」とその解答について、以下の内容を参考にしてください。
- Q1. キーボード入力を使ってキャラクターを動かすには、どの関数を使えばいいですか?
- 
pygame.key.get_pressed()関数を使うことで、押されているキーの情報を取得できます。これを利用して、矢印キーなどでキャラクターの座標を変更します。 
- Q2. 複数のキーを同時に押しても反応させるにはどうすればいいですか?
- 
pygame.key.get_pressed()はすべてのキーの状態をリストで返すため、複数のキーが同時に押されている場合もそれぞれ個別に判定できます。これにより、例えば「斜め移動」も実現できます。 
- Q3. キーを押し続けたとき、キャラクターが滑らかに動くようにするにはどうしたらいいですか?
- 
毎フレームごとにキーの状態を判定し続けて座標を更新することで、押しっぱなしでもキャラクターがスムーズに動きます。 キー入力の判定をイベントではなく、フレームごとに行うのがコツです。 
キーボード操作ついてよくあるトラブルと解決法
今回の記事に関する「よくあるトラブル」とその原因、解決法について、以下の内容を参考にしてください。
キーを押してもキャラクターが動かない
- トラブルの原因と対処法を見る
- 
トラブルの原因pygame.event.get()でキーボード入力のイベント処理しかしておらず、pygame.key.get_pressed()を使っていないため。トラブルの解決法キーボードの押下状態を取得するためには、 pygame.key.get_pressed()を使う必要があります。自分のコードでこの関数が使われているか、または pygame.event.get()のみで処理していないか確認しましょう。
「NameError: name ‘K_LEFT’ is not defined」エラーが出る
- トラブルの原因と対処法を見る
- 
トラブルの原因キー定数 K_LEFTやK_RIGHTなどを使う際に、pygame.localsをインポートしていない、または記述にスペルミスがあるため。トラブルの解決法コードの先頭付近で from pygame.locals import *が書かれているか、またはpygame.K_LEFTなどの形で記述しているか確認し、スペルミスがないかも見直しましょう。
押しっぱなしで連続移動しない
- トラブルの原因と対処法を見る
- 
トラブルの原因KEYDOWNイベントだけでキャラクターの座標を更新しているため、キーを押し続けても連続して動かない。トラブルの解決法キーを押し続けた場合にもキャラクターが動くように、毎フレーム pygame.key.get_pressed()でキー状態を判定し、条件が合えば座標を更新するようコードを見直してみましょう。



