第08回 画像リソースの管理
第07回までで、ゲームとしての一連のサイクル(タイトル → プレイ → 結果 → リトライ)が完成しました。
第08回からは、コードを修正しやすくし、リソースを安全に管理する設計を学びます。まず画像の管理方法を詳しく見ます。
第01回から使っているImageManagerで、画像をどこで読み込み、誰が所有し、いつ解放するかを確認します。このライフサイクルと、C++の設計パターンであるRAII(Resource Acquisition Is Initialization)を学びます。
始める前に
画像の読み込み・描画・解放と、クラスの役割を確認してください。確認したい場合は、画像の読み込みと表示を参照してください。
前の回の受講や完成物は必須ではありません。下の開始用プロジェクトを使い、配布済みの処理と今回追加する処理を確認してから進めます。
配布プロジェクト
第08回のプロジェクトを展開し、ShootingGame2D.slnをVisual Studio 2026で開いてください。
第07回で実装したタイトル・プレイ・結果画面の状態遷移(ステートマシン)が含まれたプロジェクトから開始します。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
| Source/Shooting/ImageManager.h | 画像ID(Id)の定義とリソース管理クラスの宣言 |
| Source/Shooting/ImageManager.cpp | 画像対応表の走査、読み込み、描画、デストラクタでの自動解放 |
| Source/Shooting/Game.cpp | 起動時の画像読み込み成否チェック |
| Source/Shooting/Tuning/GameTuning.h | 各オブジェクトの表示矩形(DrawRect)の定義 |
| Assets/Images/Player.png | プレイヤー用の機体画像素材 |
この回のゴール
画像リソースの読み込みから破棄までのライフサイクルを理解し、安全にリソースを管理する仕組みを説明できるようにします。
- 各キャラクターが直接ファイルパスを持たず、
ImageManager::Idを介して描画を依頼する設計の利点を説明できる - 画像IDとファイルパスの対応表(
ImageTable)を用いた一括読み込みとエラー検知の仕組みを追跡できる - デストラクタによる自動解放とコピー禁止によって、リソースリークや二重解放を防ぐ「RAII」の考え方を理解できる
- 素材画像のピクセル寸法、画面上の表示矩形(
DrawRect)、当たり判定(Hitbox)の3つを明確に分離できる
今回のポイント
自機や敵が、それぞれLoadGraph("Player.png")を呼ぶ場合を考えます。
24体の敵が同じ画像を24回読み込み、メモリを無駄に使うことになります。解放するクラスも曖昧になり、解放漏れ、つまりメモリリークが起きます。
そこで本プロジェクトでは、すべての画像ハンドルの所有権をImageManagerに集約しています。
ゲーム側のオブジェクトは、画像の種類と描く位置だけを指定します。画像を保持する期間の管理と解放は、ImageManagerで行います。
作業の準備
開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | なし |
| 既存ファイルへ追記・編集 | Source/Shooting/ImageManager.cpp、Source/Shooting/ImageManager.h |
| 重点的に実装・確認する処理 | ImageManager::LoadAll、ImageManager::Draw |
ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。