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

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

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

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

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

静止した画像だけではインタラクティブな要素が少なく、ゲームとしての面白さが半減してしまいます。そこで、今回は キーボードの左右キーを使ってキャラクターを動かす方法 を学んでいきます。

これは、「ユーザーの入力を受け取ってゲームを操作する」ことの第一歩です。今回は、pygame.key.get_pressed() を使用して、プレイヤーが押しているキーを取得し、キャラクターの動きを制御します。

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

<<前のページ

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("左キーが押されています")

このコードを実行すると、プレイヤーが右キーを押したときに "右キーが押されています"、左キーを押したときに "左キーが押されています" というメッセージが、コンソールに表示されます。

ぜひ実際にコードを書き、確認してみましょう。

pygame.KEYDOWN と pygame.KEYUP の違い

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.KEYDOWN を使うと良いでしょう。

移動処理の基本:座標を変更しよう

キーボードの入力を取得してキャラクターを左右に移動させることができます。

移動には座標を使う

キャラクターを移動させるには、画像の座標を変更する必要があります。pygameでは、pygame.Rect を使ってオブジェクトの位置や大きさを管理できます。

例えば、以下のように pygame.Rect を使ってキャラクターの座標を定義できます。

# キャラクター(画像)の位置と大きさを定義
myrect = pygame.Rect(150, 150, 200, 200)

ここで、(150, 150) がキャラクターの左上の座標、(200, 200) がキャラクターの幅と高さを表しています。

これはChapter1-3やChapter1-5で詳しく解説した内容です。忘れた方は一度戻って復習しましょう↓↓

あわせて読みたい
pygame入門|画像と図形を表示しよう:座標と描画の基本を解説【チャプター1-03】
pygame入門|画像と図形を表示しよう:座標と描画の基本を解説【チャプター1-03】
あわせて読みたい
pygame入門|画像を動かすには?アニメーションの第一歩【チャプター1-05】
pygame入門|画像を動かすには?アニメーションの第一歩【チャプター1-05】

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

キャラクターを動かすには、左右キーの入力に応じてX座標を増減させます。

例えば、右キーが押されたら myrect.x を増やし、左キーが押されたら myrect.x を減らします。

以下のコードでは、キーボード入力に応じてキャラクターを左右に動かしています。

vx = 0 # 移動量(デフォルトは0)
key = pygame.key.get_pressed() # キーボードの入力を取得

if key[pygame.K_RIGHT]: # 右キーが押されたらX座標を増やす
    vx = 5  # 右へ移動

if key[pygame.K_LEFT]: # 左キーが押されたらX座標を減らす
    vx = -5  # 左へ移動

myrect.x += vx # X座標を更新

このコードでは、vx という変数を移動量として設定し、キー入力によって vx5(右移動)または -5(左移動)に変更しています。

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

コードを書いてみよう

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

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

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

練習問題:キャラクターを左右に動かそう

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

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

なお、正解のコードは以下の通りです。

# 初期化(ゲームの準備をする)
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の記事一覧

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

次のページ>>

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

Q
Q1. キー入力が反応しない場合はどうすればいいですか?

pygameイベントの取得方法やループ処理に問題がある可能性があります。pygame.KEYDOWNpygame.key.get_pressed()の使用位置を見直してみましょう。

Q
Q2. 画像を左右に反転させると縦にズレるのはなぜ?

反転後に画像の中心座標を再設定していない場合、ズレることがあります。反転後にRect.centerを維持するようにしましょう。

Q
Q3. 矢印キー以外のキーも使いたい場合は?

pygame.K_〇〇を使えば、任意のキー(例:スペースキー、Aキーなど)にも対応できます。キーの一覧はpygameの公式ドキュメントで確認できます。

質問用コンタクトフォーム

この記事を書くにあたりAIを活用しています。

人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。

pygame記事一覧へ戻る
Python記事一覧へ戻る

記事URLをコピーしました