demo14.pas 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. program demo14;
  2. {$I zglCustomConfig.cfg}
  3. {$I zgl_config.cfg}
  4. uses
  5. {$IFDEF UNIX}
  6. cthreads,
  7. {$ENDIF}
  8. {$IFDEF USE_ZENGL_STATIC}
  9. zgl_screen,
  10. zgl_window,
  11. zgl_timers,
  12. zgl_keyboard,
  13. zgl_mouse,
  14. zgl_render_2d,
  15. zgl_fx,
  16. zgl_textures,
  17. zgl_textures_png,
  18. zgl_font,
  19. zgl_text,
  20. zgl_sprite_2d,
  21. zgl_sound,
  22. zgl_sound_wav,
  23. zgl_sound_ogg,
  24. zgl_types,
  25. zgl_collision_2d,
  26. zgl_utils
  27. {$ELSE}
  28. zglHeader
  29. {$ENDIF}
  30. ;
  31. const
  32. SCREEN_WIDTH = 800;
  33. SCREEN_HEIGHT = 600;
  34. var
  35. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  36. fntMain : LongWord;
  37. icon : array[ 0..1 ] of zglPTexture;
  38. sound : zglPSound;
  39. audio : Integer;
  40. state : Integer;
  41. // добавляем номер звука, пока для одного звука
  42. IDSound : Integer;
  43. TimeStart: Byte = 0;
  44. p : Integer;
  45. // RU: Т.к. звуковая подсистема нацелена на 3D, для позиционирования звуков в 2D нужны некоторые ухищрения.
  46. // EN: Because sound subsystem using 3D, there is some tricky way to calculate sound position in 2D.
  47. function CalcX2D( const X : Single ) : Single;
  48. begin
  49. Result := ( X - SCREEN_WIDTH / 2 ) * ( 10 / SCREEN_WIDTH / 2 ); // сменил смещение по X и Y, теперь более явно можно
  50. end; // отдалить/приблизить звук
  51. function CalcY2D( const Y : Single ) : Single;
  52. begin
  53. Result := ( Y - SCREEN_HEIGHT / 2 ) * ( 10 / SCREEN_HEIGHT / 2 );
  54. end;
  55. procedure Init;
  56. begin
  57. // RU: Инициализируем звуковую подсистему. Для Windows можно сделать выбор между DirectSound и OpenAL отредактировав файл zgl_config.cfg.
  58. // EN: Initializing sound subsystem. For Windows can be used DirectSound or OpenAL, see zgl_config.cfg.
  59. snd_Init();
  60. // RU: Загружаем звуковой файл и устанавливаем для него максимальноe количество проигрываемых источников в 2.
  61. // EN: Load the sound file and set maximum count of sources that can be played to 2.
  62. sound := snd_LoadFromFile( dirRes + 'click.wav', 2 );
  63. // RU: Загружаем текстуры, которые будут индикаторами.
  64. // EN: Load the textures, that will be indicators.
  65. icon[ 0 ] := tex_LoadFromFile( dirRes + 'audio-stop.png' );
  66. icon[ 1 ] := tex_LoadFromFile( dirRes + 'audio-play.png' );
  67. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  68. setFontTextScale(15, fntMain);
  69. end;
  70. procedure Draw;
  71. var
  72. r : zglTRect2D;
  73. begin
  74. ssprite2d_Draw( icon[ state ], ( SCREEN_WIDTH - 128 ) / 2, ( SCREEN_HEIGHT - 128 ) / 2, 128, 128, 0 );
  75. text_Draw( fntMain, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 64, 'Skillet - Comatose - Whispers In The Dark', TEXT_HALIGN_CENTER );
  76. r.X := ( SCREEN_WIDTH - 128 ) / 2;
  77. r.Y := ( SCREEN_HEIGHT - 128 ) / 2;
  78. r.W := 128;
  79. r.H := 128;
  80. if col2d_PointInRect( mouse_X, mouse_Y, r ) Then
  81. begin
  82. fx_SetBlendMode( FX_BLEND_ADD );
  83. ssprite2d_Draw( icon[ state ], ( SCREEN_WIDTH - 132 ) / 2, ( SCREEN_HEIGHT - 132 ) / 2, 132, 132, 0, 155 );
  84. fx_SetBlendMode( FX_BLEND_NORMAL );
  85. end;
  86. end;
  87. procedure Timer;
  88. begin
  89. // RU: Проверяем играет ли музыка(1 - играет, 0 - не играет). Так же можно проверить и звуки - подставив zglPSound и ID вот так:
  90. // snd_Get( Sound, ID...
  91. // ID возвращается функцией snd_Play
  92. //
  93. // EN: Check if music playing(1 - playing, 0 - not playing). Sounds also can be checked this way - just use zglPSound and ID:
  94. // snd_Get( Sound, ID...
  95. // ID returns by function snd_Play.
  96. state := snd_Get( SND_STREAM, audio, SND_STATE_PLAYING );
  97. if state = 0 Then
  98. audio := 0;
  99. // RU: Получаем в процентах позицию проигрывания аудиопотока и ставим громкость для плавных переходов.
  100. // EN: Get position in percent's for audio stream and set volume for smooth playing.
  101. p := snd_Get( SND_STREAM, audio, SND_STATE_PERCENT );
  102. if ( p >= 0 ) and ( p < 25 ) Then
  103. snd_SetVolume( SND_STREAM, audio, ( 1 / 24 ) * p );
  104. if ( p >= 75 ) and ( p < 100 ) Then
  105. snd_SetVolume( SND_STREAM, audio, 1 - ( 1 / 24 ) * ( p - 75 ) );
  106. end;
  107. procedure KeyMouseEvent;
  108. var
  109. r : zglTRect2D;
  110. begin
  111. if mouseBClick(M_BLEFT) Then
  112. begin
  113. // RU: В данном случаи мы начинаем воспроизводить звук сразу в указанных координатах, но их можно менять и в процессе используя процедуру snd_SetPos.
  114. // Важно: Для OpenAL можно позиционировать только mono-звуки
  115. //
  116. // EN: In this case, we begin to play the sound directly in these coordinates, but they can be changed later using procedure snd_SetPos.
  117. // Important: OpenAL can position only mono-sounds.
  118. // эта часть изменена!!! Теперь можно заново воспроизводить звуки, даже если они не закончили играть.
  119. if snd_Get(sound, IDSound, SND_STATE_PLAYING) = IDSound then
  120. snd_Stop(sound, IDSound);
  121. IDSound := snd_Play(sound, FALSE, CalcX2D(mouseX), CalcY2D(mouseY));
  122. // ------------------------------------------------------------------------------------------
  123. snd_Play( sound, FALSE, CalcX2D( mouse_X ), CalcY2D( mouse_Y ) );
  124. r.X := ( SCREEN_WIDTH - 128 ) / 2;
  125. r.Y := ( SCREEN_HEIGHT - 128 ) / 2;
  126. r.W := 128;
  127. r.H := 128;
  128. // добавляем проверку на проигрывание звука, только если много развных звуков/музыки, то номера надо менять (не только 1!!!)
  129. if col2d_PointInRect(mouseX, mouseY, r) and (audio = 1) Then
  130. begin
  131. p := snd_Get(SND_STREAM, audio, SND_STATE_PLAYING);
  132. if p = 1 then
  133. snd_StopStream(audio);
  134. end;
  135. // ---------------------------------------------------------------------------------------------------------------
  136. if col2d_PointInRect( mouse_X, mouse_Y, r ) and ( audio = 0 ) Then
  137. audio := snd_PlayFile( dirRes + 'music.ogg');
  138. end;
  139. end;
  140. Begin
  141. {$IFNDEF USE_ZENGL_STATIC}
  142. if not zglLoad( libZenGL ) Then exit;
  143. {$ENDIF}
  144. randomize();
  145. TimeStart := timer_Add( @Timer, 16, t_Start );
  146. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  147. zgl_Reg( SYS_LOAD, @Init );
  148. zgl_Reg( SYS_DRAW, @Draw );
  149. wnd_SetCaption(utf8_Copy('14 - Sound'));
  150. zgl_Init();
  151. End.