スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「リソース管理クラス」の修正とかしてみた

リソースを管理するクラスなど、基本的な所は設計しておいて、
(設計と呼べるレベルではないかもしれないですが)

ゲーム本体の部分の制作をしていたのですが、
ちょっとどうしても、コレは修正しなきゃいかんだろ、と
思える部分があったので、修正してみました。


まず、リソースの管理の仕方ですが、 テンプレートクラスにしてます。
で、mapと、リソースクラスの参照数計測ポインタで管理してます。
template<class T>
class CTemplateFactory : public Singleton<CTemplateFactory<T>>{
friend Singleton<CTemplateFactory<T> >;
public:
int Create(CSharedPtr<T>& pointer, std::string name){
int result = CreateHandle(); //重複しないハンドル(int型)を返す関数
std::pair<int, CSharedPtr<T>> p( result,pointer);
std::pair<std::string, int> p2( name, result);

ResourceMap.insert(p);
DeResourceMap.insert(p2);

return(result);
}

void Delete(int handle){
std::map<int,CSharedPtr<T>>::iterator it;
std::map<std::string, int>::iterator it2;

it = ResourceMap.find(handle);

if(it != ResourceMap.end()){
DeleteHandle(it->first); //使用していたハンドルを削除。
it2 = DeResourceMap.find(it->second->m_name);
ResourceMap.erase(it);
DeResourceMap.erase(it2);
}
}
private:
std::map<int,CSharedPtr<T>> ResourceMap;
std::map<std::string, int> DeResourceMap;
};
(重要な所以外のソースコードは、所々 省略してます。)


で、どこが駄目なのかと言うと、Delete関数です。
ハンドルを渡して、そのハンドルに対応するリソースを削除しているのですが、

このとき、
対になるDeResourceMapを削除する事が出来ないんですよね。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

※名前で削除する場合は、
------------------------------------------
【1】DeResourceMapを名前(std::string)で検索。
【2】対応するハンドル取得。(it->second)
【3】DeResourceMapを削除。( DeResourceMap.erase(it); )
【4】取得したハンドルでResourceMapを検索。
( it2 = ResourceMap.find(it->second); )
【5】リソース削除 ( ResourceMap.erase(it2); ) 

------------------------------------------
こんな感じで、ResourceMap、DeResourceMap両方削除できるのですが。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


なので、 CSharedPtr<T>のm_nameというメンバから名前を取得して、
対応するDeResourceMapを消す仕様にしてた訳です。


じゃあ、もしm_nameというメンバを持たないCTextureというクラスがあって、
リソース管理クラスを呼ぶとどうなるの?というと、
-------------------------------------------------------------------
~大まかな使用方法~
CTemplateFactory<CTexture>& tFact = CTemplateFactory<CTexture>::getInstance();
CSharedPtr temp( new CTexture);
int TexHandle;

TexHandle = tFact.Create( temp, TextureName);
tFact.Delete(TexHandle);

-------------------------------------------------------------------

エラーが発生します。
(当然ですが、「m_nameなんてメンバ存在しないですよ!」と怒られる。)


という訳で、今回「m_nameというメンバを強制させるのは何だかな」と思い、
修正に至ったわけです。

対処法は簡単。
ResourceMapのsecondに、std::stringの要素を持たせました。
struct MyResource{
CSharedPtr<T> ptr;
std::string name;
};

std::map<int,MyResource> ResourceMap;

これならハンドルで削除する際、


void Delete(int handle){
std::map<int,MyResource>::iterator it;
std::map<std::string, int>::iterator it2;
 
it = ResourceMap.find(handle);
if(it != ResourceMap.end()){
it2 = DeResourceMap.find(it->second.name);
if(it2 != DeResourceMap.end()){
DeResourceMap.erace(it2);
}
ResourceMap.erace(it);
DeleteHandle(handle); //割り当てられていたハンドルを開放。
}
}
}


このようにして、対になるDeResourceMapも削除できます。


で、ゲーム制作の方ですが、
----------------------------
・Playerクラスの作成
・プレイヤーの当たり判定
・カメラワーク

----------------------------
は 出来ました。

次の課題は、
動く敵 と プレイヤーの当たり判定ですね。
それが出来れば、プレイヤーにHPの概念を付けて、HPを減ったらゲームオーバーみたいに、
ゲームとしての仕様を整えようと思います。 


ここからが本番ですぞ~!(`・ω・´)+
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。