demo02.lpr 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. library demo02;
  2. {$I zgl_config.cfg}
  3. {$I zglCustomConfig.cfg}
  4. uses
  5. zgl_application,
  6. zgl_types,
  7. zgl_screen,
  8. zgl_window,
  9. zgl_timers,
  10. // RU: Модули для работы с файлами, файлами в памяти и zip-архивами.
  11. // EN: Units for using files, files in memory and zip archives.
  12. zgl_file,
  13. zgl_memory,
  14. // RU: Модуль для поддержки многопоточной загрузки ресурсов.
  15. // EN: Unit for multithreaded resource loading.
  16. zgl_resources,
  17. // RU: Модуль для работы со шрифтами.
  18. // EN: Unit for using fonts.
  19. zgl_font,
  20. // RU: Модули для работы с текстурами. zgl_textures является основным, следующие за ним предоставляют поддержку определённых форматов.
  21. // EN: Units for using textures. zgl_textures is a main unit, next units provide support of different formats.
  22. zgl_textures,
  23. zgl_textures_tga, // TGA
  24. zgl_textures_jpg, // JPG
  25. zgl_textures_png, // PNG
  26. // RU: Звуковая подсистема реализована в модулях ниже. Подход такой же как и с текстурами - основной модуль и модули поддержки форматов.
  27. // EN: Sound subsystem implemented in units below. Idea the same as for textures - there is a main unit and units for support different formats.
  28. zgl_sound,
  29. zgl_sound_wav, // WAV
  30. zgl_sound_ogg, // OGG
  31. zgl_primitives_2d,
  32. zgl_text,
  33. zgl_sprite_2d,
  34. zgl_utils
  35. ;
  36. var
  37. dirRes : UTF8String = 'assets/';
  38. memory : zglTMemory;
  39. // RU: У каждого ресурса есть свой определённый тип, который является указателем на структуру.
  40. // EN: Every resource has its own typem which is just a pointer to structure.
  41. fntMain : LongWord;
  42. //
  43. texLogo : zglPTexture;
  44. texTest : array[ 0..3 ] of zglPTexture;
  45. //
  46. sndClick : zglPSound;
  47. sndMusic : zglPSound;
  48. resLoaded : Boolean;
  49. procedure TextureCalcEffect( pData : PByteArray; Width, Height : Word );
  50. begin
  51. u_Sleep( 1000 );
  52. end;
  53. procedure Init;
  54. var
  55. i : Integer;
  56. begin
  57. zgl_Enable( CORRECT_RESOLUTION );
  58. scr_CorrectResolution( 800, 600 );
  59. // RU: Более детальное рассмотрение параметров функций загрузки ресурсов есть в соответствующих примерах, тут же показана лишь основная суть.
  60. // EN: Description with more details about parameters of functions can be found in other demos, here is only main idea shown.
  61. snd_Init();
  62. // RU: Основное отличие приложений Android от других заключается в том, что все ресурсы хранятся зачастую хранятся внутри apk-файла(обычный zip-архив).
  63. // Поэтому перед загрузкой любых ресурсов необходимо сначала "открыть" этот apk-файл, а потом "закрыть".
  64. // EN: Main difference between Android application and others is containing resources in apk-file(just a zip archive).
  65. // And that is why before loading of any resources this apk-file should be "opened" first, and then "closed".
  66. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  67. // RU: Функции загрузки ресурсов именуются в формате "$(префикс)_LoadFrom$(откуда)", где "$(префикс)" может быть tex, snd, font и т.д., а "$(откуда)" - File и Memory.
  68. // EN: Functions for loading resources named in format "$(prefix)_LoadFrom$(where)", where "$(prefix)" can be tex, snd, font and so on, and $(where) - File and Memory.
  69. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  70. texLogo := tex_LoadFromFile( dirRes + 'zengl.png' );
  71. sndClick := snd_LoadFromFile( dirRes + 'click.wav' );
  72. // RU: Не забываем "закрыть" apk-файл.
  73. // EN: Don't forget to "close" apk-file.
  74. file_CloseArchive();
  75. // RU: Многопоточная загрузка ресурсов позволяет составить очередь и не ожидать загрузки выполняя другие операции, например рендеринг какой-то анимации.
  76. // Процесс загрузки в многопоточном режиме практически ничем не отличается от обычного за исключением вызова функций старта и окончания очереди.
  77. // EN: Multithreaded resource loading allows to make queue and do something while loading, e.g. rendering some animation.
  78. // Loading resources in multithreaded mode has almost no difference with standard mode, except using functions for beginning and ending queues.
  79. res_BeginQueue( 0 );
  80. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  81. // RU: Между res_BeginQueue и res_EndQueue могут использоваться все обычные функции загрузки ресурсов.
  82. // Для задержки экрана загрузки ресурсы будут загружены несколько раз, а для текстуры будет использована обработка с задержкой.
  83. // EN: All standard functions for loading resources can be used between res_BeginQueue and res_EndQueue.
  84. // Just for holding loading screen resources will be loaded multiple times, and texture will be post-processed with delay.
  85. zgl_Reg( TEXTURE_CURRENT_EFFECT, @TextureCalcEffect );
  86. for i := 0 to 3 do
  87. texTest[ i ] := tex_LoadFromFile( dirRes + 'back01.jpg', TEX_NO_COLORKEY, TEX_DEFAULT_2D or TEX_CUSTOM_EFFECT );
  88. file_CloseArchive();
  89. res_EndQueue();
  90. end;
  91. procedure Draw;
  92. begin
  93. // RU: К ресурсам, которые загружаются в многопоточном режиме, можно обращаться только после завершения загрузки. Код ниже рисует экран загрузки если ресурсы ещё не загрузились.
  94. // EN: Resources which are loading in multithreaded mode can be used only after finishing the loading process. Code below renders loading screen if resources are not loaded yet.
  95. if res_GetCompleted() < 100 Then
  96. begin
  97. ssprite2d_Draw( texLogo, ( 800 - texLogo^.Width ) / 2, ( 600 - texLogo^.Height ) / 2, texLogo^.Width, texLogo^.Height, 0 );
  98. text_Draw( fntMain, 400, 300 + texLogo^.Height / 4, 'Loading... ' + u_IntToStr( res_GetCompleted() ) + '%', TEXT_HALIGN_CENTER );
  99. exit;
  100. end;
  101. ssprite2d_Draw( texTest[ 0 ], 0, 0, 800, 600, 0 );
  102. text_Draw( fntMain, 0, 0, 'FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) );
  103. text_Draw( fntMain, 0, 16, 'VRAM Used: ' + u_FloatToStr( zgl_Get( RENDER_VRAM_USED ) / 1024 / 1024 ) + 'Mb' );
  104. end;
  105. procedure Activate( active : Boolean );
  106. begin
  107. // RU: Из-за проблемы в OpenAL на платформе Android(в фоном режиме приложение продолжает грузить CPU), звуковую подсистему
  108. // необходимо останавливать и перезапускать, но только при потере/получении фокуса приложением.
  109. // EN: Because of problem inside OpenAL on Android(application continue load CPU in background), sound susbsytem should be
  110. // stopped and reloaded when application loses/gets the focus.
  111. if active Then
  112. begin
  113. // RU: Перезапускаем звуковую подсистему.
  114. // EN: Reload sound subsystem.
  115. snd_Init();
  116. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  117. sndClick := snd_LoadFromFile( dirRes + 'click.wav' );
  118. file_CloseArchive();
  119. end else
  120. snd_Free();
  121. end;
  122. procedure Restore;
  123. var
  124. i : Integer;
  125. begin
  126. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  127. font_RestoreFromFile( fntMain, dirRes + 'font.zfi' );
  128. tex_RestoreFromFile( texLogo, dirRes + 'zengl.png' );
  129. file_CloseArchive();
  130. res_BeginQueue( 0 );
  131. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  132. for i := 0 to 3 do
  133. tex_RestoreFromFile( texTest[ i ], dirRes + 'back01.jpg' );
  134. file_CloseArchive();
  135. res_EndQueue();
  136. end;
  137. procedure Java_zengl_android_ZenGL_Main( var env; var thiz ); cdecl;
  138. begin
  139. zgl_Reg( SYS_LOAD, @Init );
  140. zgl_Reg( SYS_DRAW, @Draw );
  141. zgl_Reg( SYS_ACTIVATE, @Activate );
  142. zgl_Reg( SYS_ANDROID_RESTORE, @Restore );
  143. scr_SetOptions();
  144. end;
  145. exports
  146. Java_zengl_android_ZenGL_Main,
  147. {$I android_export.inc}
  148. End.