demo14.lpr 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. library demo14;
  2. {$I zglCustomConfig.cfg}
  3. {$I zgl_config.cfg}
  4. uses
  5. zgl_application,
  6. zgl_file,
  7. zgl_memory,
  8. zgl_screen,
  9. zgl_window,
  10. zgl_timers,
  11. zgl_touch,
  12. zgl_mouse,
  13. zgl_render_2d,
  14. zgl_fx,
  15. zgl_textures,
  16. zgl_textures_png,
  17. zgl_font,
  18. zgl_text,
  19. zgl_sprite_2d,
  20. zgl_sound,
  21. zgl_sound_wav,
  22. zgl_sound_ogg,
  23. zgl_types,
  24. zgl_collision_2d,
  25. zgl_utils;
  26. const
  27. SCREEN_WIDTH = 800;
  28. SCREEN_HEIGHT = 600;
  29. var
  30. dirRes : UTF8String = 'assets/';
  31. fntMain : LongWord;
  32. icon : array[ 0..1 ] of zglPTexture;
  33. sound : zglPSound;
  34. audio : Integer;
  35. state : Integer;
  36. musicMem : zglTMemory;
  37. // добавляем номер звука, пока для одного звука
  38. IDSound: Integer;
  39. TimeStart: LongWord;
  40. p : Integer;
  41. // RU: Т.к. звуковая подсистема нацелена на 3D, для позиционирования звуков в 2D нужны некоторые ухищрения.
  42. // EN: Because sound subsystem using 3D, there is some tricky way to calculate sound position in 2D.
  43. function CalcX2D( const X : Single ) : Single;
  44. begin
  45. Result := ( X - SCREEN_WIDTH / 2 ) * ( 10 / SCREEN_WIDTH / 2 );
  46. end;
  47. function CalcY2D( const Y : Single ) : Single;
  48. begin
  49. Result := ( Y - SCREEN_HEIGHT / 2 ) * ( 10 / SCREEN_HEIGHT / 2 );
  50. end;
  51. procedure Init;
  52. begin
  53. zgl_Enable( CORRECT_RESOLUTION );
  54. scr_CorrectResolution( 800, 600 );
  55. // RU: Инициализируем звуковую подсистему. Для Windows можно сделать выбор между DirectSound и OpenAL отредактировав файл zgl_config.cfg.
  56. // EN: Initializing sound subsystem. For Windows can be used DirectSound or OpenAL, see zgl_config.cfg.
  57. snd_Init();
  58. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) ); // это функция, которая должна возращать, работает она или нет???
  59. // RU: Загружаем звуковой файл и устанавливаем для него максимальноe количество проигрываемых источников в 2.
  60. // EN: Load the sound file and set maximum count of sources that can be played to 2.
  61. sound := snd_LoadFromFile( dirRes + 'click.wav', 2 );
  62. // RU: Загружаем текстуры, которые будут индикаторами.
  63. // EN: Load the textures, that will be indicators.
  64. icon[ 0 ] := tex_LoadFromFile( dirRes + 'audio-stop.png' );
  65. icon[ 1 ] := tex_LoadFromFile( dirRes + 'audio-play.png' );
  66. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  67. // RU: Загружаем аудио-файл в память, т.к. читать его напрямую из архива потребует некоторых ухищрений.
  68. // EN: Load audio-file into memory, because reading it from archive will need some tricks.
  69. mem_LoadFromFile( musicMem, dirRes + 'music.ogg' );
  70. file_CloseArchive();
  71. setFontTextScale(20, fntMain);
  72. end;
  73. procedure Draw;
  74. var
  75. r : zglTRect2D;
  76. begin
  77. ssprite2d_Draw( icon[ state ], ( SCREEN_WIDTH - 128 ) / 2, ( SCREEN_HEIGHT - 128 ) / 2, 128, 128, 0 );
  78. text_Draw( fntMain, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 64, 'Skillet - Comatose - Whispers In The Dark', TEXT_HALIGN_CENTER );
  79. r.X := ( SCREEN_WIDTH - 128 ) / 2;
  80. r.Y := ( SCREEN_HEIGHT - 128 ) / 2;
  81. r.W := 128;
  82. r.H := 128;
  83. if col2d_PointInRect( touch_X( 0 ), touch_Y( 0 ), r ) Then
  84. begin
  85. fx_SetBlendMode( FX_BLEND_ADD );
  86. ssprite2d_Draw( icon[ state ], ( SCREEN_WIDTH - 132 ) / 2, ( SCREEN_HEIGHT - 132 ) / 2, 132, 132, 0, 155 );
  87. fx_SetBlendMode( FX_BLEND_NORMAL );
  88. end;
  89. end;
  90. procedure Timer;
  91. var
  92. r : zglTRect2D;
  93. begin
  94. // RU: Проверяем играет ли музыка(1 - играет, 0 - не играет). Так же можно проверить и звуки - подставив zglPSound и ID вот так:
  95. // snd_Get( Sound, ID...
  96. // ID возвращается функцией snd_Play
  97. //
  98. // EN: Check if music playing(1 - playing, 0 - not playing). Sounds also can be checked this way - just use zglPSound and ID:
  99. // snd_Get( Sound, ID...
  100. // ID returns by function snd_Play.
  101. state := snd_Get( SND_STREAM, audio, SND_STATE_PLAYING );
  102. if state = 0 Then
  103. audio := 0;
  104. // RU: Получаем в процентах позицию проигрывания аудиопотока и ставим громкость для плавных переходов.
  105. // EN: Get position in percent's for audio stream and set volume for smooth playing.
  106. p := snd_Get( SND_STREAM, audio, SND_STATE_PERCENT );
  107. if ( p >= 0 ) and ( p < 25 ) Then
  108. snd_SetVolume( SND_STREAM, audio, ( 1 / 24 ) * p );
  109. if ( p >= 75 ) and ( p < 100 ) Then
  110. snd_SetVolume( SND_STREAM, audio, 1 - ( 1 / 24 ) * ( p - 75 ) );
  111. end;
  112. procedure KeyMouseEvent;
  113. var
  114. r : zglTRect2D;
  115. begin
  116. if touch_Click( 0 ) Then
  117. begin
  118. // RU: В данном случаи мы начинаем воспроизводить звук сразу в указанных координатах, но их можно менять и в процессе используя процедуру snd_SetPos.
  119. // Важно: Для OpenAL можно позиционировать только mono-звуки
  120. //
  121. // EN: In this case, we begin to play the sound directly in these coordinates, but they can be changed later using procedure snd_SetPos.
  122. // Important: OpenAL can position only mono-sounds.
  123. // эта часть изменена!!! Теперь можно заново воспроизводить звуки, даже если они не закончили играть.
  124. if snd_Get(sound, IDSound, SND_STATE_PLAYING) = IDSound then
  125. snd_Stop(sound, IDSound);
  126. IDSound := snd_Play( sound, FALSE, CalcX2D( touch_X( 0 ) ), CalcY2D( touch_Y( 0 ) ) );
  127. // Внимание!!! Проверять не моно звук!!! Отдаление/приближение работает.
  128. // Stereo sound checking. Not mono speaker.
  129. // --------------------------------------------------------------------------------------------
  130. r.X := ( SCREEN_WIDTH - 128 ) / 2;
  131. r.Y := ( SCREEN_HEIGHT - 128 ) / 2;
  132. r.W := 128;
  133. r.H := 128;
  134. // добавляем проверку на проигрывание звука, только если много развных звуков/музыки, то номера надо менять (не только 1!!!)
  135. if col2d_PointInRect(mouse_X, mouse_Y, r) and (audio = 1) Then
  136. begin
  137. p := snd_Get(SND_STREAM, audio, SND_STATE_PLAYING);
  138. if p = 1 then
  139. snd_StopStream(audio);
  140. end;
  141. // ---------------------------------------------------------------------------------------------------------------
  142. if col2d_PointInRect( touch_X( 0 ), touch_Y( 0 ), r ) and ( audio = 0 ) Then
  143. audio := snd_PlayMemory( musicMem, 'OGG' );
  144. end;
  145. end;
  146. procedure Activate( active : Boolean );
  147. begin
  148. if active Then // надо помнить, что при активации на андроиде надо всё заново загружать
  149. begin
  150. snd_Init();
  151. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  152. sound := snd_LoadFromFile( dirRes + 'click.wav', 2 );
  153. file_CloseArchive();
  154. end else
  155. snd_Free();
  156. end;
  157. procedure Restore; // восстановление и активация? Вы издеваетесь?
  158. begin
  159. file_OpenArchive( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  160. tex_RestoreFromFile( icon[ 0 ], dirRes + 'audio-stop.png' );
  161. tex_RestoreFromFile( icon[ 1 ], dirRes + 'audio-play.png' );
  162. font_RestoreFromFile( fntMain, dirRes + 'font.zfi' );
  163. file_CloseArchive();
  164. end;
  165. procedure Java_zengl_android_ZenGL_Main( var env; var thiz ); cdecl;
  166. begin
  167. randomize();
  168. TimeStart := timer_Add( @Timer, 16, t_Start );
  169. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  170. zgl_Reg( SYS_LOAD, @Init );
  171. zgl_Reg( SYS_DRAW, @Draw );
  172. zgl_Reg( SYS_ANDROID_RESTORE, @Restore );
  173. zgl_Reg(SYS_ACTIVATE, @Activate);
  174. scr_SetOptions();
  175. end;
  176. exports
  177. Java_zengl_android_ZenGL_Main,
  178. {$I android_export.inc}
  179. End.