概要
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・メモリ効率を改善する。 |