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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.7
  3. ** Copyright (C) 2007, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** Particle systems editor
  7. */
  8. #include "particleed.h"
  9. HGE *hge=0;
  10. hgeFont *fnt;
  11. hgeGUI *gui;
  12. HTEXTURE texGui, texParticles;
  13. hgeSprite *sprLeftPane1, *sprLeftPane2, *sprRightPane1, *sprRightPane2;
  14. hgeSprite *sprCursor, *sprColor, *sprBBox;
  15. hgeAnimation *sprParticles;
  16. PEditorState state;
  17. float psx=400, psy=300;
  18. void InitEditor();
  19. void DoneEditor();
  20. void CreateGUI();
  21. bool FrameFunc()
  22. {
  23. float px, py;
  24. float dt=hge->Timer_GetDelta();
  25. // Update
  26. hge->Input_GetMousePos(&state.mx, &state.my);
  27. if(hge->Input_GetKeyState(HGEK_RBUTTON)) { psx=state.mx; psy=state.my; }
  28. else { psx=400; psy=300; }
  29. if(state.bIFace)
  30. {
  31. if(psx > 631) psx=631;
  32. if(psx < 168) psx=168;
  33. }
  34. state.ps->GetPosition(&px, &py);
  35. state.ps->MoveTo(px+(psx-px)*10*dt, py+(psy-py)*10*dt);
  36. state.ps->Update(dt);
  37. if(HandleKeys(hge->Input_GetKey())) return true;
  38. if(state.bIFace)
  39. {
  40. if(DoCommands(gui->Update(dt))) return true;
  41. }
  42. GetTextCtrl(CMD_NPARTICLES)->printf("%d", state.ps->GetParticlesAlive());
  43. GetTextCtrl(CMD_FPS)->printf("%d", hge->Timer_GetFPS());
  44. return false;
  45. }
  46. bool RenderFunc()
  47. {
  48. hgeRect bbox;
  49. // Render
  50. hge->Gfx_Clear(0);
  51. hge->Gfx_BeginScene();
  52. if(state.sprBG) state.sprBG->Render(400, 300);
  53. state.ps->Render();
  54. if(state.bBBox)
  55. {
  56. state.ps->GetBoundingBox(&bbox);
  57. if(!bbox.IsClean()) sprBBox->RenderStretch(bbox.x1, bbox.y1, bbox.x2, bbox.y2);
  58. }
  59. if(state.bIFace)
  60. {
  61. sprLeftPane1->Render(0,0);
  62. sprLeftPane2->Render(0,512);
  63. sprRightPane1->Render(632,0);
  64. sprRightPane2->Render(632,512);
  65. gui->Render();
  66. sprParticles->SetColor(state.ps->info.colColorStart.GetHWColor() | 0xFF000000);
  67. sprParticles->Render(26,189);
  68. sprColor->Render(642,221);
  69. }
  70. if(state.bHelp)
  71. {
  72. fnt->SetColor(0xFFFFFFFF);
  73. fnt->Render(189, 18, HGETEXT_LEFT, "Left mouse button - fire particle systemn"
  74. "Right mouse button - move the system with mousenn"
  75. "Keys 1 to 9 - select presetnPresets are saved and loaded automaticallynn"
  76. "TAB - Hide editor panelsn"
  77. "Esc - Exitnn"
  78. "Edit PARTICLEED.INI file to change backdrop or fullscreen/windowed mode");
  79. }
  80. if(hge->Input_IsMouseOver() && !hge->Input_GetKeyState(HGEK_RBUTTON)) sprCursor->Render(state.mx, state.my);
  81. hge->Gfx_EndScene();
  82. return false;
  83. }
  84. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  85. {
  86. hge = hgeCreate(HGE_VERSION);
  87. hge->System_SetState(HGE_INIFILE, "particleed.ini");
  88. hge->System_SetState(HGE_LOGFILE, "particleed.log");
  89. hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
  90. hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
  91. hge->System_SetState(HGE_TITLE, "HGE Particle Systems Editor");
  92. hge->System_SetState(HGE_SCREENWIDTH, 800);
  93. hge->System_SetState(HGE_SCREENHEIGHT, 600);
  94. hge->System_SetState(HGE_SCREENBPP, 32);
  95. hge->System_SetState(HGE_USESOUND, false);
  96. if(hge->Ini_GetInt("HGE", "FullScreen",0)) hge->System_SetState(HGE_WINDOWED, false);
  97. else hge->System_SetState(HGE_WINDOWED, true);
  98. if(hge->System_Initiate())
  99. {
  100. InitEditor();
  101. hge->System_Start();
  102. DoneEditor();
  103. }
  104. else MessageBox(NULL, hge->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
  105. hge->System_Shutdown();
  106. hge->Release();
  107. return 0;
  108. }
  109. void InitEditor()
  110. {
  111. hgeParticleSystemInfo psi;
  112. char *bgName;
  113. int bgw, bgh;
  114. state.texBG = 0;
  115. state.sprBG = 0;
  116. bgName = hge->Ini_GetString("HGE", "Background", 0);
  117. if(bgName)
  118. {
  119. state.texBG = hge->Texture_Load(bgName);
  120. bgw = hge->Texture_GetWidth(state.texBG, true);
  121. bgh = hge->Texture_GetHeight(state.texBG, true);
  122. state.sprBG = new hgeSprite(state.texBG, 0, 0, (float)bgw, (float)bgh);
  123. state.sprBG->SetHotSpot((float)bgw/2, (float)bgh/2);
  124. }
  125. hge->Resource_AttachPack("particleed.paq");
  126. state.bIFace=true;
  127. state.bHelp=false;
  128. state.bBBox=false;
  129. state.nPreset=0;
  130. texParticles=hge->Texture_Load("particles.png");
  131. sprParticles=new hgeAnimation(texParticles, 16, 1.0f, 0, 0, 32, 32);
  132. sprParticles->SetHotSpot(16,16);
  133. memset(&psi, 0, sizeof(hgeParticleSystemInfo));
  134. psi.sprite=sprParticles;
  135. state.ps=new hgeParticleSystem(&psi);
  136. state.ps->TrackBoundingBox(true);
  137. state.ps->MoveTo(psx, psy);
  138. fnt=new hgeFont("font3.fnt");
  139. texGui=hge->Texture_Load("pgui.png");
  140. sprCursor=new hgeSprite(texGui, 487, 181, 19, 26);
  141. sprColor=new hgeSprite(texGui, 466, 208, 14, 80);
  142. sprBBox=new hgeSprite(texGui, 337, 209, 128, 128);
  143. sprLeftPane1=new hgeSprite(texGui, 0, 0, 168, 512);
  144. sprLeftPane2=new hgeSprite(texGui, 336, 0, 168, 88);
  145. sprRightPane1=new hgeSprite(texGui, 168, 0, 168, 512);
  146. sprRightPane2=new hgeSprite(texGui, 336, 88, 168, 88);
  147. gui=new hgeGUI();
  148. CreateGUI();
  149. cmdLoadPreset(state.nPreset);
  150. }
  151. void DoneEditor()
  152. {
  153. cmdSavePreset(state.nPreset);
  154. if(state.sprBG) delete state.sprBG;
  155. if(state.texBG) hge->Texture_Free(state.texBG);
  156. delete gui;
  157. delete sprLeftPane1;
  158. delete sprLeftPane2;
  159. delete sprRightPane1;
  160. delete sprRightPane2;
  161. delete sprBBox;
  162. delete sprColor;
  163. delete sprCursor;
  164. delete fnt;
  165. delete state.ps;
  166. delete sprParticles;
  167. hge->Texture_Free(texParticles);
  168. hge->Texture_Free(texGui);
  169. hge->Resource_RemoveAllPacks();
  170. }
  171. void CreateGUI()
  172. {
  173. hgeGUIButton *button;
  174. hgeGUISlider *slider;
  175. hgeGUIText  *text;
  176. // Presets & stuff
  177. gui->AddCtrl(new hgeGUIButton(CMD_EXIT, 718, 484, 73, 17, texGui, 336, 191));
  178. button=new hgeGUIButton(CMD_HELP, 641, 484, 73, 17, texGui, 336, 191);
  179. button->SetMode(true);
  180. gui->AddCtrl(button);
  181. button=new hgeGUIButton(CMD_PRESET1, 641, 389, 16, 15, texGui, 384, 176);
  182. button->SetMode(true);
  183. button->SetState(true);
  184. gui->AddCtrl(button);
  185. button=new hgeGUIButton(CMD_PRESET2, 657, 389, 16, 15, texGui, 384, 176);
  186. button->SetMode(true);
  187. gui->AddCtrl(button);
  188. button=new hgeGUIButton(CMD_PRESET3, 673, 389, 16, 15, texGui, 384, 176);
  189. button->SetMode(true);
  190. gui->AddCtrl(button);
  191. button=new hgeGUIButton(CMD_PRESET4, 689, 389, 16, 15, texGui, 384, 176);
  192. button->SetMode(true);
  193. gui->AddCtrl(button);
  194. button=new hgeGUIButton(CMD_PRESET5, 705, 389, 16, 15, texGui, 384, 176);
  195. button->SetMode(true);
  196. gui->AddCtrl(button);
  197. button=new hgeGUIButton(CMD_PRESET6, 721, 389, 16, 15, texGui, 384, 176);
  198. button->SetMode(true);
  199. gui->AddCtrl(button);
  200. button=new hgeGUIButton(CMD_PRESET7, 737, 389, 16, 15, texGui, 384, 176);
  201. button->SetMode(true);
  202. gui->AddCtrl(button);
  203. button=new hgeGUIButton(CMD_PRESET8, 753, 389, 16, 15, texGui, 384, 176);
  204. button->SetMode(true);
  205. gui->AddCtrl(button);
  206. button=new hgeGUIButton(CMD_PRESET9, 769, 389, 16, 15, texGui, 384, 176);
  207. button->SetMode(true);
  208. gui->AddCtrl(button);
  209. button=new hgeGUIButton(CMD_BOUNDINGBOX, 641, 417, 8, 8, texGui, 368, 176);
  210. button->SetMode(true);
  211. gui->AddCtrl(button);
  212. text=new hgeGUIText(CMD_FPS, 641, 456, 28, 16, fnt);
  213. text->SetMode(HGETEXT_RIGHT);
  214. text->SetColor(0xFFD4C25A);
  215. gui->AddCtrl(text);
  216. text=new hgeGUIText(CMD_NPARTICLES, 641, 437, 28, 16, fnt);
  217. text->SetMode(HGETEXT_RIGHT);
  218. text->SetColor(0xFFD4C25A);
  219. gui->AddCtrl(text);
  220. // System parameters
  221. slider=new hgeGUISlider(CMD_SYS_LIFETIME, 10, 44, 149, 6, texGui, 417, 177, 6, 6);
  222. slider->SetMode(0, 10, HGESLIDER_BAR);
  223. slider->SetValue(5);
  224. gui->AddCtrl(slider);
  225. text=new hgeGUIText(CMD_SYS_TLIFETIME, 113, 30, 28, 12, fnt);
  226. text->SetMode(HGETEXT_RIGHT);
  227. text->SetText("0");
  228. gui->AddCtrl(text);
  229. button=new hgeGUIButton(CMD_SYS_LIFECONT, 9, 55, 8, 8, texGui, 368, 176);
  230. button->SetMode(true);
  231. gui->AddCtrl(button);
  232. slider=new hgeGUISlider(CMD_SYS_EMISSION, 10, 91, 149, 6, texGui, 417, 177, 6, 6);
  233. slider->SetMode(0, 1000, HGESLIDER_BAR);
  234. slider->SetValue(500);
  235. gui->AddCtrl(slider);
  236. text=new hgeGUIText(CMD_SYS_TEMISSION, 103, 77, 28, 12, fnt);
  237. text->SetMode(HGETEXT_RIGHT);
  238. text->SetText("0");
  239. gui->AddCtrl(text);
  240. button=new hgeGUIButton(CMD_SYS_PARLIFETIMELOCK, 144, 111, 16, 11, texGui, 336, 176);
  241. button->SetMode(true);
  242. gui->AddCtrl(button);
  243. slider=new hgeGUISlider(CMD_SYS_PARLIFETIMEMIN, 33, 126, 126, 6, texGui, 417, 177, 6, 6);
  244. slider->SetMode(0, 5, HGESLIDER_BAR);
  245. slider->SetValue(2.5);
  246. gui->AddCtrl(slider);
  247. slider=new hgeGUISlider(CMD_SYS_PARLIFETIMEMAX, 33, 138, 126, 6, texGui, 417, 177, 6, 6);
  248. slider->SetMode(0, 5, HGESLIDER_BAR);
  249. slider->SetValue(2.5);
  250. gui->AddCtrl(slider);
  251. button=new hgeGUIButton(CMD_SYS_BLENDADDITIVE, 72, 174, 8, 8, texGui, 368, 176);
  252. button->SetMode(true);
  253. gui->AddCtrl(button);
  254. button=new hgeGUIButton(CMD_SYS_BLENDBLEND, 72, 188, 8, 8, texGui, 368, 176);
  255. button->SetMode(true);
  256. button->SetState(true);
  257. gui->AddCtrl(button);
  258. button=new hgeGUIButton(CMD_SYS_TEXTURE, 10, 173, 32, 32, texGui, 336, 338);
  259. button->SetMode(true);
  260. gui->AddCtrl(button);
  261. // Particle movement
  262. slider=new hgeGUISlider(CMD_PM_DIRECTION, 9, 267, 149, 6, texGui, 417, 177, 6, 6);
  263. slider->SetMode(0, 2*M_PI, HGESLIDER_BAR);
  264. slider->SetValue(M_PI);
  265. gui->AddCtrl(slider);
  266. text=new hgeGUIText(CMD_PM_TDIRECTION, 112, 253, 28, 12, fnt);
  267. text->SetMode(HGETEXT_RIGHT);
  268. text->SetText("0");
  269. gui->AddCtrl(text);
  270. button=new hgeGUIButton(CMD_PM_RELATIVE, 8, 278, 8, 8, texGui, 368, 176);
  271. button->SetMode(true);
  272. gui->AddCtrl(button);
  273. slider=new hgeGUISlider(CMD_PM_SPREAD, 9, 314, 149, 6, texGui, 417, 177, 6, 6);
  274. slider->SetMode(0, 2*M_PI, HGESLIDER_BAR);
  275. slider->SetValue(M_PI);
  276. gui->AddCtrl(slider);
  277. text=new hgeGUIText(CMD_PM_TSPREAD, 112, 300, 28, 12, fnt);
  278. text->SetMode(HGETEXT_RIGHT);
  279. text->SetText("0");
  280. gui->AddCtrl(text);
  281. button=new hgeGUIButton(CMD_PM_STARTSPEEDLOCK, 143, 334, 16, 11, texGui, 336, 176);
  282. button->SetMode(true);
  283. gui->AddCtrl(button);
  284. slider=new hgeGUISlider(CMD_PM_STARTSPEEDMIN, 32, 349, 126, 6, texGui, 417, 177, 6, 6);
  285. slider->SetMode(-300, 300, HGESLIDER_BARRELATIVE);
  286. slider->SetValue(0);
  287. gui->AddCtrl(slider);
  288. slider=new hgeGUISlider(CMD_PM_STARTSPEEDMAX, 32, 361, 126, 6, texGui, 417, 177, 6, 6);
  289. slider->SetMode(-300, 300, HGESLIDER_BARRELATIVE);
  290. slider->SetValue(0);
  291. gui->AddCtrl(slider);
  292. button=new hgeGUIButton(CMD_PM_GRAVITYLOCK, 143, 381, 16, 11, texGui, 336, 176);
  293. button->SetMode(true);
  294. gui->AddCtrl(button);
  295. slider=new hgeGUISlider(CMD_PM_GRAVITYMIN, 32, 396, 126, 6, texGui, 417, 177, 6, 6);
  296. slider->SetMode(-900, 900, HGESLIDER_BARRELATIVE);
  297. slider->SetValue(0);
  298. gui->AddCtrl(slider);
  299. slider=new hgeGUISlider(CMD_PM_GRAVITYMAX, 32, 408, 126, 6, texGui, 417, 177, 6, 6);
  300. slider->SetMode(-900, 900, HGESLIDER_BARRELATIVE);
  301. slider->SetValue(0);
  302. gui->AddCtrl(slider);
  303. button=new hgeGUIButton(CMD_PM_RADIALLOCK, 143, 428, 16, 11, texGui, 336, 176);
  304. button->SetMode(true);
  305. gui->AddCtrl(button);
  306. slider=new hgeGUISlider(CMD_PM_RADIALMIN, 32, 443, 126, 6, texGui, 417, 177, 6, 6);
  307. slider->SetMode(-900, 900, HGESLIDER_BARRELATIVE);
  308. slider->SetValue(0);
  309. gui->AddCtrl(slider);
  310. slider=new hgeGUISlider(CMD_PM_RADIALMAX, 32, 455, 126, 6, texGui, 417, 177, 6, 6);
  311. slider->SetMode(-900, 900, HGESLIDER_BARRELATIVE);
  312. slider->SetValue(0);
  313. gui->AddCtrl(slider);
  314. button=new hgeGUIButton(CMD_PM_TANGENTIALLOCK, 143, 475, 16, 11, texGui, 336, 176);
  315. button->SetMode(true);
  316. gui->AddCtrl(button);
  317. slider=new hgeGUISlider(CMD_PM_TANGENTIALMIN, 32, 490, 126, 6, texGui, 417, 177, 6, 6);
  318. slider->SetMode(-900, 900, HGESLIDER_BARRELATIVE);
  319. slider->SetValue(0);
  320. gui->AddCtrl(slider);
  321. slider=new hgeGUISlider(CMD_PM_TANGENTIALMAX, 32, 502, 126, 6, texGui, 417, 177, 6, 6);
  322. slider->SetMode(-900, 900, HGESLIDER_BARRELATIVE);
  323. slider->SetValue(0);
  324. gui->AddCtrl(slider);
  325. // Particle appearance
  326. button=new hgeGUIButton(CMD_PA_SIZELOCK, 775, 29, 16, 11, texGui, 336, 176);
  327. button->SetMode(true);
  328. gui->AddCtrl(button);
  329. slider=new hgeGUISlider(CMD_PA_SIZESTART, 664, 44, 126, 6, texGui, 417, 177, 6, 6);
  330. slider->SetMode(1, 100, HGESLIDER_BAR);
  331. slider->SetValue(32);
  332. gui->AddCtrl(slider);
  333. slider=new hgeGUISlider(CMD_PA_SIZEEND, 664, 56, 126, 6, texGui, 417, 177, 6, 6);
  334. slider->SetMode(1, 100, HGESLIDER_BAR);
  335. slider->SetValue(32);
  336. gui->AddCtrl(slider);
  337. slider=new hgeGUISlider(CMD_PA_SIZEVAR, 664, 68, 126, 6, texGui, 417, 177, 6, 6);
  338. slider->SetMode(0, 1, HGESLIDER_BAR);
  339. slider->SetValue(0.5);
  340. gui->AddCtrl(slider);
  341. button=new hgeGUIButton(CMD_PA_SPINLOCK, 775, 88, 16, 11, texGui, 336, 176);
  342. button->SetMode(true);
  343. gui->AddCtrl(button);
  344. slider=new hgeGUISlider(CMD_PA_SPINSTART, 664, 103, 126, 6, texGui, 417, 177, 6, 6);
  345. slider->SetMode(-50, 50, HGESLIDER_BARRELATIVE);
  346. slider->SetValue(0);
  347. gui->AddCtrl(slider);
  348. slider=new hgeGUISlider(CMD_PA_SPINEND, 664, 115, 126, 6, texGui, 417, 177, 6, 6);
  349. slider->SetMode(-50, 50, HGESLIDER_BARRELATIVE);
  350. slider->SetValue(0);
  351. gui->AddCtrl(slider);
  352. slider=new hgeGUISlider(CMD_PA_SPINVAR, 664, 127, 126, 6, texGui, 417, 177, 6, 6);
  353. slider->SetMode(0, 1, HGESLIDER_BAR);
  354. slider->SetValue(0.5);
  355. gui->AddCtrl(slider);
  356. button=new hgeGUIButton(CMD_PA_ALPHALOCK, 775, 147, 16, 11, texGui, 336, 176);
  357. button->SetMode(true);
  358. gui->AddCtrl(button);
  359. slider=new hgeGUISlider(CMD_PA_ALPHASTART, 664, 162, 126, 6, texGui, 417, 177, 6, 6);
  360. slider->SetMode(0, 1, HGESLIDER_BAR);
  361. slider->SetValue(0.5);
  362. gui->AddCtrl(slider);
  363. slider=new hgeGUISlider(CMD_PA_ALPHAEND, 664, 174, 126, 6, texGui, 417, 177, 6, 6);
  364. slider->SetMode(0, 1, HGESLIDER_BAR);
  365. slider->SetValue(0.5);
  366. gui->AddCtrl(slider);
  367. slider=new hgeGUISlider(CMD_PA_ALPHAVAR, 664, 186, 126, 6, texGui, 417, 177, 6, 6);
  368. slider->SetMode(0, 1, HGESLIDER_BAR);
  369. slider->SetValue(0.5);
  370. gui->AddCtrl(slider);
  371. slider=new hgeGUISlider(CMD_PA_RSTART, 664, 221, 126, 6, texGui, 417, 177, 6, 6);
  372. slider->SetMode(0, 1, HGESLIDER_BAR);
  373. slider->SetValue(0.5);
  374. gui->AddCtrl(slider);
  375. slider=new hgeGUISlider(CMD_PA_GSTART, 664, 233, 126, 6, texGui, 417, 177, 6, 6);
  376. slider->SetMode(0, 1, HGESLIDER_BAR);
  377. slider->SetValue(0.5);
  378. gui->AddCtrl(slider);
  379. slider=new hgeGUISlider(CMD_PA_BSTART, 664, 245, 126, 6, texGui, 417, 177, 6, 6);
  380. slider->SetMode(0, 1, HGESLIDER_BAR);
  381. slider->SetValue(0.5);
  382. gui->AddCtrl(slider);
  383. slider=new hgeGUISlider(CMD_PA_REND, 664, 271, 126, 6, texGui, 417, 177, 6, 6);
  384. slider->SetMode(0, 1, HGESLIDER_BAR);
  385. slider->SetValue(0.5);
  386. gui->AddCtrl(slider);
  387. slider=new hgeGUISlider(CMD_PA_GEND, 664, 283, 126, 6, texGui, 417, 177, 6, 6);
  388. slider->SetMode(0, 1, HGESLIDER_BAR);
  389. slider->SetValue(0.5);
  390. gui->AddCtrl(slider);
  391. slider=new hgeGUISlider(CMD_PA_BEND, 664, 295, 126, 6, texGui, 417, 177, 6, 6);
  392. slider->SetMode(0, 1, HGESLIDER_BAR);
  393. slider->SetValue(0.5);
  394. gui->AddCtrl(slider);
  395. slider=new hgeGUISlider(CMD_PA_RGBVAR, 664, 321, 126, 6, texGui, 417, 177, 6, 6);
  396. slider->SetMode(0, 1, HGESLIDER_BAR);
  397. slider->SetValue(0.5);
  398. gui->AddCtrl(slider);
  399. }