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

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

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

連続入力の取得|key.get_pressed関数の使い方
pygameでは pygame.key.get_pressed()関数 を使用することで、今どのキーが押されているかを判定できます。
この関数は、現在押されているすべてのキーの状態をリストのような形で返します。
例えば、右矢印キー (→) や左矢印キー (←) が押されたかどうかを判定するには、以下のように記述します。
# ユーザーのキー入力を取得
keys = pygame.key.get_pressed() # get_pressed関数にて「今押されているキー」を取得して変数keyに代入
# 右矢印キーが押された場合
if keys[pygame.K_RIGHT]: # もし変数keyに「右矢印キーが押された」と格納されていたら
print("右キーが押されています")
# 左矢印キーが押された場合
if keys[pygame.K_LEFT]: # もし変数keyに「左矢印キーが押された」と格納されていたら
print("左キーが押されています")このコードを実行すると、プレイヤーが右キーを押したときに「右キーが押されています」、左キーを押したときに 「左キーが押されています」 というメッセージが、コンソールに表示されます。
ぜひ実際にコードを書き、確認してみましょう。
Chapter1-5で学習したフレームレート を活用し、1秒間に10回程度ループするように設定すると分かりやすくなります。
また、get_pressed()関数で取得できるキーは、例えば以下のようなものがあります。
| キー | コード |
|---|---|
| ←キー | pygame.K_LEFT |
| →キー | pygame.K_RIGHT |
| ↑キー | pygame.K_UP |
| ↓キー | pygame.K_DOWN |
| スペースキー | pygame.K_SPACE |
瞬間イベントの取得|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 | キーリリース時の処理 |
「キャラクターを左右に移動させる」場合は、連続入力を検知する 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 = 1 # 移動量をプラス1
if key[pygame.K_LEFT]: # もし左キーが押されたら
vx = -1 # 移動量をマイナス1
myrect.x += vx # 移動量の分だけキャラのx座標を変更このコードでは、vx という変数を移動量として設定し、キー入力によって vx を 1(右移動)または -1(左移動)に変更しています。
その後、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 = 1 # 右へ移動
rightFlag = True # 右向きに変更
# 左キーが押された場合
if key[pygame.K_LEFT]:
vx = -1 # 左へ移動
rightFlag = False # 左向きに変更
# 画像を描画
if rightFlag:
screen.blit(inuR, myrect) # 右向きフラグがTrueなら右向き画像を表示
else:
screen.blit(inuL, myrect) # 右向きフラグがFalseなら左向き画像を表示このコードでは、rightFlag という変数を使って、キャラクターが現在どちらの方向を向いているかを記録しています。
右キーを押したときは rightFlag = True、左キーを押したときは rightFlag = False にすることで、どちらの画像を表示するかを切り替えています。
まとめ
今回の記事を通じて、キーボードでキャラクターを動かす基礎を学びました。
次のステップでは、マウスを使ってキャラクターを動かす方法を学びます!
マウスを使った操作は、クリックやドラッグを活用したゲーム作りの基本になりますので、ぜひ引き続き学習を進めていきましょう。
キーボード操作の疑問解消|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()でキー状態を判定し、条件が合えば座標を更新するようコードを見直してみましょう。



