一个送给HGE初学者的Demo——音乐节奏游戏

  当然,这个demo只有一个文件,因为是给初学者的,所以比较简单,没有复杂的功能,每次节奏都是一样的0.7s。音乐也是乱配的,并不是节奏向导。只是出这么一个demo让大家认识一下HGE的过程而已。

看不懂HGE函数的童鞋们不要着急,你们需要一份手册。我这里一份中文的:

http://www.x2studio.net/HGEDoc

具体的注释写在代码里了。有需要的同学要游戏资源或者源文件的话请联系我:

Code:
  1. /**-------------------------------- 
  2.  * 方向节奏游戏Demo(Dir.cpp) 
  3.  * 
  4.  * Code by XadillaX 
  5.  * http://www.xcoder.in 
  6.  * Created at 2010-10-?? ??:??:?? 
  7.  */  
  8. #include   
  9. #include   
  10. #include   
  11. #include   
  12.   
  13. /** 节奏最大时间、节奏正确误差范围、错误误差范围、背景移动时间 */  
  14. #define RYTHM_MAX_TIME 0.7f  
  15. #define RYTHM_RIGHT_DELAY_TIME 0.2f  
  16. #define RYTHM_WRONG_DELAY_TIME 0.5f  
  17. #define BG_MAX_TIME 4.0f  
  18.   
  19. /** 游戏状态 */  
  20. enum GM_Stat { NOT_START, RUNNING, ENDING };  
  21.   
  22. /** HGE相关变量 */  
  23. HGE *hge = NULL;  
  24. HTEXTURE arr_texture, bg_texture;  
  25. hgeSprite *arr_sprite, *bg_sprite;  
  26. hgeFont *fnt;  
  27. HEFFECT rythm_eff, bgm_eff;  
  28.   
  29. /** 普通变量 */  
  30. float time_now = 0.0f, bg_timer = 0.0f;  
  31. float x, y, hintx, hinty;  
  32. int dir;  
  33. HCHANNEL bgm_channel = 0;  
  34. bool clicked = false;  
  35. GM_Stat stat = NOT_START;  
  36. int score = 0;  
  37.   
  38. /** 
  39.  * @brief 逻辑函数 
  40.  */  
  41. bool FrameFunc()  
  42. {  
  43.     /** 获取与上一帧的时间差 */  
  44.     float dt = hge->Timer_GetDelta();  
  45.     /** 更新背景移动时间 */  
  46.     bg_timer += dt;  
  47.     /** 若背景移动时间到则归零 */  
  48.     if(bg_timer > BG_MAX_TIME) bg_timer = 0.0f;  
  49.   
  50.     /** 根据时间渲染背景 */  
  51.     bg_sprite->SetTextureRect((bg_timer / BG_MAX_TIME) * 64, (bg_timer / BG_MAX_TIME) * 64, 1056, 600);  
  52.   
  53.     /** 如果是运行状态 */  
  54.     if(stat == RUNNING)  
  55.     {  
  56.         /** 如果现时为0 */  
  57.         if(time_now == 0.0f)  
  58.         {  
  59.             /** 如果没开始播放背景音乐则播放 */  
  60.             if(!bgm_channel) bgm_channel = hge->Effect_PlayEx(bgm_eff, 100, 0, 1, true);  
  61.   
  62.             /** 随机生成箭头坐标以及方向,并且按下状态为false */  
  63.             x = hge->Random_Float(18, 1056 - 18);  
  64.             y = hge->Random_Float(18, 600 - 18);  
  65.             dir = hge->Random_Int(0, 3);  
  66.             clicked = false;  
  67.         }  
  68.   
  69.         /** 更新提示箭头坐标 */  
  70.         if(dir == 2) hintx = x * (time_now / RYTHM_MAX_TIME), hinty = y;  
  71.         else  
  72.         if(dir == 3) hintx = x, hinty = y * (time_now / RYTHM_MAX_TIME);  
  73.         else  
  74.         if(dir == 0) hintx = 1056 - (1056 - x) * (time_now / RYTHM_MAX_TIME), hinty = y;  
  75.         else hintx = x, hinty = 600 - (600 - y) * (time_now / RYTHM_MAX_TIME);  
  76.   
  77.         /** 如果提示箭头过了,则提示箭头坐标改为终点坐标(因为有误差) */  
  78.         if(dir == 2 && hintx > x) hintx = x;  
  79.         else  
  80.         if(dir == 3 && hinty > y) hinty = y;  
  81.         else  
  82.         if(dir == 0 && hintx < x) hintx = x;  
  83.         else  
  84.         if(dir == 1 && hinty < y) hinty = y;  
  85.   
  86.         /** 更新这一节奏时间 */  
  87.         time_now += dt;  
  88.   
  89.         if(time_now - RYTHM_RIGHT_DELAY_TIME > RYTHM_MAX_TIME)  
  90.         {  
  91.             /** 如果 这一节奏已过时间 - 允许误差时间 > 最大时间(即时间到), 
  92.              *  则播放节奏音效,并且判断有没有按下相应键  
  93.              */  
  94.             hge->Effect_PlayEx(rythm_eff, 100, hge->Random_Int(-100, 100), hge->Random_Float(1.0, 5.0));  
  95.             if(!clicked)  
  96.             {  
  97.                 stat = ENDING;  
  98.                 hge->Channel_Stop(bgm_channel);  
  99.                 bgm_channel = 0;  
  100.                 MessageBox(NULL, "Wrong rythm or wrong direction!""Wrong", MB_ICONSTOP);  
  101.             }  
  102.   
  103.             time_now = 0.0f;  
  104.         }  
  105.         else  
  106.         if(time_now + RYTHM_RIGHT_DELAY_TIME > RYTHM_MAX_TIME && !clicked)  
  107.         {  
  108.             /** 如果 这一节奏已过时间 + 允许误差时间 > 最大时间(即在误差范围内),且之前还没按下键 
  109.              *  若按下了正确的方向,则让clicked为true并且加分数 
  110.              */  
  111.             if(hge->Input_GetKeyState(dir + HGEK_LEFT))   
  112.             {  
  113.                 score++;  
  114.                 clicked = true;  
  115.             }  
  116.         }  
  117.         else  
  118.         if(time_now + RYTHM_WRONG_DELAY_TIME > RYTHM_MAX_TIME && !clicked)  
  119.         {  
  120.             /** 如果误差范围之外按下了对的方向,则提示错误的节奏并且结束 */  
  121.             if(hge->Input_GetKeyState(dir + HGEK_LEFT))  
  122.             {  
  123.                 stat = ENDING;  
  124.                 hge->Channel_Stop(bgm_channel);  
  125.                 bgm_channel = 0;  
  126.                 MessageBox(NULL, "Wrong rythm!""Wrong", MB_ICONSTOP);                 
  127.             }  
  128.         }  
  129.     }  
  130.     else /** 如果不是运行状态,则判断是否按下空格,那么开始游戏 */  
  131.     {  
  132.         if(hge->Input_GetKeyState(HGEK_SPACE))  
  133.         {  
  134.             score = 0;  
  135.             time_now = 0.0f;  
  136.             stat = RUNNING;  
  137.         }  
  138.     }  
  139.   
  140.     return false;  
  141. }  
  142.   
  143. /** 
  144.  * @brief 渲染函数 
  145.  */  
  146. bool RenderFunc()  
  147. {  
  148.     /** 开始渲染 */  
  149.     hge->Gfx_BeginScene();  
  150.     /** 背景色清白 */  
  151.     hge->Gfx_Clear(0xffffffff);  
  152.   
  153.     /** 开始渲染背景 */  
  154.     bg_sprite->Render(0, 0);  
  155.   
  156.     /** 如果没有开始,则渲染以下字 */  
  157.     if(stat == NOT_START || stat == ENDING)  
  158.     {  
  159.         fnt->printf(10, 10, HGETEXT_LEFT, "Please press  to start.");  
  160.         if(stat == ENDING) fnt->printf(10, 30, HGETEXT_LEFT, "Final score: %d", score);  
  161.     }  
  162.     else /** 若游戏开始,则渲染箭头、提示箭头以及分数 */  
  163.     {  
  164.         arr_sprite->RenderEx(x, y, dir * M_PI_2);  
  165.         arr_sprite->RenderEx(hintx, hinty, dir * M_PI_2);  
  166.         fnt->printf(10, 10, HGETEXT_LEFT, "Score: %d", score);  
  167.     }  
  168.   
  169.     /** 结束渲染 */  
  170.     hge->Gfx_EndScene();  
  171.       
  172.     return false;  
  173. }  
  174.   
  175. int WINAPI WinMain(HINSTANCEHINSTANCELPSTRint)  
  176. {  
  177.     hge = hgeCreate(HGE_VERSION);  
  178.   
  179.     hge->System_SetState(HGE_SCREENHEIGHT, 600);  
  180.     hge->System_SetState(HGE_SCREENWIDTH, 1056);  
  181.     hge->System_SetState(HGE_SCREENBPP, 32);  
  182.     hge->System_SetState(HGE_USESOUND, true);  
  183.     hge->System_SetState(HGE_LOGFILE, "dir.log");  
  184.     hge->System_SetState(HGE_FPS, 100);  
  185.     hge->System_SetState(HGE_SHOWSPLASH, false);  
  186.     hge->System_SetState(HGE_TITLE, "HGE Direction Test");  
  187.     hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);  
  188.     hge->System_SetState(HGE_RENDERFUNC, RenderFunc);  
  189.     hge->System_SetState(HGE_WINDOWED, true);  
  190.     hge->System_SetState(HGE_ICON, "IDI_ARROW");  
  191.   
  192.     if(hge->System_Initiate())  
  193.     {  
  194.         arr_texture = hge->Texture_Load("arrow.png");  
  195.         bg_texture = hge->Texture_Load("bg.png");  
  196.         rythm_eff = hge->Effect_Load("rythm.wav");  
  197.         fnt = new hgeFont("Consolas.fnt");  
  198.         bgm_eff = hge->Effect_Load("bgm.mp3");  
  199.         if(!arr_texture || !rythm_eff || !fnt || !bg_texture || !bgm_eff) MessageBox(NULL, "Resource loading failed...""Wrong", MB_ICONSTOP);  
  200.         else  
  201.         {  
  202.             //fnt->SetColor(0xff000000);  
  203.             hge->Random_Seed();  
  204.             arr_sprite = new hgeSprite(arr_texture, 0, 0, 18, 18);  
  205.             bg_sprite = new hgeSprite(bg_texture, 0, 0, 64, 64);  
  206.             hge->System_Start();  
  207.         }  
  208.     }  
  209.     else MessageBox(NULL, "Initiating failed...""Wrong", MB_ICONSTOP);  
  210.   
  211.     return 0;  
  212. }  

你可能感兴趣的:(一个送给HGE初学者的Demo——音乐节奏游戏)