現在用HGE寫個遊戲玩玩...
當我在切換場景的時候發現了個問題...
由於我們設置的程序的Enter和Leave成隊組成,這樣便於切換場景...
不過呢..有些時候當到了某一個State(遊戲場景),需要載入一些數據...
Texture_Load()便成了我們平時要用的,爲什麼呢,
例如,你在做登陸的時候,還沒有登陸不可能需要把所有資源載入吧,除非你的資源本來就小,並且載入資是在構造裏才行.
這個時候問題就來了..
Texture_Load()我原以爲會像其它引擎一樣自動識別文件是否已經被輸入的..
結果不然.需要自己處理.以免資源重複載入..
爲此我寫了一個類:
如下:
ResServer.h文件:
#include "hgesprite.h"
#include <map>
#pragma pack (push)
#pragma pack (1)
class tResServer
{
public:
tResServer(void);
virtual ~tResServer(void);
public:
void LoadRes(int id, const TCHAR* file);
void Release();
HTEXTURE GetRes(int id);
hgeSprite* MakeSprite(int id, float x, float y, float w, float h);
private:
static tResServer* pAddr;
std::map< int, HTEXTURE > pTexture;
public:
static tResServer* Instance();
};
inline tResServer* tResServer::Instance()
{
return pAddr;
}
歡迎轉載.轉載請註明出處:原創地址
ResServer.cpp文件:
#include "kernelserver.h"
tResServer* tResServer::pAddr = 0;
tResServer::tResServer(void)
{
pAddr = this;
}
tResServer::~tResServer(void)
{
}
void tResServer::LoadRes(int id, const TCHAR* file)
{
HTEXTURE tex = GetRes(id);
if (!tex)
{
HTEXTURE tex = tKernelServer::Instance()->Device()->Texture_Load(file);
pTexture.insert(std::map< int, HTEXTURE >::value_type(id, tex));
}
}
void tResServer::Release()
{
HGE* pDevice = tKernelServer::Instance()->Device();
for (std::map< int, HTEXTURE >::iterator i = pTexture.begin(); i != pTexture.end(); ++i)
pDevice->Texture_Free(i->second);
pTexture.clear();
}
HTEXTURE tResServer::GetRes(int id)
{
std::map< int, HTEXTURE >::iterator i = pTexture.find(id);
if (i != pTexture.end())
return i->second;
else
return 0;
}
hgeSprite* tResServer::MakeSprite(int id, float x, float y, float w, float h)
{
HTEXTURE tex = GetRes(id);
if (tex)
return new hgeSprite(tex, x, y, w, h);
else
return 0;
}
當然.用了以上代碼是不會編過的..
因爲tKernelServer是我已經封裝HGE了的個核心服務..不過上面的代碼只用了HGE*...
應該很好理解.