ながみえ
pygameを用いたゲームアプリ作成を紹介するサイトの、キーボードでキャラを操作する記事のアイキャッチ画像

一つ前のチャプターではpygameの基本について学習しました。

今回からは キャラクターや画像を操作する方法 について見ていきましょう。

Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
・Chapter2-1:キーボードでキャラクターを動かそう ◁今回はここ
・Chapter2-2:マウスでキャラクターを動かそう
・Chapter2-3:画面にボタンを表示しよう
・Chapter2-4:紙芝居を作ろう
・Chapter2-5:ノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Extra1:横スクロールのアクションゲームを作ろう

ゲームを作るとき、キャラクター等の画像が画面上で動くことはとても重要です。

静止した画像だけではインタラクティブな要素が少なく、ゲームとしての面白さが半減してしまいます。

そこで、今回は キーボードの左右キーを使ってキャラクターを動かす方法 を学んでいきます。これは「ユーザーの入力を受け取ってゲームを操作する」ことの第一歩です。

今回は pygame.key.get_pressed()関数 を使用して、プレイヤーが押しているキーを取得し、キャラクターの動きを制御します。

この章を学ぶことで、ゲームにおける基本的な操作性を実装できるようになります。さっそく、キーボード入力を取得する方法から見ていきましょう!

あわせて読みたい
Pygameで使える関数・メソッド・クラス一覧まとめ【Pythonゲーム制作リファレンス】
Pygameで使える関数・メソッド・クラス一覧まとめ【Pythonゲーム制作リファレンス】

<<前のページ

pygameの記事一覧

Pythonのゲームライブラリ pygame を使ってゲームアプリを制作するページのアイキャッチ画像

次のページ>>

pygameでキーボード入力を使おう

ゲームではプレイヤーの操作に応じてキャラクターを動かす必要があります。

今回は、キーボードの左右キーを押したときにキャラクターを移動させる方法 を学びます。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

キー入力を取得する方法と使い方

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.KEYDOWNpygame.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で詳しく解説した内容です。忘れた方は一度戻って復習しましょう↓↓

あわせて読みたい
【pygame入門|チャプター2-1】キャラをキーボード操作&反転表示する方法
【pygame入門|チャプター2-1】キャラをキーボード操作&反転表示する方法
あわせて読みたい
【pygame入門|チャプター2-1】キャラをキーボード操作&反転表示する方法
【pygame入門|チャプター2-1】キャラをキーボード操作&反転表示する方法

キーボード入力を使って座標を変更する

キャラクターを左右に動かすには、左右キーの入力に応じて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 という変数を移動量として設定し、キー入力によって vx5(右移動)または -5(左移動)に変更しています。

その後、myrect.x += vx によって、X座標を変更しています。

コードを書いてみよう

ここまでの内容を組み合わせて、キャラクターを左右キーで動かすコードを書いてみましょう。

動かすキャラクターは↓↓を使用して下さい。

Q
正解コードはこちら

pyファイルと同じ場所にこの画像(inu.png)を保存した場合の正解のコードは以下の通りです。

# 初期化(ゲームの準備をする)
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((800,600))
inu = pygame.image.load("inu.png")
myrect = pygame.Rect(150,150,200,200)

# メインループ
while True:
    # 画面を初期化する
    screen.fill(pygame.Color("WHITE"))
    vx = 0 # 移動量
    # ユーザー入力
    key = pygame.key.get_pressed()
    if key[pygame.K_RIGHT]:
        vx = 5
    if key[pygame.K_LEFT]:
        vx = -5
    myrect.x += vx
    screen.blit(inu, myrect)
    # 画面を描写する
    pygame.display.update()
    pygame.time.Clock().tick(60)
    # 終了処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

キャラクター画像を向きに合わせて反転しよう

キーボードの左右キーを使ってキャラクターを動かす方法を学習しました。

しかし、画像の犬は右を向いているので、左に移動するときは後ずさりするようになってしまいました。左に移動するときには左を向くのが自然です。

この問題を解決するために、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 にすることで、どちらの画像を表示するかを切り替えています。

コードを書いてみよう

ここまで学習した内容をもとに、キーボードの左右キーを使ってキャラクターが左右に動き、向きも変わるプログラムを書いてみて下さい。

キャラクター画像は以下の図を使用すること。

Q
正解コードはこちら
# 初期化(ゲームの準備をする)
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((800,600))
inuR = pygame.image.load("inu.png") # 右向き画像
inuL = pygame.transform.flip(inuR, True, False) # 左剥き画像を用意
myrect = pygame.Rect(150,150,200,200)
rightFlag = True # 右向きフラグ

# メインループ
while True:
    # 画面を初期化する
    screen.fill(pygame.Color("WHITE"))
    vx = 0 # 移動量
    # ユーザー入力
    key = pygame.key.get_pressed()
    if key[pygame.K_RIGHT]: # 押されたのが右矢印キーなら
        vx = 5
        rightFlag = True 
    if key[pygame.K_LEFT]: # 押されたのが左矢印キーなら
        vx = -5
        rightFlag = False
        
    myrect.x += vx # 座標を変更
    
    if rightFlag:
        screen.blit(inuR, myrect)  # 右向きフラグがTrueなら右向き画像を表示
    else:
        screen.blit(inuL, myrect)  # 右向きフラグがFalseなら左向き画像を表示
        
    # 画面を描写する
    pygame.display.update()
    pygame.time.Clock().tick(60)
    # 終了処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            ygame.quit()
            sys.exit()

まとめ

今回の記事を通じて、キーボードでキャラクターを動かす基礎を学びました。

次のステップでは、マウスを使ってキャラクターを動かす方法を学びます!

マウスを使った操作は、クリックやドラッグを活用したゲーム作りの基本になりますので、ぜひ引き続き学習を進めていきましょう。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいpygame学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

pygameの記事一覧

Pythonのゲームライブラリ pygame を使ってゲームアプリを制作するページのアイキャッチ画像

次のページ>>

FAQ|キーボード操作でキャラクターを動かす方法に関するよくある質問

今回の記事に関する「よくある質問」とその解答について、以下の内容を参考にしてください。

Q
Q1. キーボード入力を使ってキャラクターを動かすには、どの関数を使えばいいですか?

pygame.key.get_pressed()関数を使うことで、押されているキーの情報を取得できます。

これを利用して、矢印キーなどでキャラクターの座標を変更します。

Q
Q2. 複数のキーを同時に押しても反応させるにはどうすればいいですか?

pygame.key.get_pressed()はすべてのキーの状態をリストで返すため、複数のキーが同時に押されている場合もそれぞれ個別に判定できます。

これにより、例えば「斜め移動」も実現できます。

Q
Q3. キーを押し続けたとき、キャラクターが滑らかに動くようにするにはどうしたらいいですか?

毎フレームごとにキーの状態を判定し続けて座標を更新することで、押しっぱなしでもキャラクターがスムーズに動きます。

キー入力の判定をイベントではなく、フレームごとに行うのがコツです。

キーボード操作によるキャラクター移動についてよくあるトラブルと解決法

今回の記事に関する「よくあるトラブル」とその原因、解決法について、以下の内容を参考にしてください。

キーを押してもキャラクターが動かない

Q
トラブルの原因と対処法を見る

トラブルの原因

pygame.event.get()でキーボード入力のイベント処理しかしておらず、pygame.key.get_pressed()を使っていないため。

トラブルの解決法

キーボードの押下状態を取得するためには、pygame.key.get_pressed()を使う必要があります。

自分のコードでこの関数が使われているか、またはpygame.event.get()のみで処理していないか確認しましょう。

「NameError: name ‘K_LEFT’ is not defined」というエラーが出る

Q
トラブルの原因と対処法を見る

トラブルの原因

キー定数K_LEFTK_RIGHTなどを使う際に、pygame.localsをインポートしていない、または記述にスペルミスがあるため。

トラブルの解決法

コードの先頭付近でfrom pygame.locals import *が書かれているか、またはpygame.K_LEFTなどの形で記述しているか確認し、スペルミスがないかも見直しましょう。

ャラクターがキーを一度押したときだけしか動かない(押しっぱなしで連続移動しない)

Q
トラブルの原因と対処法を見る

トラブルの原因

KEYDOWNイベントだけでキャラクターの座標を更新しているため、キーを押し続けても連続して動かない。

トラブルの解決法

キーを押し続けた場合にもキャラクターが動くように、毎フレームpygame.key.get_pressed()でキー状態を判定し、条件が合えば座標を更新するようコードを見直してみましょう。

記事URLをコピーしました