0

私は C++11 でいくつかの SDL2 の例を扱っておりResourceManager、自分のゲーム用にビルドすることを検討しています。このクラスは、すべてのリソース (ロード、アンロード、レンダリングなど) の管理を担当します。私の考えでは、次のように機能します。

ResourceManager manager = ResourceManager();
manager.addSprite("player", "sprites/player.png");
manager.addAudio("background", "music/song.mp3");

Sprite player = manager.get("player");
player.render(0, 0);

Audio background = manager.get("background");
background.play();

ResourceManager クラス内の配列にリソースを格納する予定です。これは良い習慣ですか?SDL リソースを操作するためのより良い方法はありますか?

4

2 に答える 2

2

これを行うには、さまざまな方法があります。キー (文字列名) をオブジェクトに関連付ける何らかのハッシュ テーブルの使用を検討する必要があります。マネージャーの代わりに、マネージャーはオブジェクトの有効期間を制御することを意味するため、アイデアはロケーターのようなものです。リソース管理用の非常に優れた API の例として、XNA のContentManagerがどのように機能するかを調べてください。これは明らかに C# ですが、API は非常にクリーンでフレンドリーです。

したがって、私の提案は、基本的なリソースの場所については、順不同のマップを使用する必要があるということです。ライフタイム管理やコンテンツの読み込みなど、さらに機能を追加したい場合は、ラップできます。

あなたの例に基づいて、ハッシュ セットをラップし、次のような独自のテンプレート化された Load メソッドを追加できます。

template <typename Type>
Type* ResourceManager::Load( char* name, char* filePath )
{
    Type* t = new Type( );
    t->Initialize( name, filePath ); // this implies that anything
                                     // to be added to your manager
                                     // will be required to have an Initialize
                                     // method with this signature.
    _resources[ name ] = t; // _resources is your hash_map<char*, void*>;

    return t;
}

これは明らかにリソース管理の大まかな例ですが、このトピックについて一般的に学ぶべきことは他にもたくさんあります。一般的にデータ構造 (連結リストバイナリ ツリーなど) を調べてから、 factorysingletonbuilderなどの設計パターンを調べることをお勧めします。これらは出発点にすぎませんが、この種のことを正しい方向に導くには十分です。幸運を!

于 2013-10-03T19:32:55.470 に答える