demo02.dpr 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. program demo02;
  2. {$I zglCustomConfig.cfg}
  3. {$I zgl_config.cfg}
  4. {$R *.res}
  5. uses
  6. Classes,
  7. zgl_types,
  8. zgl_screen,
  9. zgl_window,
  10. zgl_application,
  11. zgl_timers,
  12. // RU: Ìîäóëè äëÿ ðàáîòû ñ ôàéëàìè, ôàéëàìè â ïàìÿòè è zip-àðõèâàìè.
  13. // EN: Units for using files, files in memory and zip archives.
  14. zgl_file,
  15. zgl_memory,
  16. // RU: Ìîäóëü äëÿ ïîääåðæêè ìíîãîïîòî÷íîé çàãðóçêè ðåñóðñîâ.
  17. // EN: Unit for multithreaded resource loading.
  18. zgl_resources,
  19. // RU: Ìîäóëü äëÿ ðàáîòû ñî øðèôòàìè.
  20. // EN: Unit for using fonts.
  21. zgl_font,
  22. // RU: Ìîäóëè äëÿ ðàáîòû ñ òåêñòóðàìè. zgl_textures ÿâëÿåòñÿ îñíîâíûì, ñëåäóþùèå çà íèì ïðåäîñòàâëÿþò ïîääåðæêó îïðåäåë¸ííûõ ôîðìàòîâ.
  23. // EN: Units for using textures. zgl_textures is a main unit, next units provide support of different formats.
  24. zgl_textures,
  25. zgl_textures_tga, // TGA
  26. zgl_textures_jpg, // JPG
  27. zgl_textures_png, // PNG
  28. // RU: Çâóêîâàÿ ïîäñèñòåìà ðåàëèçîâàíà â ìîäóëÿõ íèæå. Ïîäõîä òàêîé æå êàê è ñ òåêñòóðàìè - îñíîâíîé ìîäóëü è ìîäóëè ïîääåðæêè ôîðìàòîâ.
  29. // EN: Sound subsystem implemented in units below. Idea the same as for textures - there is a main unit and units for support different formats.
  30. zgl_sound,
  31. zgl_sound_wav, // WAV
  32. zgl_sound_ogg, // OGG
  33. zgl_primitives_2d,
  34. zgl_text,
  35. zgl_sprite_2d,
  36. zgl_utils;
  37. var
  38. dirRes: UTF8String{$IFNDEF MACOSX} = '../data/'{$ENDIF};
  39. (* dirRes: UTF8String{$IFNDEF MACOSX} = 'data/'{$ENDIF}; // äèððåêòîðèÿ äî èñïîëíÿåìîãî ôàéëà
  40. // â Windows, Linux âûñòàâëÿþòñÿ äèððåêòîðèè äî âàøåãî ðàáî÷åãî ïðîåêòà *)
  41. memory: zglTMemory;
  42. // RU: Ó êàæäîãî ðåñóðñà åñòü ñâîé îïðåäåë¸ííûé òèï, êîòîðûé ÿâëÿåòñÿ óêàçàòåëåì íà ñòðóêòóðó.
  43. // EN: Every resource has its own typem which is just a pointer to structure.
  44. fntMain: Byte;
  45. //
  46. texLogo: zglPTexture;
  47. texTest: zglPTexture;
  48. //
  49. sndClick: zglPSound;
  50. sndMusic: zglPSound;
  51. procedure TextureCalcEffect(pData: PByteArray; Width, Height: Word);
  52. begin
  53. u_Sleep(1000);
  54. end;
  55. procedure Init;
  56. var
  57. i: Integer;
  58. memStream: TMemoryStream;
  59. begin
  60. // RU: Áîëåå äåòàëüíîå ðàññìîòðåíèå ïàðàìåòðîâ ôóíêöèé çàãðóçêè ðåñóðñîâ åñòü â ñîîòâåòñòâóþùèõ ïðèìåðàõ, òóò æå ïîêàçàíà ëèøü îñíîâíàÿ ñóòü.
  61. // EN: Description with more details about parameters of functions can be found in other demos, here is only main idea shown.
  62. snd_Init();
  63. // RU: Ôóíêöèè çàãðóçêè ðåñóðñîâ èìåíóþòñÿ â ôîðìàòå "$(ïðåôèêñ)_LoadFrom$(îòêóäà)", ãäå "$(ïðåôèêñ)" ìîæåò áûòü tex, snd, font è ò.ä., à "$(îòêóäà)" - File è Memory.
  64. // 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.
  65. fntMain := font_LoadFromFile(dirRes + 'font.zfi');
  66. texLogo := tex_LoadFromFile(dirRes + 'zengl.png');
  67. sndClick := snd_LoadFromFile(dirRes + 'click.wav');
  68. // RU: Ìíîãîïîòî÷íàÿ çàãðóçêà ðåñóðñîâ ïîçâîëÿåò ñîñòàâèòü î÷åðåäü è íå îæèäàòü çàãðóçêè âûïîëíÿÿ äðóãèå îïåðàöèè, íàïðèìåð ðåíäåðèíã êàêîé-òî àíèìàöèè.
  69. // Ïðîöåññ çàãðóçêè â ìíîãîïîòî÷íîì ðåæèìå ïðàêòè÷åñêè íè÷åì íå îòëè÷àåòñÿ îò îáû÷íîãî çà èñêëþ÷åíèåì âûçîâà ôóíêöèé ñòàðòà è îêîí÷àíèÿ î÷åðåäè.
  70. // EN: Multithreaded resource loading allows to make queue and do something while loading, e.g. rendering some animation.
  71. // Loading resources in multithreaded mode has almost no difference with standard mode, except using functions for beginning and ending queues.
  72. res_BeginQueue(0);
  73. // RU: Ìåæäó res_BeginQueue è res_EndQueue ìîãóò èñïîëüçîâàòüñÿ âñå îáû÷íûå ôóíêöèè çàãðóçêè ðåñóðñîâ.
  74. // Äëÿ çàäåðæêè ýêðàíà çàãðóçêè ðåñóðñû áóäóò çàãðóæåíû íåñêîëüêî ðàç, à äëÿ òåêñòóðû áóäåò èñïîëüçîâàíà îáðàáîòêà ñ çàäåðæêîé.
  75. // EN: All standard functions for loading resources can be used between res_BeginQueue and res_EndQueue.
  76. // Just for holding loading screen resources will be loaded multiple times, and texture will be post-processed with delay.
  77. zgl_Reg(TEXTURE_CURRENT_EFFECT, @TextureCalcEffect);
  78. for i := 0 to 3 do
  79. begin
  80. texTest := tex_LoadFromFile(dirRes + 'back01.jpg', TEX_NO_COLORKEY,
  81. TEX_DEFAULT_2D or TEX_CUSTOM_EFFECT);
  82. sndMusic := snd_LoadFromFile(dirRes + 'music.ogg');
  83. end;
  84. res_EndQueue();
  85. // RU: Çàãðóæàÿ ðåñóðñû èç ôàéëîâ â ïàìÿòè íåîáõîäèìî äîïîëíèòåëüíî óêàçûâàòü èõ ðàñøèðåíèå.
  86. //  êà÷åñòâå ïðèìåðà áóäåò èñïîëüçîâàí TMemoryStream âìåñòî mem_LoadFromFile/mem_Free ÷òî áû ïîêàçàòü êàê óñòðîåí zglTMemory.
  87. // EN: Loading resources from files in memory need additional set their extension.
  88. // As an example TMemoryStream will be used instead of mem_LoadFromFile/mem_Free, just for showing how zglTMemory works.
  89. memStream := TMemoryStream.Create();
  90. {$IFNDEF MACOSX}
  91. memStream.LoadFromFile(dirRes + 'back01.jpg');
  92. {$ELSE}
  93. memStream.LoadFromFile(PAnsiChar(zgl_Get(DIRECTORY_APPLICATION)) + 'Contents/Resources/back01.jpg');
  94. {$ENDIF}
  95. memory.Position := memStream.Position;
  96. memory.Memory := memStream.Memory;
  97. memory.Size := memStream.Size;
  98. texTest := tex_LoadFromMemory(memory, 'JPG');
  99. memStream.Free();
  100. // RU: Äëÿ çàãðóçêè ðåñóðñîâ èç zip-àðõèâà íåîáõîäèìî åãî ñíà÷àëà "îòêðûòü" è ïîòîì "çàêðûòü" :) Äëÿ ýòîãî ñóùåñòâóþò ôóíêöèè file_OpenArchive è file_CloseArchive.
  101. // EN: For loading resources from zip-archive this archive should be "opened" first and then "closed" :) There are functions file_OpenArchive and file_CloseArchive for this.
  102. file_OpenArchive(dirRes + 'zengl.zip');
  103. texLogo := tex_LoadFromFile('zengl.png');
  104. file_CloseArchive();
  105. // RU: Óñòàíàâëèâàåì ðàçìåð øðèôòà fntMain (â ïèêñåëÿõ).
  106. // EN: Set the fntMain font size (in pixels).
  107. setFontTextScale(15, fntMain);
  108. end;
  109. procedure Draw;
  110. begin
  111. // RU: Ê ðåñóðñàì, êîòîðûå çàãðóæàþòñÿ â ìíîãîïîòî÷íîì ðåæèìå, ìîæíî îáðàùàòüñÿ òîëüêî ïîñëå çàâåðøåíèÿ çàãðóçêè. Êîä íèæå ðèñóåò ýêðàí çàãðóçêè åñëè ðåñóðñû åù¸ íå çàãðóçèëèñü.
  112. // 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.
  113. if res_GetCompleted() < 100 then
  114. begin
  115. ssprite2d_Draw(texLogo, (800 - texLogo.Width) / 2, (600 - texLogo.Height) / 2, texLogo.Width, texLogo.Height, 0);
  116. text_Draw(fntMain, 400, 300 + texLogo.Height / 4, 'Loading... ' + u_IntToStr(res_GetCompleted()) + '%', TEXT_HALIGN_CENTER);
  117. exit;
  118. end;
  119. ssprite2d_Draw(texTest, 0, 0, 800, 600, 0);
  120. text_Draw(fntMain, 0, 0, 'FPS: ' + u_IntToStr(zgl_Get(RENDER_FPS)));
  121. text_Draw(fntMain, 0, 16, 'VRAM Used: ' + u_FloatToStr(zgl_Get(RENDER_VRAM_USED) / 1024 / 1024) + 'Mb');
  122. end;
  123. begin
  124. zgl_Reg(SYS_LOAD, @Init);
  125. zgl_Reg(SYS_DRAW, @Draw);
  126. wnd_SetCaption(utf8_Copy('02 - Resources'));
  127. zgl_Init();
  128. end.