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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.8
  3. ** Copyright (C) 2003-2007, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hge_tut08 - The Big Calm
  7. */
  8. // Copy the files "font2.fnt", "font2.png",
  9. // and "objects.png" from the folder "precompiled" to
  10. // the folder with executable file. Also copy hge.dll
  11. // to the same folder.
  12. // smaller sun & moon, underwater
  13. // moon shape, hide stars behind the moon
  14. #include <math.h>
  15. #include "....includehge.h"
  16. #include "....includehgecolor.h"
  17. #include "....includehgesprite.h"
  18. #include "....includehgedistort.h"
  19. #include "....includehgefont.h"
  20. // Pointer to the HGE interface (helper classes require this to work)
  21. HGE *hge=0;
  22. hgeFont *fnt=0;
  23. // Simulation constants
  24. #define SCREEN_WIDTH 800
  25. #define SCREEN_HEIGHT 600
  26. #define NUM_STARS 100
  27. #define SEA_SUBDIVISION 16
  28. #define SKY_HEIGHT (SCREEN_HEIGHT*0.6f)
  29. #define STARS_HEIGHT (SKY_HEIGHT*0.9f)
  30. #define ORBITS_RADIUS (SCREEN_WIDTH*0.43f)
  31. DWORD skyTopColors[] = {0xFF15092A, 0xFF6C6480, 0xFF89B9D0};
  32. DWORD skyBtmColors[] = {0xFF303E57, 0xFFAC7963, 0xFFCAD7DB};
  33. DWORD seaTopColors[] = {0xFF3D546B, 0xFF927E76, 0xFF86A2AD};
  34. DWORD seaBtmColors[] = {0xFF1E394C, 0xFF2F4E64, 0xFF2F4E64};
  35. int seq[]={0, 0, 1, 2, 2, 2, 1, 0, 0};
  36. // Simulation resource handles
  37. HTEXTURE texObjects;
  38. hgeSprite *sky;
  39. hgeSprite *sun;
  40. hgeSprite *moon;
  41. hgeSprite *glow;
  42. hgeSprite *seaglow;
  43. hgeSprite *star;
  44. hgeDistortionMesh *sea;
  45. hgeColor colWhite;
  46. // Simulation state variables
  47. float time; // 0-24 hrs
  48. float speed; // hrs per second
  49. int   seq_id;
  50. float seq_residue;
  51. float starX[NUM_STARS];  // x
  52. float starY[NUM_STARS];  // y
  53. float starS[NUM_STARS];  // scale
  54. float starA[NUM_STARS];  // alpha
  55. float seaP[SEA_SUBDIVISION]; // phase shift array
  56. hgeColor colSkyTop;
  57. hgeColor colSkyBtm;
  58. hgeColor colSeaTop;
  59. hgeColor colSeaBtm;
  60. hgeColor colSun;
  61. hgeColor colSunGlow;
  62. hgeColor colMoon;
  63. hgeColor colMoonGlow;
  64. hgeColor colSeaGlow;
  65. float sunX, sunY, sunS, sunGlowS;
  66. float moonX, moonY, moonS, moonGlowS;
  67. float seaGlowX, seaGlowSX, seaGlowSY;
  68. // Simulation methods
  69. bool InitSimulation();
  70. void DoneSimulation();
  71. void UpdateSimulation();
  72. void RenderSimulation();
  73. ///////////////////////// Implementation ///////////////////////////
  74. bool FrameFunc()
  75. {
  76. // Process keys
  77. switch(hge->Input_GetKey())
  78. {
  79. case HGEK_0: speed=0.0f; break;
  80. case HGEK_1: speed=0.1f; break;
  81. case HGEK_2: speed=0.2f; break;
  82. case HGEK_3: speed=0.4f; break;
  83. case HGEK_4: speed=0.8f; break;
  84. case HGEK_5: speed=1.6f; break;
  85. case HGEK_6: speed=3.2f; break;
  86. case HGEK_7: speed=6.4f; break;
  87. case HGEK_8: speed=12.8f; break;
  88. case HGEK_9: speed=25.6f; break;
  89. case HGEK_ESCAPE: return true;
  90. }
  91. // Update scene
  92. UpdateSimulation();
  93. return false;
  94. }
  95. bool RenderFunc()
  96. {
  97. int hrs, mins, secs;
  98. float tmp;
  99. // Calculate display time
  100. hrs=(int)floorf(time);
  101. tmp=(time-hrs)*60.0f;
  102. mins=(int)floorf(tmp);
  103. secs=(int)floorf((tmp-mins)*60.0f);
  104. // Render scene
  105. hge->Gfx_BeginScene();
  106. RenderSimulation();
  107. fnt->printf(7, 7, HGETEXT_LEFT, "Keys 1-9 to adjust simulation speed, 0 - real timenFPS: %d", hge->Timer_GetFPS());
  108. fnt->printf(SCREEN_WIDTH-50, 7, HGETEXT_LEFT, "%02d:%02d:%02d", hrs, mins, secs);
  109. hge->Gfx_EndScene();
  110. return false;
  111. }
  112. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  113. {
  114. hge = hgeCreate(HGE_VERSION);
  115. // Set desired system states and initialize HGE
  116. hge->System_SetState(HGE_LOGFILE, "hge_tut08.log");
  117. hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
  118. hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
  119. hge->System_SetState(HGE_TITLE, "HGE Tutorial 08 - The Big Calm");
  120. hge->System_SetState(HGE_USESOUND, false);
  121. hge->System_SetState(HGE_WINDOWED, true);
  122. hge->System_SetState(HGE_SCREENWIDTH, SCREEN_WIDTH);
  123. hge->System_SetState(HGE_SCREENHEIGHT, SCREEN_HEIGHT);
  124. hge->System_SetState(HGE_SCREENBPP, 32);
  125. if(hge->System_Initiate())
  126. {
  127. fnt=new hgeFont("font2.fnt");
  128. if(!InitSimulation())
  129. {
  130. // If one of the data files is not found, display an error message and shutdown
  131. MessageBox(NULL, "Can't load resources. See log for details.", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
  132. hge->System_Shutdown();
  133. hge->Release();
  134. return 0;
  135. }
  136. hge->System_Start();
  137. DoneSimulation();
  138. delete fnt;
  139. }
  140. hge->System_Shutdown();
  141. hge->Release();
  142. return 0;
  143. }
  144. float GetTime()
  145. {
  146. SYSTEMTIME SysTime;
  147. float tmp;
  148. GetLocalTime(&SysTime);
  149. tmp=SysTime.wSecond;
  150. tmp=SysTime.wMinute+tmp/60.0f;
  151. tmp=SysTime.wHour+tmp/60.0f;
  152. return tmp;
  153. }
  154. bool InitSimulation()
  155. {
  156. // Load texture
  157. texObjects=hge->Texture_Load("objects.png");
  158. if(!texObjects) return false;
  159. // Create sprites
  160. sky=new hgeSprite(0, 0, 0, SCREEN_WIDTH, SKY_HEIGHT);
  161. sea=new hgeDistortionMesh(SEA_SUBDIVISION, SEA_SUBDIVISION);
  162. sea->SetTextureRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-SKY_HEIGHT);
  163. sun=new hgeSprite(texObjects,81,0,114,114);
  164. sun->SetHotSpot(57,57);
  165. moon=new hgeSprite(texObjects,0,0,81,81);
  166. moon->SetHotSpot(40,40);
  167. star=new hgeSprite(texObjects,72,81,9,9);
  168. star->SetHotSpot(5,5);
  169. glow=new hgeSprite(texObjects,128,128,128,128);
  170. glow->SetHotSpot(64,64);
  171. glow->SetBlendMode(BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE);
  172. seaglow=new hgeSprite(texObjects,128,224,128,32);
  173. seaglow->SetHotSpot(64,0);
  174. seaglow->SetBlendMode(BLEND_COLORADD | BLEND_ALPHAADD | BLEND_NOZWRITE);
  175. // Initialize simulation state
  176. colWhite.SetHWColor(0xFFFFFFFF);
  177. time=GetTime();
  178. speed=0.0f;
  179. for(int i=0;i<NUM_STARS;i++) // star positions
  180. {
  181. starX[i]=hge->Random_Float(0, SCREEN_WIDTH);
  182. starY[i]=hge->Random_Float(0, STARS_HEIGHT);
  183. starS[i]=hge->Random_Float(0.1f, 0.7f);
  184. }
  185. for(i=0;i<SEA_SUBDIVISION;i++) // sea waves phase shifts
  186. {
  187. seaP[i]=i+hge->Random_Float(-15.0f, 15.0f);
  188. }
  189. // Systems are ready now!
  190. return true;
  191. }
  192. void DoneSimulation()
  193. {
  194. // Delete sprites
  195. delete seaglow;
  196. delete glow;
  197. delete star;
  198. delete moon;
  199. delete sun;
  200. delete sky;
  201. delete sea;
  202. // Free texture
  203. hge->Texture_Free(texObjects);
  204. }
  205. void UpdateSimulation()
  206. {
  207. int i, j, k;
  208. float zenith, a, dy, fTime;
  209. float posX, s1, s2;
  210. const float cellw=SCREEN_WIDTH/(SEA_SUBDIVISION-1);
  211. hgeColor col1, col2;
  212. DWORD dwCol1, dwCol2;
  213. // Update time of day
  214. if(speed==0.0f) time=GetTime();
  215. else
  216. {
  217. time+=hge->Timer_GetDelta()*speed;
  218. if(time>=24.0f) time-=24.0f;
  219. }
  220. seq_id=(int)(time/3);
  221. seq_residue=time/3-seq_id;
  222. zenith=-(time/12.0f*M_PI-M_PI_2);
  223. // Interpolate sea and sky colors
  224. col1.SetHWColor(skyTopColors[seq[seq_id]]);
  225. col2.SetHWColor(skyTopColors[seq[seq_id+1]]);
  226. colSkyTop=col2*seq_residue + col1*(1.0f-seq_residue);
  227. col1.SetHWColor(skyBtmColors[seq[seq_id]]);
  228. col2.SetHWColor(skyBtmColors[seq[seq_id+1]]);
  229. colSkyBtm=col2*seq_residue + col1*(1.0f-seq_residue);
  230. col1.SetHWColor(seaTopColors[seq[seq_id]]);
  231. col2.SetHWColor(seaTopColors[seq[seq_id+1]]);
  232. colSeaTop=col2*seq_residue + col1*(1.0f-seq_residue);
  233. col1.SetHWColor(seaBtmColors[seq[seq_id]]);
  234. col2.SetHWColor(seaBtmColors[seq[seq_id+1]]);
  235. colSeaBtm=col2*seq_residue + col1*(1.0f-seq_residue);
  236. // Update stars
  237. if(seq_id>=6 || seq_id<2)
  238. for(int i=0; i<NUM_STARS; i++)
  239. {
  240. a=1.0f-starY[i]/STARS_HEIGHT;
  241. a*=hge->Random_Float(0.6f, 1.0f);
  242. if(seq_id>=6) a*=sinf((time-18.0f)/6.0f*M_PI_2);
  243. else a*=sinf((1.0f-time/6.0f)*M_PI_2);
  244. starA[i]=a;
  245. }
  246. // Calculate sun position, scale and colors
  247.      if(seq_id==2) a=sinf(seq_residue*M_PI_2);
  248. else if(seq_id==5) a=cosf(seq_residue*M_PI_2);
  249. else if(seq_id>2 && seq_id<5) a=1.0f;
  250. else a=0.0f;
  251. colSun.SetHWColor(0xFFEAE1BE);
  252. colSun=colSun*(1-a)+colWhite*a;
  253. a=(cosf(time/6.0f*M_PI)+1.0f)/2.0f;
  254. if(seq_id>=2 && seq_id<=6)
  255. {
  256. colSunGlow=colWhite*a;
  257. colSunGlow.a=1.0f;
  258. }
  259. else colSunGlow.SetHWColor(0xFF000000);
  260. sunX=SCREEN_WIDTH*0.5f+cosf(zenith)*ORBITS_RADIUS;
  261. sunY=SKY_HEIGHT*1.2f+sinf(zenith)*ORBITS_RADIUS;
  262. sunS=1.0f-0.3f*sinf((time-6.0f)/12.0f*M_PI);
  263. sunGlowS=3.0f*(1.0f-a)+3.0f;
  264. // Calculate moon position, scale and colors
  265. if(seq_id>=6) a=sinf((time-18.0f)/6.0f*M_PI_2);
  266. else a=sinf((1.0f-time/6.0f)*M_PI_2);
  267. colMoon.SetHWColor(0x20FFFFFF);
  268. colMoon=colMoon*(1-a)+colWhite*a;
  269. colMoonGlow=colWhite;
  270. colMoonGlow.a=0.5f*a;
  271. moonX=SCREEN_WIDTH*0.5f+cosf(zenith-M_PI)*ORBITS_RADIUS;
  272. moonY=SKY_HEIGHT*1.2f+sinf(zenith-M_PI)*ORBITS_RADIUS;
  273. moonS=1.0f-0.3f*sinf((time+6.0f)/12.0f*M_PI);
  274. moonGlowS=a*0.4f+0.5f;
  275. // Calculate sea glow
  276. if(time>19.0f || time<4.5f) // moon
  277. {
  278. a=0.2f; // intensity
  279. if(time>19.0f && time<20.0f) a*=(time-19.0f);
  280. else if(time>3.5f && time<4.5f) a*=1.0f-(time-3.5f);
  281. colSeaGlow=colMoonGlow;
  282. colSeaGlow.a=a;
  283. seaGlowX=moonX;
  284. seaGlowSX=moonGlowS*3.0f;
  285. seaGlowSY=moonGlowS*2.0f;
  286. }
  287. else if(time>6.5f && time<19.0f) // sun
  288. {
  289. a=0.3f; // intensity
  290. if(time<7.5f) a*=(time-6.5f);
  291. else if(time>18.0f) a*=1.0f-(time-18.0f);
  292. colSeaGlow=colSunGlow;
  293. colSeaGlow.a=a;
  294. seaGlowX=sunX;
  295. seaGlowSX=sunGlowS;
  296. seaGlowSY=sunGlowS*0.6f;
  297. }
  298. else colSeaGlow.a=0.0f;
  299. // Move waves and update sea color
  300. for(i=1; i<SEA_SUBDIVISION-1; i++)
  301. {
  302. a=float(i)/(SEA_SUBDIVISION-1);
  303. col1=colSeaTop*(1-a)+colSeaBtm*a;
  304. dwCol1=col1.GetHWColor();
  305. fTime=2.0f*hge->Timer_GetTime();
  306. a*=20;
  307. for(j=0; j<SEA_SUBDIVISION; j++)
  308. {
  309. sea->SetColor(j, i, dwCol1);
  310. dy=a*sinf(seaP[i]+(float(j)/(SEA_SUBDIVISION-1)-0.5f)*M_PI*16.0f-fTime);
  311. sea->SetDisplacement(j, i, 0.0f, dy, HGEDISP_NODE);
  312. }
  313. }
  314. dwCol1=colSeaTop.GetHWColor();
  315. dwCol2=colSeaBtm.GetHWColor();
  316. for(j=0; j<SEA_SUBDIVISION; j++)
  317. {
  318. sea->SetColor(j, 0, dwCol1);
  319. sea->SetColor(j, SEA_SUBDIVISION-1, dwCol2);
  320. }
  321. // Calculate light path
  322. if(time>19.0f || time<5.0f) // moon
  323. {
  324. a=0.12f; // intensity
  325. if(time>19.0f && time<20.0f) a*=(time-19.0f);
  326. else if(time>4.0f && time<5.0f) a*=1.0f-(time-4.0f);
  327. posX=moonX;
  328. }
  329. else if(time>7.0f && time<17.0f) // sun
  330. {
  331. a=0.14f; // intensity
  332. if(time<8.0f) a*=(time-7.0f);
  333. else if(time>16.0f) a*=1.0f-(time-16.0f);
  334. posX=sunX;
  335. }
  336. else a=0.0f;
  337. if(a!=0.0f)
  338. {
  339. k=(int)floorf(posX/cellw);
  340. s1=(1.0f-(posX-k*cellw)/cellw);
  341. s2=(1.0f-((k+1)*cellw-posX)/cellw);
  342. if(s1>0.7f) s1=0.7f;
  343. if(s2>0.7f) s2=0.7f;
  344. s1*=a;
  345. s2*=a;
  346. for(i=0; i<SEA_SUBDIVISION; i+=2)
  347. {
  348. a=sinf(float(i)/(SEA_SUBDIVISION-1)*M_PI_2);
  349. col1.SetHWColor(sea->GetColor(k,i));
  350. col1+=colSun*s1*(1-a);
  351. col1.Clamp();
  352. sea->SetColor(k, i, col1.GetHWColor());
  353. col1.SetHWColor(sea->GetColor(k+1,i));
  354. col1+=colSun*s2*(1-a);
  355. col1.Clamp();
  356. sea->SetColor(k+1, i, col1.GetHWColor());
  357. }
  358. }
  359. }
  360. void RenderSimulation()
  361. {
  362. // Render sky
  363. sky->SetColor(colSkyTop.GetHWColor(), 0);
  364. sky->SetColor(colSkyTop.GetHWColor(), 1);
  365. sky->SetColor(colSkyBtm.GetHWColor(), 2);
  366. sky->SetColor(colSkyBtm.GetHWColor(), 3);
  367. sky->Render(0, 0);
  368. // Render stars
  369. if(seq_id>=6 || seq_id<2)
  370. for(int i=0; i<NUM_STARS; i++)
  371. {
  372. star->SetColor((DWORD(starA[i]*255.0f)<<24) | 0xFFFFFF);
  373. star->RenderEx(starX[i], starY[i], 0.0f, starS[i]);
  374. }
  375. // Render sun
  376. glow->SetColor(colSunGlow.GetHWColor());
  377. glow->RenderEx(sunX, sunY, 0.0f, sunGlowS);
  378. sun->SetColor(colSun.GetHWColor());
  379. sun->RenderEx(sunX, sunY, 0.0f, sunS);
  380. // Render moon
  381. glow->SetColor(colMoonGlow.GetHWColor());
  382. glow->RenderEx(moonX, moonY, 0.0f, moonGlowS);
  383. moon->SetColor(colMoon.GetHWColor());
  384. moon->RenderEx(moonX, moonY, 0.0f, moonS);
  385. // Render sea
  386. sea->Render(0, SKY_HEIGHT);
  387. seaglow->SetColor(colSeaGlow.GetHWColor());
  388. seaglow->RenderEx(seaGlowX, SKY_HEIGHT, 0.0f, seaGlowSX, seaGlowSY);
  389. }