【Pygame】画像オブジェクトの位置座標を取得し、矢印キーで動かす方法とサンプルコード

Pygameで画像オブジェクトの位置座標を取得し、矢印キーで動かす方法とソースコードを解説します。

矢印キーでプレイヤー画像を動かす

画面に表示したプレイヤー画像を矢印キーで動かす方法を解説します。
やり方としては、プレイヤー画像の位置座標を取得し、キーイベント処理(矢印キー)で位置座標を変化させます。

【今回使用した画像】
背景:background.png
プレイヤー:player.png

動画解説版

本ページの内容は以下動画でも解説しています。

画像の矩形オブジェクト

プレイヤーの画像の座標を操作するには、画像の矩形オブジェクトを利用します。
画像の矩形オブジェクトとは、その名のとおり、画像を囲んだ矩形のオブジェクトで例えば以下のような情報を持ちます。

top: 矩形の一番上のy座標。
bottom: 矩形の一番下のy座標。
left: 矩形の一番左のx座標。
right: 矩形の一番右のx座標。
center: 矩形の中心座標。
width: 矩形の横幅。
height: 矩形の縦の長さ。

サンプルコード

先程の実行結果のサンプルコードは以下のとおりです。


コード解説

上記コードは、Pygameを使って簡単なゲーム画面を作成し、プレイヤーキャラクターを矢印キーで動かすプログラムです。以下に各部分の解説をします。

インポートと定数の定義

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))で画面をクリアします。

プレイヤーの範囲制限

        # 左端の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
                if event.key == K_LEFT:
                    player_rect.centerx -= 15
                if event.key == K_RIGHT:
                    player_rect.centerx += 15
                if event.key == K_UP:
                    player_rect.centery -= 15
                if event.key == K_DOWN:
                    player_rect.centery += 15
  • QUITイベントでウィンドウを閉じるとwhile文を抜けてプログラムを終了します。
  • KEYDOWNイベントでキーが押されたときの処理を行います。ESCキーを押すとwhile文を抜けてプログラムを終了します。
  • 矢印キーが押される度に、プレイヤーの位置(中心座標)を矢印方向に15pxずつ移動します。

Pygameとプログラムの実行を終了

    pygame.quit()
    sys.exit()
  • while文を抜けたら、この部分でPygameとプログラムの実行を終了します。

プログラムのエントリーポイント

if __name__ == "__main__":
    main()
  • この部分で、スクリプトが直接実行された場合にmain()関数を呼び出します。

関連ページ

Pygameの使い方については以下ページで解説しています。

【Pygame超入門】使い方とサンプルゲームを解説
Pygameで2Dゲームを簡単に制作する方法を入門者向けに解説します。

Python全般については以下ページで解説しています。

【Python超入門】使い方とサンプル集
Pythonの使い方について、基礎文法から応用例まで入門者向けに解説します。

コメント

  1. さすらいの初心者プログラマ より:

    pygame.draw.circle(screen, (0, 200, 0), (x, y), 5)
    でエラーが発生しました。
    エラータイプが
    TypeError: integer argument expected, got float
    ということだったので、調べてみたら、変数がfloatタイプになっている可能性があるものでした。
    初期表示位置の(x,y) = (w/2, h/2)を整数計算させる
    (x,y) = (w//2, h//2) にしたら正常に動きました。
    お困りの方がいるかもしれないので、コメントに残させていただきました。

  2. Doa より:

    21歳の学生です。
    pygameに関する書籍を買う余裕がなく数時間悩んでいたのですが、理解することができました。
    本当に助かりました。
    ありがとうございました。