【Pygame】矢印キー(長押し)でプレイヤーを動かす方法

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_WIDTHSCREEN_HEIGHTは、ゲーム画面の幅と高さを定義しています。
  • PLAYER_IMG_PATHBACKGROUND_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の使い方について、基礎文法から応用例まで入門者向けに解説します。

コメント

  1. 匿名 より:

    pygame 1.9.4
    pygame.draw.circle(screen, (0, 200, 0), (x, y), 5)
    TypeError: integer argument expected, got float
    とエラー
    x,yをintにしてやって通りました・・・(´・ω・`)

    • 管理人 より:

      コメントありがとうございます。
      Python3では整数型でないとエラーが出るようですね。
      修正いたしました。