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