Skip to content

第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に集約しています。

画像リソースの安全な管理フロー
ImageTable
起動時に全画像を読み込む
ImageManager
ゲームオブジェクト
画像IDと表示矩形を渡す
ImageManager
ImageManager
終了時に全ハンドルを解放
DXライブラリ

ゲーム側のオブジェクトは、画像の種類と描く位置だけを指定します。画像を保持する期間の管理と解放は、ImageManagerで行います。

作業の準備 ​

開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。

作業対象
新規作成なし
既存ファイルへ追記・編集Source/Shooting/ImageManager.cpp、Source/Shooting/ImageManager.h
重点的に実装・確認する処理ImageManager::LoadAll、ImageManager::Draw

ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。

第08回の目次 ​