demo13.lpr 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. program demo13;
  2. {$I zglCustomConfig.cfg}
  3. {$I zgl_config.cfg}
  4. {$IFDEF WINDOWS}
  5. {$R *.res}
  6. {$ENDIF}
  7. uses
  8. {$IFDEF UNIX}
  9. cthreads,
  10. {$ENDIF}
  11. {$IFDEF USE_ZENGL_STATIC}
  12. zgl_screen,
  13. zgl_window,
  14. zgl_timers,
  15. zgl_keyboard,
  16. zgl_render_2d,
  17. zgl_fx,
  18. zgl_textures,
  19. zgl_textures_png,
  20. zgl_textures_jpg,
  21. zgl_sprite_2d,
  22. zgl_particles_2d,
  23. zgl_primitives_2d,
  24. zgl_font,
  25. zgl_text,
  26. zgl_math_2d,
  27. zgl_utils,
  28. zgl_types,
  29. gegl_color
  30. {$ELSE}
  31. zglHeader
  32. {$ENDIF}
  33. ;
  34. var
  35. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  36. fntMain : LongWord;
  37. texBack : zglPTexture;
  38. debug : Boolean;
  39. particles : zglTPEngine2D;
  40. emitterFire : array[ 0..2 ] of zglPEmitter2D;
  41. emitterDiamond : zglPEmitter2D;
  42. emitterRain : zglPEmitter2D;
  43. procedure Init;
  44. var
  45. i : Integer;
  46. begin
  47. texBack := tex_LoadFromFile( dirRes + 'back02.png' );
  48. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  49. setFontTextScale(15, fntMain);
  50. setTextColor(Get_Color(cl_White));
  51. // EN: Load three types of fire emitters.
  52. // RU: Загрузка трёх разных видов эмиттеров огня.
  53. emitterFire[ 0 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire00.zei' );
  54. emitterFire[ 1 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire01.zei' );
  55. emitterFire[ 2 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire02.zei' );
  56. // EN: Set own particels engine.
  57. // RU: Установка собственного движка эмиттеров.
  58. pengine2d_Set( @particles );
  59. // EN: Add 6 fire emitters to particles engine. Second parameter of function returns pointer to instance of new emitter, which can be processed manually.
  60. // This instance will be nil after the death, so check everything.
  61. // RU: Добавляем в движок 6 эмиттеров огня. Второй параметр функции позволяет получить указатель на конкретный экземпляр эмиттера, который можно будет обрабатывать вручную.
  62. // Данный экземпляр после смерти будет содержать nil, поэтому используйте проверку.
  63. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 642, 190 );
  64. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 40, 368 );
  65. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 246, 368 );
  66. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 532, 244 );
  67. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 318, 422 );
  68. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 583, 420 );
  69. pengine2d_AddEmitter( emitterFire[ 2 ], nil, 740, 525 );
  70. emitterDiamond := emitter2d_LoadFromFile( dirRes + 'emitter_diamond.zei' );
  71. pengine2d_AddEmitter( emitterDiamond, nil );
  72. emitterRain := emitter2d_LoadFromFile( dirRes + 'emitter_rain.zei' );
  73. pengine2d_AddEmitter( emitterRain, nil );
  74. end;
  75. procedure Draw;
  76. var
  77. i : Integer;
  78. begin
  79. batch2d_Begin();
  80. ssprite2d_Draw( texBack, 0, 0, 800, 600, 0 );
  81. // EN: Rendering of all emitters in current particles engine.
  82. // RU: Рендеринг всех эмиттеров в текущем движке частиц.
  83. pengine2d_Draw();
  84. if debug Then
  85. for i := 0 to particles.Count.Emitters - 1 do
  86. with particles.List[ i ].BBox do
  87. pr2d_Rect( MinX, MinY, MaxX - MinX, MaxY - MinY, cl_Red );
  88. text_Draw( fntMain, 0, 0, 'FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) );
  89. text_Draw( fntMain, 0, 20, 'Particles: ' + u_IntToStr( particles.Count.Particles ) );
  90. text_Draw( fntMain, 0, 40, 'Debug(F1): ' + u_BoolToStr( debug ) );
  91. batch2d_End();
  92. end;
  93. procedure KeyMouseEvent;
  94. begin
  95. if key_Press( K_F1 ) Then
  96. debug := not debug;
  97. end;
  98. procedure Update( dt : Double );
  99. begin
  100. // EN: Process all emitters in current particles engine.
  101. // RU: Обработка всех эмиттеров в текущем движке частиц.
  102. pengine2d_Proc( dt );
  103. end;
  104. procedure Quit;
  105. begin
  106. // RU: Очищаем память от созданных эмиттеров.
  107. // EN: Free allocated memory for emitters.
  108. pengine2d_Set( @particles );
  109. pengine2d_ClearAll();
  110. end;
  111. Begin
  112. {$IFnDEF USE_ZENGL_STATIC}
  113. if not zglLoad( libZenGL ) Then exit;
  114. {$ENDIF}
  115. randomize();
  116. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  117. zgl_Reg( SYS_LOAD, @Init );
  118. zgl_Reg( SYS_DRAW, @Draw );
  119. zgl_Reg( SYS_UPDATE, @Update );
  120. zgl_Reg( SYS_EXIT, @Quit );
  121. wnd_SetCaption(utf8_Copy('13 - Particles'));
  122. scr_SetFPS(1000);
  123. scr_SetVSync(False);
  124. zgl_Init();
  125. End.