www.pudn.com > HGE_game_damo.rar > hge_tut06.cpp
//// http://dotlive.cnblogs.com/ #include "include\hge.h" #include "include\hgefont.h" #include "include\hgegui.h" #include#include "menuitem.h" #include "TetrisLogic.h" ////////////////////////////////////////////////////////////////////////// // Game Data int g_nGamestatue = 0;// 0 1 2 // hgeQuad quadStage; TetrisLogic* g_pGameLogic; ////////////////////////////////////////////////////////////////////////// // Pointer to the HGE interface. // Helper classes require this to work. HGE *hge=0; // Some resource handles HEFFECT snd; HTEXTURE tex; hgeQuad quad; // Pointers to the HGE objects we will use hgeGUI *gui; hgeFont *fnt; hgeSprite *spr; #define OFFX 250 #define OFFY 50 #define BOXW 15 hgeQuad quadCell; class IGE_HEGImp : public IGameEngine { public: IGE_HEGImp(HGE *pHge); virtual void IGE_DrawABoxCell( int x,int y,DWORD color,int id ); virtual void IGE_DrawText( int x,int y,DWORD c,const char* pStr ); virtual int IGE_GetRandomInt( int min, int max ); protected: HGE *m_pHge; }; IGE_HEGImp::IGE_HEGImp( HGE *pHge ) :m_pHge(pHge) { quadCell.blend = BLEND_ALPHABLEND | BLEND_COLORMUL | BLEND_ZWRITE; for(int i=0;i<4;i++) { quadCell.v[i].z=0.15f; quadCell.v[i].col=0xFF0000FF; } } void IGE_HEGImp::IGE_DrawABoxCell( int x,int y,DWORD color,int id ) { x++; y++; quadCell.v[0].x=OFFX+x*BOXW; quadCell.v[0].y=OFFY+y*BOXW; quadCell.v[1].x=OFFX+(x+1)*BOXW; quadCell.v[1].y=OFFY+y*BOXW; quadCell.v[2].x=OFFX+(x+1)*BOXW; quadCell.v[2].y=OFFY+(y+1)*BOXW; quadCell.v[3].x=OFFX+x*BOXW; quadCell.v[3].y=OFFY+(y+1)*BOXW; for (int i=0;i<4;i++) { quadCell.v[i].col = color; } m_pHge->Gfx_RenderQuad(&quadCell); } void IGE_HEGImp::IGE_DrawText( int x,int y,DWORD c,const char* pStr ) { fnt->SetColor(c); fnt->printf(OFFX+x*BOXW,OFFY+y*BOXW, HGETEXT_LEFT, pStr); } int IGE_HEGImp::IGE_GetRandomInt( int min, int max ) { return m_pHge->Random_Int(min,max); } bool MenuFrameFunc() { float dt=hge->Timer_GetDelta(); int id; static int lastid=0; // If ESCAPE was pressed, tell the GUI to finish // if(hge->Input_GetKeyState(HGEK_ESCAPE)) if (hge->Input_GetKey()==HGEK_ESCAPE) { lastid=5; gui->Leave(); } // We update the GUI and take an action if // one of the menu items was selected id=gui->Update(dt); if(id == -1) { switch(lastid) { case 1: g_nGamestatue = 1; g_pGameLogic->Init(); gui->SetFocus(1); gui->Enter(); break; case 2: case 3: case 4: g_nGamestatue = 0; gui->SetFocus(1); gui->Enter(); break; case 5: return true; } } else if(id) { lastid=id; gui->Leave(); } return false; } int GetTLKey( int HGEKeyCode ) { int nTLKeyCode = 0; switch(hge->Input_GetKey()) { case HGEK_RIGHT: nTLKeyCode = TetrisLogic::KeyRight; break; case HGEK_LEFT: nTLKeyCode = TetrisLogic::KeyLeft; break; case HGEK_DOWN: nTLKeyCode = TetrisLogic::KeyDown; break; case HGEK_ENTER: nTLKeyCode = TetrisLogic::KeyTurn; break; case HGEK_ESCAPE: nTLKeyCode = TetrisLogic::KeyEsc; break; default: nTLKeyCode = TetrisLogic::KeyNothing; break; } return nTLKeyCode; } bool GamePlayFrameFunc() { // if(hge->Input_GetKeyState(HGEK_ENTER)) { // g_nGamestatue = 0; // } float dt=hge->Timer_GetDelta(); g_pGameLogic->GameStep(dt); g_pGameLogic->GameInput( GetTLKey(hge->Input_GetKey()) ); // Process keys int i=0; switch(hge->Input_GetKey()) { case HGEK_ESCAPE: g_nGamestatue = 0; break; // // case HGEK_RIGHT: // for(i=0;i<4;i++) // quadStage.v[i].x += speed; // break; // case HGEK_LEFT: // for(i=0;i<4;i++) // quadStage.v[i].x -= speed; // break; // case HGEK_DOWN: // for(i=0;i<4;i++) // quadStage.v[i].y += speed; // break; // case HGEK_UP: // for(int i=0;i<4;i++) // quadStage.v[i].y -= speed; // break; } return false; } bool FrameFunc() { float dt=hge->Timer_GetDelta(); static float t=0.0f; float tx,ty; bool bRet = false; switch(g_nGamestatue) { case 0: bRet = MenuFrameFunc(); break; case 1: bRet = GamePlayFrameFunc(); break; // case 2: // break; default: ; } // Here we update our background animation t+=dt; tx=50*cosf(t/60); ty=50*sinf(t/60); quad.v[0].tx=tx; quad.v[0].ty=ty; quad.v[1].tx=tx+800/64; quad.v[1].ty=ty; quad.v[2].tx=tx+800/64; quad.v[2].ty=ty+600/64; quad.v[3].tx=tx; quad.v[3].ty=ty+600/64; return bRet; } void PrintLogo() { fnt->SetColor(0xFFFFFFFF); fnt->printf(575, 572, HGETEXT_LEFT, "dotlive.cnblogs.com"); } bool GamePlayRenderFunc() { // hge->Gfx_RenderQuad(&quadStage); fnt->SetColor(0xFFFFFFFF); fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d", hge->Timer_GetDelta(), hge->Timer_GetFPS()); TetrisBox stFallingBox = g_pGameLogic->GetFallingBox(); // PrintLogo(); g_pGameLogic->Render(); // hge->Gfx_RenderQuad(); return false; } bool RenderFunc() { // Render graphics hge->Gfx_BeginScene(); // hge->Gfx_RenderQuad(&quad); hge->Gfx_Clear(0); switch(g_nGamestatue) { case 0: gui->Render(); break; case 1: GamePlayRenderFunc(); // gui->Render(); break; // case 2: // // break; default: ; } PrintLogo(); hge->Gfx_EndScene(); return false; } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { int i=0; hge = hgeCreate(HGE_VERSION); hge->System_SetState(HGE_LOGFILE, "hge_tut06.log"); hge->System_SetState(HGE_FRAMEFUNC, FrameFunc); hge->System_SetState(HGE_RENDERFUNC, RenderFunc); hge->System_SetState(HGE_TITLE, "HGE Tutorial 06 - Creating menus"); hge->System_SetState(HGE_WINDOWED, true); hge->System_SetState(HGE_SCREENWIDTH, 800); hge->System_SetState(HGE_SCREENHEIGHT, 600); hge->System_SetState(HGE_SCREENBPP, 32); hge->System_SetState(HGE_FPS, 20); // hge->System_Initiate(); if(hge->System_Initiate()) { // quadStage.tex = hge->Texture_Load("bg2.png"); // if(!quadStage.tex) // { // return 0; // } // quadStage.blend = BLEND_ALPHABLEND | BLEND_COLORMUL | BLEND_ZWRITE; // for(i=0;i<4;i++) // { // // Set up z-coordinate of vertices // quadStage.v[i].z=0.15f; // // Set up color. The format of DWORD col is 0xAARRGGBB // // quadStage.v[i].col=0xFFFFFFFF; // quadStage.v[i].col=0xFFFFFFFF; // } // quadStage.v[0].x=250; quadStage.v[0].y=50; // quadStage.v[1].x=550; quadStage.v[1].y=50; // quadStage.v[2].x=550; quadStage.v[2].y=550; // quadStage.v[3].x=250; quadStage.v[3].y=550; // quadStage.v[0].tx=0; quadStage.v[0].ty=0; // quadStage.v[1].tx=300/64; quadStage.v[1].ty=0; // quadStage.v[2].tx=300/64; quadStage.v[2].ty=500/64; // quadStage.v[3].tx=0; quadStage.v[3].ty=500/64; // Load sound and textures quad.tex=hge->Texture_Load("bg.png"); tex=hge->Texture_Load("cursor.png"); snd=hge->Effect_Load("menu.wav"); if(!quad.tex || !tex || !snd) { // If one of the data files is not found, display // an error message and shutdown. MessageBox(NULL, "Can't load BG.PNG, CURSOR.PNG or MENU.WAV", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL); hge->System_Shutdown(); hge->Release(); return 0; } // Set up the quad we will use for background animation quad.blend=BLEND_ALPHABLEND | BLEND_COLORMUL | BLEND_NOZWRITE; for(i=0;i<4;i++) { // Set up z-coordinate of vertices quad.v[i].z=0.5f; // Set up color. The format of DWORD col is 0xAARRGGBB quad.v[i].col=0xFFFFFFFF; } quad.v[0].x=0; quad.v[0].y=0; quad.v[1].x=800; quad.v[1].y=0; quad.v[2].x=800; quad.v[2].y=600; quad.v[3].x=0; quad.v[3].y=600; // Load the font, create the cursor sprite fnt=new hgeFont("font1.fnt"); spr=new hgeSprite(tex,0,0,32,32); // Create and initialize the GUI gui=new hgeGUI(); gui->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Play")); gui->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,400,240,0.1f,"Options")); gui->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,400,280,0.2f,"Instructions")); gui->AddCtrl(new hgeGUIMenuItem(4,fnt,snd,400,320,0.3f,"Credits")); gui->AddCtrl(new hgeGUIMenuItem(5,fnt,snd,400,360,0.4f,"Exit")); gui->SetNavMode(HGEGUI_UPDOWN | HGEGUI_CYCLED); gui->SetCursor(spr); gui->SetFocus(1); gui->Enter(); IGameEngine* pGE = new IGE_HEGImp(hge); g_pGameLogic = new TetrisLogic (pGE); // Let's rock now! hge->System_Start(); delete g_pGameLogic; delete pGE; // Delete created objects and free loaded resources delete gui; delete fnt; delete spr; hge->Effect_Free(snd); hge->Texture_Free(tex); hge->Texture_Free(quad.tex); // hge->Texture_Free(quadStage.tex); } /**/ // Clean up and shutdown hge->System_Shutdown(); hge->Release(); return 0; }