hge_tut02.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.8
  3. ** Copyright (C) 2003-2007, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hge_tut02 - Using input, sound and rendering
  7. */
  8. // Copy the files "particles.png" and "menu.wav"
  9. // from the folder "precompiled" to the folder with
  10. // executable file. Also copy hge.dll and bass.dll
  11. // to the same folder.
  12. #include "....includehge.h"
  13. HGE *hge=0;
  14. // Quad is the basic primitive in HGE
  15. // used for rendering graphics.
  16. // Quad contains 4 vertices, numbered
  17. // 0 to 3 clockwise.
  18. hgeQuad quad;
  19. // Handle for a sound effect
  20. HEFFECT snd;
  21. // Some "gameplay" variables and constants
  22. float x=100.0f, y=100.0f;
  23. float dx=0.0f, dy=0.0f;
  24. const float speed=90;
  25. const float friction=0.98f;
  26. // This function plays collision sound with
  27. // parameters based on sprite position and speed
  28. void boom() {
  29. int pan=int((x-400)/4);
  30. float pitch=(dx*dx+dy*dy)*0.0005f+0.2f;
  31. hge->Effect_PlayEx(snd,100,pan,pitch);
  32. }
  33. bool FrameFunc()
  34. {
  35. // Get the time elapsed since last call of FrameFunc().
  36. // This will help us to synchronize on different
  37. // machines and video modes.
  38. float dt=hge->Timer_GetDelta();
  39. // Process keys
  40. if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;
  41. if (hge->Input_GetKeyState(HGEK_LEFT)) dx-=speed*dt;
  42. if (hge->Input_GetKeyState(HGEK_RIGHT)) dx+=speed*dt;
  43. if (hge->Input_GetKeyState(HGEK_UP)) dy-=speed*dt;
  44. if (hge->Input_GetKeyState(HGEK_DOWN)) dy+=speed*dt;
  45. // Do some movement calculations and collision detection
  46. dx*=friction; dy*=friction; x+=dx; y+=dy;
  47. if(x>784) {x=784-(x-784);dx=-dx;boom();}
  48. if(x<16) {x=16+16-x;dx=-dx;boom();}
  49. if(y>584) {y=584-(y-584);dy=-dy;boom();}
  50. if(y<16) {y=16+16-y;dy=-dy;boom();}
  51. // Set up quad's screen coordinates
  52. quad.v[0].x=x-16; quad.v[0].y=y-16;
  53. quad.v[1].x=x+16; quad.v[1].y=y-16;
  54. quad.v[2].x=x+16; quad.v[2].y=y+16;
  55. quad.v[3].x=x-16; quad.v[3].y=y+16;
  56. // Continue execution
  57. return false;
  58. }
  59. // This function will be called by HGE when
  60. // the application window should be redrawn.
  61. // Put your rendering code here.
  62. bool RenderFunc()
  63. {
  64. // Begin rendering quads.
  65. // This function must be called
  66. // before any actual rendering.
  67. hge->Gfx_BeginScene();
  68. // Clear screen with black color
  69. hge->Gfx_Clear(0);
  70. // Render quads here. This time just
  71. // one of them will serve our needs.
  72. hge->Gfx_RenderQuad(&quad);
  73. // End rendering and update the screen
  74. hge->Gfx_EndScene();
  75. // RenderFunc should always return false
  76. return false;
  77. }
  78. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  79. {
  80. // Get HGE interface
  81. hge = hgeCreate(HGE_VERSION);
  82. // Set up log file, frame function, render function and window title
  83. hge->System_SetState(HGE_LOGFILE, "hge_tut02.log");
  84. hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
  85. hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
  86. hge->System_SetState(HGE_TITLE, "HGE Tutorial 02 - Using input, sound and rendering");
  87. // Set up video mode
  88. hge->System_SetState(HGE_WINDOWED, true);
  89. hge->System_SetState(HGE_SCREENWIDTH, 800);
  90. hge->System_SetState(HGE_SCREENHEIGHT, 600);
  91. hge->System_SetState(HGE_SCREENBPP, 32);
  92. if(hge->System_Initiate())
  93. {
  94. // Load sound and texture
  95. snd=hge->Effect_Load("menu.wav");
  96. quad.tex=hge->Texture_Load("particles.png");
  97. if(!snd || !quad.tex)
  98. {
  99. // If one of the data files is not found, display
  100. // an error message and shutdown.
  101. MessageBox(NULL, "Can't load MENU.WAV or PARTICLES.PNG", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
  102. hge->System_Shutdown();
  103. hge->Release();
  104. return 0;
  105. }
  106. // Set up quad which we will use for rendering sprite
  107. quad.blend=BLEND_ALPHAADD | BLEND_COLORMUL | BLEND_ZWRITE;
  108. for(int i=0;i<4;i++)
  109. {
  110. // Set up z-coordinate of vertices
  111. quad.v[i].z=0.5f;
  112. // Set up color. The format of DWORD col is 0xAARRGGBB
  113. quad.v[i].col=0xFFFFA000;
  114. }
  115. // Set up quad's texture coordinates.
  116. // 0,0 means top left corner and 1,1 -
  117. // bottom right corner of the texture.
  118. quad.v[0].tx=96.0/128.0; quad.v[0].ty=64.0/128.0; 
  119. quad.v[1].tx=128.0/128.0; quad.v[1].ty=64.0/128.0; 
  120. quad.v[2].tx=128.0/128.0; quad.v[2].ty=96.0/128.0; 
  121. quad.v[3].tx=96.0/128.0; quad.v[3].ty=96.0/128.0; 
  122. // Let's rock now!
  123. hge->System_Start();
  124. // Free loaded texture and sound
  125. hge->Texture_Free(quad.tex);
  126. hge->Effect_Free(snd);
  127. }
  128. else MessageBox(NULL, hge->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
  129. // Clean up and shutdown
  130. hge->System_Shutdown();
  131. hge->Release();
  132. return 0;
  133. }