demo13.lpr 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. library demo13;
  2. {$I zglCustomConfig.cfg}
  3. {$I zgl_config.cfg}
  4. uses
  5. zgl_application,
  6. zgl_file,
  7. zgl_screen,
  8. zgl_window,
  9. zgl_timers,
  10. zgl_touch,
  11. zgl_render_2d,
  12. zgl_fx,
  13. zgl_textures,
  14. zgl_textures_png,
  15. zgl_sprite_2d,
  16. zgl_particles_2d,
  17. zgl_primitives_2d,
  18. zgl_font,
  19. zgl_text,
  20. zgl_types,
  21. zgl_log,
  22. zgl_utils,
  23. gegl_color;
  24. var
  25. dirRes : UTF8String = 'assets/';
  26. fntMain : LongWord;
  27. texBack : zglPTexture;
  28. debug : Boolean;
  29. particles : zglTPEngine2D;
  30. emitterFire : array[ 0..2 ] of zglPEmitter2D;
  31. emitterDiamond : zglPEmitter2D;
  32. emitterRain : zglPEmitter2D;
  33. procedure Init;
  34. begin
  35. zgl_Enable( CORRECT_RESOLUTION );
  36. scr_CorrectResolution( 800, 600 );
  37. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  38. texBack := tex_LoadFromFile( dirRes + 'back02.png' );
  39. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  40. // EN: Load three types of fire emitters.
  41. // RU: Загрузка трёх разных видов эмиттеров огня.
  42. emitterFire[ 0 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire00.zei' );
  43. emitterFire[ 1 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire01.zei' );
  44. emitterFire[ 2 ] := emitter2d_LoadFromFile( dirRes + 'emitter_fire02.zei' );
  45. // EN: Set own particels engine.
  46. // RU: Установка собственного движка эмиттеров.
  47. pengine2d_Set( @particles );
  48. // EN: Add 6 fire emitters to particles engine. Second parameter of function returns pointer to instance of new emitter, which can be processed manually.
  49. // This instance will be nil after the death, so check everything.
  50. // RU: Добавляем в движок 6 эмиттеров огня. Второй параметр функции позволяет получить указатель на конкретный экземпляр эмиттера, который можно будет обрабатывать вручную.
  51. // Данный экземпляр после смерти будет содержать nil, поэтому используйте проверку.
  52. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 642, 190 );
  53. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 40, 368 );
  54. pengine2d_AddEmitter( emitterFire[ 0 ], nil, 246, 368 );
  55. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 532, 244 );
  56. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 318, 422 );
  57. pengine2d_AddEmitter( emitterFire[ 1 ], nil, 583, 420 );
  58. pengine2d_AddEmitter( emitterFire[ 2 ], nil, 740, 525 );
  59. emitterDiamond := emitter2d_LoadFromFile( dirRes + 'emitter_diamond.zei' );
  60. pengine2d_AddEmitter( emitterDiamond, nil );
  61. emitterRain := emitter2d_LoadFromFile( dirRes + 'emitter_rain.zei' );
  62. pengine2d_AddEmitter( emitterRain, nil );
  63. file_CloseArchive();
  64. setFontTextScale(20, fntMain);
  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, cl_Red );
  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(tap): ' + u_BoolToStr( debug ) );
  82. batch2d_End();
  83. end;
  84. procedure KeyMouseEvent;
  85. begin
  86. if touch_Click( 0 ) Then
  87. begin
  88. log_Add('KeyMouseEvent - click');
  89. debug := not debug;
  90. end;
  91. end;
  92. procedure Update( dt : Double );
  93. begin
  94. // EN: Process all emitters in current particles engine.
  95. // RU: Обработка всех эмиттеров в текущем движке частиц.
  96. pengine2d_Proc( dt );
  97. end;
  98. procedure Restore;
  99. begin
  100. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  101. tex_RestoreFromFile( texBack, dirRes + 'back02.png' );
  102. font_RestoreFromFile( fntMain, dirRes + 'font.zfi' );
  103. // RU: Использовать данную функцию возможно только если все эмиттеры были загружены посредством emitter2d_LoadFromFile и текстуры не были подгружены вручную.
  104. // EN: You can use this method only if emitters were loaded via emitter2d_LoadFromFile without manual loading of textures.
  105. emitter2d_RestoreAll();
  106. file_CloseArchive();
  107. end;
  108. procedure Quit;
  109. begin
  110. // RU: Очищаем память от созданных эмиттеров.
  111. // EN: Free allocated memory for emitters.
  112. pengine2d_Set( @particles );
  113. pengine2d_ClearAll();
  114. end;
  115. procedure Java_zengl_android_ZenGL_Main( var env; var thiz ); cdecl;
  116. begin
  117. randomize();
  118. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  119. zgl_Reg( SYS_LOAD, @Init );
  120. zgl_Reg( SYS_DRAW, @Draw );
  121. zgl_Reg( SYS_UPDATE, @Update );
  122. zgl_Reg( SYS_ANDROID_RESTORE, @Restore );
  123. zgl_Reg( SYS_EXIT, @Quit );
  124. scr_SetOptions();
  125. end;
  126. exports
  127. Java_zengl_android_ZenGL_Main,
  128. {$I android_export.inc}
  129. End.