基于HGE的简易游戏框架.docx
《基于HGE的简易游戏框架.docx》由会员分享,可在线阅读,更多相关《基于HGE的简易游戏框架.docx(16页珍藏版)》请在冰豆网上搜索。
基于HGE的简易游戏框架
基于HGE的简易游戏框架
//Application\Application.h
#pragmaonce
#pragmacomment(lib,"hge.lib")
#pragmacomment(lib,"hgehelp.lib")
#include
#include
classCApplication
{
friendintWINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int);
public:
CApplication();
virtual~CApplication();
staticCApplication*GetApplication();
staticHGE*GetHGE();
protected:
virtualvoidInitApplication();
virtualboolInitInstance();
virtualvoidExitInstance();
virtualboolFrameFunc();
virtualvoidRenderFunc();
virtualboolGFXRestoreFunc();
virtualvoidFocusLostFunc();
virtualvoidFocusGainFunc();
virtualboolExitFunc();
private:
voidExitApplication();
boolInitialize();
boolRun();
staticboolFrameCallback();
staticboolRenderCallback();
staticboolGFXRestoreCallback();
staticboolFocusLostCallback();
staticboolFocusGainCallback();
staticboolExitCallback();
private:
staticintm_nAppCnt;
staticCApplication*m_pThis;
staticHGE*m_pHGE;
};
//Application\Application.cpp
#include"Application.h"
HGE*CApplication:
:
m_pHGE=NULL;
intCApplication:
:
m_nAppCnt=0;
CApplication*CApplication:
:
m_pThis=NULL;
CApplication:
:
CApplication()
{
m_nAppCnt++;
assert(m_nAppCnt==1);
m_pThis=this;
}
CApplication:
:
~CApplication()
{
m_nAppCnt--;
}
CApplication*CApplication:
:
GetApplication()
{
assert(m_pThis!
=NULL);
returnm_pThis;
}
HGE*CApplication:
:
GetHGE()
{
assert(m_pHGE!
=NULL);
returnm_pHGE;
}
voidCApplication:
:
InitApplication()
{
}
boolCApplication:
:
InitInstance()
{
returntrue;
}
voidCApplication:
:
ExitInstance()
{
}
boolCApplication:
:
FrameFunc()
{
returnfalse;
}
voidCApplication:
:
RenderFunc()
{
}
boolCApplication:
:
GFXRestoreFunc()
{
returntrue;
}
voidCApplication:
:
FocusLostFunc()
{
}
voidCApplication:
:
FocusGainFunc()
{
}
boolCApplication:
:
ExitFunc()
{
returntrue;
}
voidCApplication:
:
ExitApplication()
{
m_pHGE->System_Shutdown();
m_pHGE->Release();
}
boolCApplication:
:
Initialize()
{
m_pHGE=hgeCreate(HGE_VERSION);
assert(m_pHGE!
=NULL);
m_pHGE->System_SetState(HGE_FRAMEFUNC,FrameCallback);
m_pHGE->System_SetState(HGE_RENDERFUNC,RenderCallback);
m_pHGE->System_SetState(HGE_GFXRESTOREFUNC,GFXRestoreCallback);
m_pHGE->System_SetState(HGE_FOCUSLOSTFUNC,FocusLostCallback);
m_pHGE->System_SetState(HGE_FOCUSGAINFUNC,FocusGainCallback);
m_pHGE->System_SetState(HGE_EXITFUNC,ExitCallback);
InitApplication();
if(!
m_pHGE->System_Initiate())
{
MessageBox(NULL,m_pHGE->System_GetErrorMessage(),"Error",MB_OK|MB_ICONERROR);
ExitApplication();
returnfalse;
}
if(!
InitInstance())
{
ExitApplication();
returnfalse;
}
returntrue;
}
boolCApplication:
:
Run()
{
boolbRes=m_pHGE->System_Start();
ExitInstance();
ExitApplication();
returnbRes;
}
boolCApplication:
:
FrameCallback()
{
returnm_pThis->FrameFunc();
}
boolCApplication:
:
RenderCallback()
{
m_pThis->RenderFunc();
returnfalse;
}
boolCApplication:
:
GFXRestoreCallback()
{
returnm_pThis->GFXRestoreFunc();
}
boolCApplication:
:
FocusLostCallback()
{
m_pThis->FocusLostFunc();
returnfalse;
}
boolCApplication:
:
FocusGainCallback()
{
m_pThis->FocusGainFunc();
returnfalse;
}
boolCApplication:
:
ExitCallback()
{
returnm_pThis->ExitFunc();
}
//Application\Main.cpp
#include"Application.h"
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd)
{
if(!
CApplication:
:
GetApplication()->Initialize())return-1;
if(!
CApplication:
:
GetApplication()->Run())return-2;
return0;
}
//MyApp\MyApp.h
#pragmaonce
#pragmacomment(lib,"..\\Application\\Debug\\Application.lib")
#include"..\\Application\\Application.h"
#include"hgeFont.h"
#include"hgeSprite.h"
#include"hgeParticle.h"
classCMyApp:
publicCApplication
{
public:
CMyApp();
virtual~CMyApp();
voidBoom(floatfDx,floatfDy)const;
protected:
virtualvoidInitApplication();
virtualboolInitInstance();
virtualvoidExitInstance();
virtualboolFrameFunc();
virtualvoidRenderFunc();
virtualboolGFXRestoreFunc();
virtualboolExitFunc();
protected:
hgeFont*m_pFont;
HTEXTUREm_hTex;
HEFFECTm_hEff;
HTARGETm_hTarg;
hgeSprite*m_pSprite,*m_pSprPar,*m_pSprTarg;
hgeParticleSystem*m_pPar;
floatm_fx,m_fy;
};
externCMyApptheApp;
//MyApp\MyApp.cpp
#include"MyApp.h"
#define_CRTDBG_MAP_ALLOC
#include
#include
#defineSPEED 90.0f
#defineFRICTION 0.98f
CMyApptheApp;
CMyApp:
:
CMyApp()
:
m_pFont(NULL)
,m_hTex(NULL)
,m_hEff(NULL)
,m_hTarg(NULL)
,m_pSprite(NULL)
,m_pSprPar(NULL)
,m_pSprTarg(NULL)
,m_pPar(NULL)
,m_fx(100)
,m_fy(100)
{
}
CMyApp:
:
~CMyApp()
{
_CrtDumpMemoryLeaks();
}
voidCMyApp:
:
Boom(floatfdx,floatfdy)const
{
intnPan=(int)(m_fx-400)/4;
floatfPitch=(fdx*fdx+fdy*fdy)*0.0005f+0.2f;
GetHGE()->Effect_PlayEx(m_hEff,100,nPan,fPitch);
}
voidCMyApp:
:
InitApplication()
{
GetHGE()->System_SetState(HGE_TITLE,"HGEApplication");
GetHGE()->System_SetState(HGE_SHOWSPLASH,false);
GetHGE()->System_SetState(HGE_WINDOWED,true);
GetHGE()->System_SetState(HGE_HIDEMOUSE,false);
GetHGE()->System_SetState(HGE_FPS,100);
}
boolCMyApp:
:
InitInstance()
{
m_pFont=newhgeFont("Font1.fnt");
m_hTex=GetHGE()->Texture_Load("particles.png");
if(m_hTex==NULL)returnfalse;
m_hEff=GetHGE()->Effect_Load("menu.wav");
if(m_hEff==NULL)returnfalse;
m_hTarg=GetHGE()->Target_Create(800,600,false);
m_pSprite=newhgeSprite(m_hTex,96,64,32,32);
m_pSprite->SetColor(ARGB(255,255,160,0));
m_pSprite->SetHotSpot(16,16);
m_pSprPar=newhgeSprite(m_hTex,96,64,32,32);
m_pSprPar->SetBlendMode(BLEND_COLORMUL|BLEND_ALPHAADD|BLEND_NOZWRITE);
m_pSprPar->SetHotSpot(16,16);
m_pPar=newhgeParticleSystem("trail.psi",m_pSprPar);
m_pPar->Fire();
m_pSprTarg=newhgeSprite(GetHGE()->Target_GetTexture(m_hTarg),0,0,800,600);
m_pSprTarg->SetBlendMode(BLEND_COLORMUL|BLEND_ALPHAADD|BLEND_NOZWRITE);
returntrue;
}
voidCMyApp:
:
ExitInstance()
{
deletem_pSprTarg;
deletem_pPar;
deletem_pSprPar;
deletem_pSprite;
GetHGE()->Target_Free(m_hTarg);
GetHGE()->Effect_Free(m_hEff);
GetHGE()->Texture_Free(m_hTex);
deletem_pFont;
}
boolCMyApp:
:
FrameFunc()
{
floatfdt=GetHGE()->Timer_GetDelta();
staticfloatfdx=0.0f,fdy=0.0f;
if(GetHGE()->Input_GetKeyState(HGEK_LEFT))fdx-=SPEED*fdt;
if(GetHGE()->Input_GetKeyState(HGEK_RIGHT))fdx+=SPEED*fdt;
if(GetHGE()->Input_GetKeyState(HGEK_UP))fdy-=SPEED*fdt;
if(GetHGE()->Input_GetKeyState(HGEK_DOWN))fdy+=SPEED*fdt;
fdx*=FRICTION;
fdy*=FRICTION;
m_fx+=fdx;
m_fy+=fdy;
if(m_fx<16)
{
m_fx=16+16-m_fx;
fdx=-fdx;
Boom(fdx,fdy);
}
if(m_fx>784)
{
m_fx=784+784-m_fx;
fdx=-fdx;
Boom(fdx,fdy);
}
if(m_fy<16)
{
m_fy=16+16-m_fy;
fdy=-fdy;
Boom(fdx,fdy);
}
if(m_fy>584)
{
m_fy=584+584-m_fy;
fdy=-fdy;
Boom(fdx,fdy);
}
m_pPar->info.nEmission=(int)(fdx*fdx+fdy*fdy)*2;
m_pPar->MoveTo(m_fx,m_fy);
m_pPar->Update(fdt);
returnfalse;
}
voidCMyApp:
:
RenderFunc()
{
GetHGE()->Gfx_BeginScene(m_hTarg);
GetHGE()->Gfx_Clear(ARGB(255,0,0,0));
m_pSprite->Render(m_fx,m_fy);
m_pPar->Render();
GetHGE()->Gfx_EndScene();
GetHGE()->Gfx_BeginScene();
GetHGE()->Gfx_Clear(ARGB(255,0,0,0));
m_pFont->printf(5,5,HGETEXT_LEFT,"FPS:
%d",GetHGE()->Timer_GetFPS());
for(inti=0;i<5;i++)
{
m_pSprTarg->Render(0.0f,i*50.0f-100);
m_pSprTarg->Render(i*50.0f-100,0.0f);
}
GetHGE()->Gfx_EndScene();
}
boolCMyApp:
:
GFXRestoreFunc()
{
if(m_pSprTarg!
=NULL&&m_hTarg!
=NULL)
{
m_pSprTarg->SetTexture(GetHGE()->Target_GetTexture(m_hTarg));
returntrue;
}
returnfalse;
}
boolCMyApp:
:
ExitFunc()
{
returnMessageBox(NULL,"是否退出程序?
","HGEApplication"
,MB_YESNO|MB_ICONWARNING)==IDYES;
}