现在用HGE写个游戏玩玩...
当我在切换场景的时候发现了个问题...
由于我们设置的程序的Enter和Leave成队组成,这样便于切换场景...
不过呢..有些时候当到了某一个State(游戏场景),需要载入一些数据...
Texture_Load()便成了我们平时要用的,为什么呢,
例如,你在做登陆的时候,还没有登陆不可能需要把所有资源载入吧,除非你的资源本来就小,并且载入资是在构造里才行.
这个时候问题就来了..
Texture_Load()我原以为会像其它引擎一样自动识别文件是否已经被输入的..
结果不然.需要自己处理.以免资源重复载入..
为此我写了一个类:
如下:
ResServer.h文件:
#include
"
hge.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;
}
#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
"
. esserver.h
"
#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 ;
}
#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*...
应该很好理解.