自分で管理が楽になるようにと、このようなリスト(マップ)を作ってみました。
ただ、まだ使いにくいところや、
「ここは、このほうがいい」
という場所があるのではないかと思いまして、質問させてもらいました。
↓がそのソースです。(Keyのことなどは省いてあります。)
class CGameBase
{
public:
virtual void Run()=0;
};
class CGameApp
{
private:
map<string,CGameBase*> m_MainList;
list<string> m_MapNameList;
public:
void RunMain()
{
map<string,CGameBase*>::iterator it = m_MainList.begin();
list<string>::iterator it2 = m_MapNameList.begin();
while(ProcessMessage()==0 && ClearDrawScreen()==0
&& GetHitKeyStateAll_2()==0 && m_Key[KEY_INPUT_ESCAPE]==0)
{
it = m_MainList.begin();
it2 = m_MapNameList.begin();
while(it != m_MainList.end() && it2 != m_MapNameList.end()){
m_MainList[*it2]->Run();
it++;
it2++;
}
ScreenFlip();
}
}
void AddObject(string key_name, CGameBase *obj)
{
m_MainList.insert(map<string,CGameBase*>::value_type(key_name,obj));
if(m_MainList.size()==0){
m_MapNameList.push_front(key_name);
}else{
m_MapNameList.push_back(key_name);
}
}
void BreakObject(string key_name)
{
map<string,CGameBase*>::iterator it = m_MainList.begin();
list<string>::iterator it2 = m_MapNameList.begin();
while(it != m_MainList.end() && it2 != m_MapNameList.end()){
if(*it2 == key_name){
m_MainList.erase(it++);
m_MapNameList.erase(it2++);
return;
}
it++;
it2++;
}
return;
}
CGameApp(void)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0)return;
}
~CGameApp(void)
{
DxLib_End();
}
};
使い方としては、メイン関数内で、
CGameApp *App = new CGameApp();
App->AddObject("TEST1", new CTEST1()); (CTEST1クラスはCGameObjectから継承している。)
App->AddObject("TEST2", new CTEST2()); (CTEST2クラスはCGameObjectから継承している。)
App->AddObject("TEST3", new CTEST3()); (CTEST3クラスはCGameObjectから継承している。)
App->BreakObject("TEST2"); Key_nameが”TEST2”の物を削除
App->RunMain();
とこのような感じです。
改善したほうが良いところや、意見をもらえると幸いです^^;
よろしくお願いしますm(_ _)m
