一つ前のチャプターではpygameの基本について学習しました。
今回からは キャラクターや画像を操作する方法 について見ていきましょう。
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
・Chapter2-1:キーボードでキャラクターを動かそう ◁今回はここ
・Chapter2-2:マウスでキャラクターを動かそう
・Chapter2-3:画面にボタンを表示しよう
・Chapter2-4:紙芝居を作ろう
・Chapter2-5:ノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Extra1:横スクロールのアクションゲームを作ろう
ゲームを作るとき、キャラクター等の画像が画面上で動くことはとても重要です。
静止した画像だけではインタラクティブな要素が少なく、ゲームとしての面白さが半減してしまいます。
そこで、今回は キーボードの左右キーを使ってキャラクターを動かす方法 を学んでいきます。これは「ユーザーの入力を受け取ってゲームを操作する」ことの第一歩です。
今回は pygame.key.get_pressed()
関数 を使用して、プレイヤーが押しているキーを取得し、キャラクターの動きを制御します。
この章を学ぶことで、ゲームにおける基本的な操作性を実装できるようになります。さっそく、キーボード入力を取得する方法から見ていきましょう!
pygameでキーボード入力を使おう
ゲームではプレイヤーの操作に応じてキャラクターを動かす必要があります。
今回は、キーボードの左右キーを押したときにキャラクターを移動させる方法 を学びます。
キー入力を取得する方法と使い方
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回程度ループするように設定すると分かりやすくなります。
pygame.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 | キーが押された瞬間 | 効果音を鳴らす、ジャンプ処理など |
pygame.KEYUP | キーが離された瞬間 | キーリリース時の処理 |
「キャラクターを左右に移動させる」場合は、pygame.key.get_pressed()
を使うのが適しています。
一方で、ジャンプのように「1回のキー入力で1つの動作を実行したい」ときはpygame.event.get()関数 と pygame.KEYDOWN
を使うと良いでしょう。
移動処理の基本:座標を変更しよう
キーボードの入力を取得してキャラクターを左右に移動させることができます。
移動には座標を使う
キャラクターを移動させるには、画像の座標を変更する必要があります。
Chapter1で学習したように、pygameでは pygame.Rect
を使ってオブジェクトの位置や大きさを管理できます。
例えば、以下のように pygame.Rect
を使ってキャラクターの座標を定義できます。
# キャラクター(画像)の位置と大きさを定義 myrect = pygame.Rect(150, 150, 200, 200)
ここで、(150, 150)
がキャラクターの左上の座標、(200, 200)
がキャラクターの幅と高さを表しています。
これはChapter1-3やChapter1-5で詳しく解説した内容です。忘れた方は一度戻って復習しましょう↓↓
キーボード入力を使って座標を変更する
キャラクターを左右に動かすには、左右キーの入力に応じて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(画像, 左右反転, 上下反転)
を使うことで、簡単に逆向きの画像を作ることができます。
例えば、以下のコードは先ほどの inu.png
を左右反転させる例です。
# 画像を読み込む inuR = pygame.image.load("inu.png") # 通常の画像(右向き) 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
にすることで、どちらの画像を表示するかを切り替えています。
まとめ
今回の記事を通じて、キーボードでキャラクターを動かす基礎を学びました。
次のステップでは、マウスを使ってキャラクターを動かす方法を学びます!
マウスを使った操作は、クリックやドラッグを活用したゲーム作りの基本になりますので、ぜひ引き続き学習を進めていきましょう。
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()
でキー状態を判定し、条件が合えば座標を更新するようコードを見直してみましょう。