demo13.dpr 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. program demo13;
  2. {$I zglCustomConfig.cfg}
  3. {$R *.res}
  4. uses
  5. {$IFDEF USE_ZENGL_STATIC}
  6. zgl_main,
  7. zgl_screen,
  8. zgl_window,
  9. zgl_timers,
  10. zgl_keyboard,
  11. zgl_render_2d,
  12. zgl_fx,
  13. zgl_textures,
  14. zgl_textures_png,
  15. zgl_textures_jpg,
  16. zgl_sprite_2d,
  17. zgl_particles_2d,
  18. zgl_primitives_2d,
  19. zgl_font,
  20. zgl_text,
  21. zgl_math_2d,
  22. zgl_utils
  23. {$ELSE}
  24. zglHeader
  25. {$ENDIF}
  26. ;
  27. var
  28. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  29. fntMain : zglPFont;
  30. texBack : zglPTexture;
  31. debug : Boolean;
  32. particles : zglTPEngine2D;
  33. emitterFire : array[ 0..2 ] of zglPEmitter2D;
  34. emitterDiamond : zglPEmitter2D;
  35. emitterRain : zglPEmitter2D;
  36. procedure Init;
  37. var
  38. i : Integer;
  39. begin
  40. texBack := tex_LoadFromFile( dirRes + 'back02.png' );
  41. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  42. // EN: Load three types of fire emitters.
  43. // RU: Çàãðóçêà òð¸õ ðàçíûõ âèäîâ ýìèòòåðîâ îãíÿ.
  44. emitterFire[ 0 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire00.zei' );
  45. emitterFire[ 1 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire01.zei' );
  46. emitterFire[ 2 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire02.zei' );
  47. // EN: Set own particels engine.
  48. // RU: Óñòàíîâêà ñîáñòâåííîãî äâèæêà ýìèòòåðîâ.
  49. pengine2d_Set( @particles );
  50. // EN: Add 6 fire emitters to particles engine. Second parameter of function returns pointer to instance of new emitter, which can be processed manually.
  51. // This instance will be nil after the death, so check everything.
  52. // RU: Äîáàâëÿåì â äâèæîê 6 ýìèòòåðîâ îãíÿ. Âòîðîé ïàðàìåòð ôóíêöèè ïîçâîëÿåò ïîëó÷èòü óêàçàòåëü íà êîíêðåòíûé ýêçåìïëÿð ýìèòòåðà, êîòîðûé ìîæíî áóäåò îáðàáàòûâàòü âðó÷íóþ.
  53. // Äàííûé ýêçåìïëÿð ïîñëå ñìåðòè áóäåò ñîäåðæàòü nil, ïîýòîìó èñïîëüçóéòå ïðîâåðêó.
  54. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 642, 190 );
  55. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 40, 368 );
  56. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 246, 368 );
  57. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 532, 244 );
  58. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 318, 422 );
  59. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 583, 420 );
  60. pengine2d_AddEmitter( emitterFire[ 2 ], nil, 740, 525 );
  61. emitterDiamond := emitter2d_LoadFromFile( dirRes + 'emitter_diamond.zei' );
  62. pengine2d_AddEmitter( emitterDiamond, nil );
  63. emitterRain := emitter2d_LoadFromFile( dirRes + 'emitter_rain.zei' );
  64. pengine2d_AddEmitter( emitterRain, nil );
  65. end;
  66. procedure Draw;
  67. var
  68. i : Integer;
  69. begin
  70. batch2d_Begin();
  71. ssprite2d_Draw( texBack, 0, 0, 800, 600, 0 );
  72. // EN: Rendering of all emitters in current particles engine.
  73. // RU: Ðåíäåðèíã âñåõ ýìèòòåðîâ â òåêóùåì äâèæêå ÷àñòèö.
  74. pengine2d_Draw();
  75. if debug Then
  76. for i := 0 to particles.Count.Emitters - 1 do
  77. with particles.List[ i ].BBox do
  78. pr2d_Rect( MinX, MinY, MaxX - MinX, MaxY - MinY, $FF0000, 255 );
  79. text_Draw( fntMain, 0, 0, 'FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) );
  80. text_Draw( fntMain, 0, 20, 'Particles: ' + u_IntToStr( particles.Count.Particles ) );
  81. text_Draw( fntMain, 0, 40, 'Debug(F1): ' + u_BoolToStr( debug ) );
  82. batch2d_End();
  83. end;
  84. procedure Timer;
  85. begin
  86. if key_Press( K_ESCAPE ) Then zgl_Exit;
  87. if key_Press( K_F1 ) Then debug := not debug;
  88. key_ClearState();
  89. end;
  90. procedure Update( dt : Double );
  91. begin
  92. // EN: Process all emitters in current particles engine.
  93. // RU: Îáðàáîòêà âñåõ ýìèòòåðîâ â òåêóùåì äâèæêå ÷àñòèö.
  94. pengine2d_Proc( dt );
  95. end;
  96. procedure Quit;
  97. begin
  98. // RU: Î÷èùàåì ïàìÿòü îò ñîçäàííûõ ýìèòòåðîâ.
  99. // EN: Free allocated memory for emitters.
  100. pengine2d_Set( @particles );
  101. pengine2d_ClearAll();
  102. end;
  103. Begin
  104. {$IFNDEF USE_ZENGL_STATIC}
  105. if not zglLoad( libZenGL ) Then exit;
  106. {$ENDIF}
  107. randomize();
  108. timer_Add( @Timer, 16 );
  109. zgl_Reg( SYS_LOAD, @Init );
  110. zgl_Reg( SYS_DRAW, @Draw );
  111. zgl_Reg( SYS_UPDATE, @Update );
  112. zgl_Reg( SYS_EXIT, @Quit );
  113. wnd_SetCaption( '13 - Particles' );
  114. wnd_ShowCursor( TRUE );
  115. scr_SetOptions( 800, 600, 0, FALSE, FALSE );
  116. zgl_Init();
  117. End.