一つ前のチャプターではpygameの基本について学習しました。
今回からは キャラクターや画像を操作する方法 について見ていきましょう。
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
・Chapter2-1:キーボードでキャラクターを動かそう ◁今回はここ
・Chapter2-2:マウスでキャラクターを動かそう
・Chapter2-3:画面にボタンを表示しよう
・Chapter2-4:紙芝居を作ろう
・Chapter2-5:ノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Chapter6:pygameのお役立ち情報
ゲームを作るとき、キャラクター等の画像が画面上で動くことはとても重要です。
静止した画像だけではインタラクティブな要素が少なく、ゲームとしての面白さが半減してしまいます。そこで、今回は キーボードの左右キーを使ってキャラクターを動かす方法 を学んでいきます。
これは、「ユーザーの入力を受け取ってゲームを操作する」ことの第一歩です。今回は、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("左キーが押されています")
このコードを実行すると、プレイヤーが右キーを押したときに "右キーが押されています"
、左キーを押したときに "左キーが押されています"
というメッセージが、コンソールに表示されます。
ぜひ実際にコードを書き、確認してみましょう。
pygame.KEYDOWN と pygame.KEYUP の違い
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.KEYDOWN
を使うと良いでしょう。
移動処理の基本:座標を変更しよう
キーボードの入力を取得してキャラクターを左右に移動させることができます。
移動には座標を使う
キャラクターを移動させるには、画像の座標を変更する必要があります。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]: # 右キーが押されたらX座標を増やす vx = 5 # 右へ移動 if key[pygame.K_LEFT]: # 左キーが押されたらX座標を減らす vx = -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
にすることで、どちらの画像を表示するかを切り替えています。
練習問題:キャラクターを左右に動かそう
ここまで学習した内容をもとに、キーボードの左右キーを使ってキャラクターが左右に動くプログラムを書いてみて下さい。
キャラクター画像は以下の図を使用すること。
なお、正解のコードは以下の通りです。
# 初期化(ゲームの準備をする) 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()
まとめ
今回の記事を通じて、キーボードでキャラクターを動かす基礎を学びました。
次のステップでは、マウスを使ってキャラクターを動かす方法を学びます!
マウスを使った操作は、クリックやドラッグを活用したゲーム作りの基本になりますので、ぜひ引き続き学習を進めていきましょう。
FAQ|キーボードでキャラクターを動かす際に関するよくある質問
- Q1. キー入力が反応しない場合はどうすればいいですか?
-
pygameイベントの取得方法やループ処理に問題がある可能性があります。
pygame.KEYDOWN
やpygame.key.get_pressed()
の使用位置を見直してみましょう。
- Q2. 画像を左右に反転させると縦にズレるのはなぜ?
-
反転後に画像の中心座標を再設定していない場合、ズレることがあります。反転後に
Rect.center
を維持するようにしましょう。
- Q3. 矢印キー以外のキーも使いたい場合は?
-
pygame.K_〇〇
を使えば、任意のキー(例:スペースキー、Aキーなど)にも対応できます。キーの一覧はpygameの公式ドキュメントで確認できます。
質問用コンタクトフォーム
この記事を書くにあたりAIを活用しています。
人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。