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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.8
  3. ** Copyright (C) 2003-2007, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hge_tut04 - Using render targets
  7. */
  8. // Copy the files "particles.png", "menu.wav",
  9. // "font1.fnt", "font1.png" and "trail.psi" from
  10. // the folder "precompiled" to the folder with
  11. // executable file. Also copy hge.dll and bass.dll
  12. // to the same folder.
  13. #include "....includehge.h"
  14. #include "....includehgesprite.h"
  15. #include "....includehgefont.h"
  16. #include "....includehgeparticle.h"
  17. HGE *hge=0;
  18. hgeSprite* spr;
  19. hgeSprite* spt;
  20. hgeSprite* tar;
  21. hgeFont* fnt;
  22. hgeParticleSystem* par;
  23. HTEXTURE tex;
  24. HEFFECT snd;
  25. // HGE render target handle
  26. HTARGET target;
  27. float x=100.0f, y=100.0f;
  28. float dx=0.0f, dy=0.0f;
  29. const float speed=90;
  30. const float friction=0.98f;
  31. void boom() {
  32. int pan=int((x-256)/2.56f);
  33. float pitch=(dx*dx+dy*dy)*0.0005f+0.2f;
  34. hge->Effect_PlayEx(snd,100,pan,pitch);
  35. }
  36. // This function will be called by HGE when
  37. // render targets were lost and have been just created
  38. // again. We use it here to update the render
  39. // target's texture handle that changes during recreation.
  40. bool GfxRestoreFunc()
  41. {
  42. if(tar && target) tar->SetTexture(hge->Target_GetTexture(target));
  43. return false;
  44. }
  45. bool FrameFunc()
  46. {
  47. float dt=hge->Timer_GetDelta();
  48. // Process keys
  49. if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;
  50. if (hge->Input_GetKeyState(HGEK_LEFT)) dx-=speed*dt;
  51. if (hge->Input_GetKeyState(HGEK_RIGHT)) dx+=speed*dt;
  52. if (hge->Input_GetKeyState(HGEK_UP)) dy-=speed*dt;
  53. if (hge->Input_GetKeyState(HGEK_DOWN)) dy+=speed*dt;
  54. // Do some movement calculations and collision detection
  55. dx*=friction; dy*=friction; x+=dx; y+=dy;
  56. if(x>496) {x=496-(x-496);dx=-dx;boom();}
  57. if(x<16) {x=16+16-x;dx=-dx;boom();}
  58. if(y>496) {y=496-(y-496);dy=-dy;boom();}
  59. if(y<16) {y=16+16-y;dy=-dy;boom();}
  60. // Update particle system
  61. par->info.nEmission=(int)(dx*dx+dy*dy);
  62. par->MoveTo(x,y);
  63. par->Update(dt);
  64. return false;
  65. }
  66. bool RenderFunc()
  67. {
  68. int i;
  69. // Render graphics to the texture
  70. hge->Gfx_BeginScene(target);
  71. hge->Gfx_Clear(0);
  72. par->Render();
  73. spr->Render(x, y);
  74. hge->Gfx_EndScene();
  75. // Now put several instances of the rendered texture to the screen
  76. hge->Gfx_BeginScene();
  77. hge->Gfx_Clear(0);
  78. for(i=0;i<6;i++)
  79. {
  80. tar->SetColor(0xFFFFFF | (((5-i)*40+55)<<24));
  81. tar->RenderEx(i*100.0f, i*50.0f, i*M_PI/8, 1.0f-i*0.1f);
  82. }
  83. fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3fnFPS:%d (constant)", hge->Timer_GetDelta(), hge->Timer_GetFPS());
  84. hge->Gfx_EndScene();
  85. return false;
  86. }
  87. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  88. {
  89. hge = hgeCreate(HGE_VERSION);
  90. hge->System_SetState(HGE_LOGFILE, "hge_tut04.log");
  91. hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
  92. hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
  93. hge->System_SetState(HGE_GFXRESTOREFUNC, GfxRestoreFunc);
  94. hge->System_SetState(HGE_TITLE, "HGE Tutorial 04 - Using render targets");
  95. hge->System_SetState(HGE_FPS, 100);
  96. hge->System_SetState(HGE_WINDOWED, true);
  97. hge->System_SetState(HGE_SCREENWIDTH, 800);
  98. hge->System_SetState(HGE_SCREENHEIGHT, 600);
  99. hge->System_SetState(HGE_SCREENBPP, 32);
  100. tar=0;
  101. target=0;
  102. if(hge->System_Initiate()) {
  103. snd=hge->Effect_Load("menu.wav");
  104. tex=hge->Texture_Load("particles.png");
  105. if(!snd || !tex)
  106. {
  107. // If one of the data files is not found, display
  108. // an error message and shutdown.
  109. MessageBox(NULL, "Can't load one of the following files:nMENU.WAV, PARTICLES.PNG, FONT1.FNT, FONT1.PNG, TRAIL.PSI", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
  110. hge->System_Shutdown();
  111. hge->Release();
  112. return 0;
  113. }
  114. spr=new hgeSprite(tex, 96, 64, 32, 32);
  115. spr->SetColor(0xFFFFA000);
  116. spr->SetHotSpot(16,16);
  117. fnt=new hgeFont("font1.fnt");
  118. spt=new hgeSprite(tex, 32, 32, 32, 32);
  119. spt->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE);
  120. spt->SetHotSpot(16,16);
  121. par=new hgeParticleSystem("trail.psi",spt);
  122. par->Fire();
  123. // Create a render target and a sprite for it
  124. target=hge->Target_Create(512,512,false);
  125. tar=new hgeSprite(hge->Target_GetTexture(target),0,0,512,512);
  126. tar->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE);
  127. // Let's rock now!
  128. hge->System_Start();
  129. // Delete created objects and free loaded resources
  130. delete par;
  131. delete fnt;
  132. delete spt;
  133. delete spr;
  134. delete tar;
  135. hge->Target_Free(target);
  136. hge->Texture_Free(tex);
  137. hge->Effect_Free(snd);
  138. }
  139. // Clean up and shutdown
  140. hge->System_Shutdown();
  141. hge->Release();
  142. return 0;
  143. }