サイトアイコン GAMEWORKS LAB

Pygame入門 — スプライト管理と描画

概要

Pygame ではスプライト(描画対象のオブジェクト)を pygame.sprite.Sprite クラスで表現し、pygame.sprite.Group でまとめて管理するのが一般的です。
ここではスプライトの作り方、グループへの登録、update と draw の使い方、スプライトアトラスやオフスクリーン描画など効率的な描画手法を解説します。

スプライトの基本構造

スプライトは pygame.sprite.Sprite を継承して作成します。
主に image(描画する Surface)と rect(位置・大きさを保持する Rect)を持ちます。
update メソッドで毎フレームの振る舞いを実装し、Group.draw で一括描画できます。

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, image):
        super().__init__()
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.center = (320, 240)

    def update(self, dt):
        # 移動やアニメ更新など
        pass

 

グループ(Group)と描画

スプライトは Group に追加してまとめて update / draw を呼べます。
描画時は Group.draw(surface) を使うと内部で blit を行います。
複数の Group に所属させることもできます(例:all_sprites, enemies)。

all_sprites = pygame.sprite.Group()
player = Player(player_image)
all_sprites.add(player)

# メインループ内
all_sprites.update(dt)
all_sprites.draw(screen)

 

当たり判定のための rect と マスク

簡易的な当たり判定は rect の重なり(colliderect)で行えます。
より精密なピクセル単位の判定が必要な場合は pygame.mask を使います。
Mask は透明部分を除いて正確な衝突を判定できますが、計算コストが高くなる点に注意してください。

# rect ベースの衝突判定
if sprite1.rect.colliderect(sprite2.rect):
    handle_collision()

# mask を使う場合
mask1 = pygame.mask.from_surface(sprite1.image)
mask2 = pygame.mask.from_surface(sprite2.image)
offset = (sprite2.rect.left - sprite1.rect.left, sprite2.rect.top - sprite1.rect.top)
if mask1.overlap(mask2, offset):
    handle_precise_collision()

 

Sprite の管理上の注意

スプライトは大量になると update や draw のコストが増えます。
不要になったスプライトは Group から remove して参照を切ることでメモリと処理を解放してください。
描画前に画面クリアを行い、描画順序を意識して blit することが重要です。

スプライトシート(スプライトアトラス)とアニメーション

複数のフレームを一つの画像(スプライトシート)にまとめておき、Rect で切り出してアニメーションを実装するとメモリと I/O を節約できます。
フレーム切り替えは時間経過(dt)を基準に行うとフレームレートに依存しません。

# スプライトシートからフレームを切り出す例(単純)
def load_frames(sheet, frame_rects):
    frames = []
    for rect in frame_rects:
        frame = sheet.subsurface(rect)
        frames.append(frame)
    return frames

 

パフォーマンスと最適化のヒント

頻繁に行う処理(画像の読み込みや変換)は事前に行い、毎フレームでは行わないこと。
可能なら部分更新(dirty rect)やレイヤリングを検討し、GPU オフロードが可能な環境では SDL のハードウェアアクセラレーションオプションを使うことも検討してください。

技術 用途とポイント
pygame.sprite.Group スプライトの一括 update/draw を行う。管理が容易。
Rect vs Mask 矩形判定は高速、Mask は精密(コスト高)。
スプライトシート アニメーションの I/O・メモリ効率を改善する。

 

モバイルバージョンを終了