Pygameのキーイベント処理(pygame.key.get_pressed()メソッド)を用いて、矢印キー長押しによりプレイヤーを動かす方法とソースコードを解説します。
矢印キー(長押し)でプレイヤーを動かす
画面に表示したプレイヤー画像を矢印キー(長押し)で動かす方法を解説します。
やり方としては、画像(プレイヤー)の位置座標を取得し、押されているキーの情報を取得できるpygame.key.get_pressed()メソッドを用いて、位置座標を変化させます。
動画解説版
画像の矩形オブジェクト
プレイヤーの画像の座標を操作するには、画像の矩形オブジェクトを利用します。
画像の矩形オブジェクトとは、その名のとおり、画像を囲んだ矩形のオブジェクトです。
以下のような情報を持ちます。
top: 矩形の一番上のy座標。
bottom: 矩形の一番下のy座標。
left: 矩形の一番左のx座標。
right: 矩形の一番右のx座標。
center: 矩形の中心座標。
width: 矩形の横幅。
height: 矩形の縦の長さ。
サンプルコード
先程の実行結果のサンプルコードは以下のとおりです。
コード解説
上記コードの各部分について解説をします。
インポートと定数の定義
import sys
import pygame
from pygame.locals import *
- プログラムの終了sys.exit()を行いたいので、
sys
モジュールをインポートします。 pygame
をインポートします。pygame.locals
からは、Pygameで使用する定数をインポートします。
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 378
PLAYER_IMG_PATH = "/Users/github/sample/python/pygame/tutorial/player.png"
BACKGROUND_IMG_PATH = "/Users/github/sample/python/pygame/tutorial/background.png"
SCREEN_WIDTH
とSCREEN_HEIGHT
は、ゲーム画面の幅と高さを定義しています。PLAYER_IMG_PATH
とBACKGROUND_IMG_PATH
は、プレイヤーと背景の画像ファイルのパスです。
メイン関数
def main():
pygame.init()
pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
screen = pygame.display.get_surface()
pygame.init()
は、Pygameの初期化を行います。pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
は、指定したサイズのウィンドウを作成します。pygame.display.get_surface()
は、描画対象のサーフェスを取得します。
画像の読み込みと初期設定
bg = pygame.image.load(BACKGROUND_IMG_PATH).convert_alpha()
bg_rect = bg.get_rect()
player = pygame.image.load(PLAYER_IMG_PATH).convert_alpha()
player_rect = player.get_rect()
player_rect.center = (330, 300)
pygame.image.load()
で画像を読み込み、convert_alpha()
で透明度を扱えるようにします。get_rect()
で画像の矩形(位置とサイズ)を取得します。player_rect.center
でプレイヤーの初期位置を設定します。
メインループ
running = True # ループ処理の実行を継続するフラグ
while running:
pygame.display.update()
pygame.time.wait(30)
screen.fill((0, 0, 0, 0))
pygame.display.update()
で画面を更新します。pygame.time.wait(30)
で30ミリ秒待機します。screen.fill((0, 0, 0, 0))
で画面をクリアします。
キーイベント処理とキャラクターの移動
pressed_key = pygame.key.get_pressed()
if pressed_key[K_LEFT]:
player_rect.centerx -= 5
if pressed_key[K_RIGHT]:
player_rect.centerx += 5
if pressed_key[K_UP]:
player_rect.centery -= 5
if pressed_key[K_DOWN]:
player_rect.centery += 5
pygame.key.get_pressed()
で押されているキーを取得します。- 矢印キーが押されている場合、プレイヤーの中心位置を矢印キーの方向に5px動かします。
プレイヤーの範囲制限
# 左端のx座標が0より小さければ0にする
if player_rect.left < 0:
player_rect.left = 0
# 右端のx座標が画面の幅より大きければ画面左端までにする
if player_rect.right > SCREEN_WIDTH:
player_rect.right = SCREEN_WIDTH
# 上端のy座標が0より小さければ0にする
if player_rect.top < 0:
player_rect.top = 0
# 下端のy座標が画面の高さより大きければ画面下端までにする
if player_rect.bottom > SCREEN_HEIGHT:
player_rect.bottom = SCREEN_HEIGHT
- プレイヤーが画面外に出ないように、位置(中心座標)を制限しています。
画像の描画
screen.blit(bg, bg_rect)
screen.blit(player, player_rect)
screen.blit()
で背景とプレイヤーの画像をウィンドウに描画します。
イベント処理
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
running = False
QUIT
イベントでウィンドウを閉じるとwhile文を抜けてプログラムを終了します。KEYDOWN
イベントでキーが押されたときの処理を行います。Escキーが押されたらwhile文を抜けてプログラムを終了します。
Pygameとプログラムの実行を終了
pygame.quit()
sys.exit()
- while文を抜けたら、この部分でPygameとプログラムの実行を終了します。
プログラムのエントリーポイント
if __name__ == "__main__":
main()
- この部分で、スクリプトが直接実行された場合に
main()
関数を呼び出します。
関連ページ
Pygameの使い方については以下ページで解説しています。
【Pygame超入門】使い方とサンプルゲームを解説
Pygameで2Dゲームを簡単に制作する方法を入門者向けに解説します。
Python全般については以下ページで解説しています。
【Python超入門】使い方とサンプル集
Pythonの使い方について、基礎文法から応用例まで入門者向けに解説します。
コメント
pygame 1.9.4
pygame.draw.circle(screen, (0, 200, 0), (x, y), 5)
TypeError: integer argument expected, got float
とエラー
x,yをintにしてやって通りました・・・(´・ω・`)
コメントありがとうございます。
Python3では整数型でないとエラーが出るようですね。
修正いたしました。