demo14.dpr 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. program demo14;
  2. {$I zglCustomConfig.cfg}
  3. {$I zgl_config.cfg}
  4. {$R *.res}
  5. uses
  6. zgl_screen,
  7. zgl_window,
  8. zgl_timers,
  9. zgl_keyboard,
  10. zgl_mouse,
  11. zgl_render_2d,
  12. zgl_fx,
  13. zgl_textures,
  14. zgl_textures_png,
  15. zgl_font,
  16. zgl_text,
  17. zgl_sprite_2d,
  18. zgl_sound,
  19. zgl_sound_wav,
  20. zgl_sound_ogg,
  21. zgl_types,
  22. zgl_collision_2d,
  23. zgl_utils,
  24. zgl_memory
  25. ;
  26. const
  27. SCREEN_WIDTH = 800;
  28. SCREEN_HEIGHT = 600;
  29. var
  30. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  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) * (20 / SCREEN_WIDTH / 2); // ñìåíèë ñìåùåíèå ïî X è Y, òåïåðü áîëåå ÿâíî ìîæíî
  46. end; // îòäàëèòü/ïðèáëèçèòü çâóê
  47. function CalcY2D(const Y: Single): Single;
  48. begin
  49. Result := (Y - SCREEN_HEIGHT / 2) * (20 / SCREEN_HEIGHT / 2);
  50. end;
  51. procedure Init;
  52. begin
  53. // RU: Èíèöèàëèçèðóåì çâóêîâóþ ïîäñèñòåìó. Äëÿ Windows ìîæíî ñäåëàòü âûáîð ìåæäó DirectSound è OpenAL îòðåäàêòèðîâàâ ôàéë zgl_config.cfg.
  54. // EN: Initializing sound subsystem. For Windows can be used DirectSound or OpenAL, see zgl_config.cfg.
  55. snd_Init();
  56. // RU: Çàãðóæàåì çâóêîâîé ôàéë è óñòàíàâëèâàåì äëÿ íåãî ìàêñèìàëüíîe êîëè÷åñòâî ïðîèãðûâàåìûõ èñòî÷íèêîâ â 2.
  57. // EN: Load the sound file and set maximum count of sources that can be played to 2.
  58. sound := snd_LoadFromFile(dirRes + 'click.wav', 2);
  59. // RU: Çàãðóæàåì òåêñòóðû, êîòîðûå áóäóò èíäèêàòîðàìè.
  60. // EN: Load the textures, that will be indicators.
  61. icon[0] := tex_LoadFromFile(dirRes + 'audio-stop.png');
  62. icon[1] := tex_LoadFromFile(dirRes + 'audio-play.png');
  63. fntMain := font_LoadFromFile(dirRes + 'font.zfi');
  64. setFontTextScale(15, fntMain);
  65. end;
  66. procedure Draw;
  67. var
  68. r: zglTRect2D;
  69. begin
  70. ssprite2d_Draw(icon[state], (SCREEN_WIDTH - 128) / 2, (SCREEN_HEIGHT - 128) / 2, 128, 128, 0);
  71. text_Draw(fntMain, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 64, 'Skillet - Comatose - Whispers In The Dark', TEXT_HALIGN_CENTER);
  72. r.X := (SCREEN_WIDTH - 128) / 2;
  73. r.Y := (SCREEN_HEIGHT - 128) / 2;
  74. r.W := 128;
  75. r.H := 128;
  76. if col2d_PointInRect(mouseX, mouseY, r) Then
  77. begin
  78. fx_SetBlendMode(FX_BLEND_ADD);
  79. ssprite2d_Draw(icon[state], (SCREEN_WIDTH - 132) / 2, (SCREEN_HEIGHT - 132) / 2, 132, 132, 0, 155);
  80. fx_SetBlendMode(FX_BLEND_NORMAL);
  81. end;
  82. end;
  83. procedure Timer;
  84. begin
  85. // RU: Ïðîâåðÿåì èãðàåò ëè ìóçûêà(1 - èãðàåò, 0 - íå èãðàåò). Òàê æå ìîæíî ïðîâåðèòü è çâóêè - ïîäñòàâèâ zglPSound è ID âîò òàê:
  86. // snd_Get(Sound, ID...
  87. // ID âîçâðàùàåòñÿ ôóíêöèåé snd_Play
  88. //
  89. // EN: Check if music playing(1 - playing, 0 - not playing). Sounds also can be checked this way - just use zglPSound and ID:
  90. // snd_Get(Sound, ID...
  91. // ID returns by function snd_Play.
  92. state := snd_Get( SND_STREAM, audio, SND_STATE_PLAYING );
  93. if state = 0 Then
  94. audio := 0;
  95. // RU: Ïîëó÷àåì â ïðîöåíòàõ ïîçèöèþ ïðîèãðûâàíèÿ àóäèîïîòîêà è ñòàâèì ãðîìêîñòü äëÿ ïëàâíûõ ïåðåõîäîâ.
  96. // EN: Get position in percent's for audio stream and set volume for smooth playing.
  97. p := snd_Get( SND_STREAM, audio, SND_STATE_PERCENT );
  98. if ( p >= 0 ) and ( p < 25 ) Then
  99. snd_SetVolume( SND_STREAM, audio, ( 1 / 24 ) * p );
  100. if ( p >= 75 ) and ( p < 100 ) Then
  101. snd_SetVolume( SND_STREAM, audio, 1 - ( 1 / 24 ) * ( p - 75 ) );
  102. end;
  103. procedure KeyMouseEvent;
  104. var
  105. r : zglTRect2D;
  106. begin
  107. if mouseBClick(M_BLEFT) Then
  108. begin
  109. // RU:  äàííîì ñëó÷àå ìû íà÷èíàåì âîñïðîèçâîäèòü çâóê ñðàçó â óêàçàííûõ êîîðäèíàòàõ, íî èõ ìîæíî ìåíÿòü è â ïðîöåññå èñïîëüçóÿ ïðîöåäóðó snd_SetPos.
  110. // Âàæíî: Äëÿ OpenAL ìîæíî ïîçèöèîíèðîâàòü òîëüêî mono-çâóêè
  111. //
  112. // EN: In this case, we begin to play the sound directly in these coordinates, but they can be changed later using procedure snd_SetPos.
  113. // Important: OpenAL can position only mono-sounds.
  114. // ýòà ÷àñòü èçìåíåíà!!! Òåïåðü ìîæíî çàíîâî âîñïðîèçâîäèòü çâóêè, äàæå åñëè îíè íå çàêîí÷èëè èãðàòü.
  115. if snd_Get(sound, IDSound, SND_STATE_PLAYING) = IDSound then
  116. snd_Stop(sound, IDSound);
  117. IDSound := snd_Play(sound, FALSE, CalcX2D(mouseX), CalcY2D(mouseY));
  118. // ------------------------------------------------------------------------------------------
  119. snd_Play( sound, FALSE, CalcX2D( mouse_X ), CalcY2D( mouse_Y ) );
  120. r.X := ( SCREEN_WIDTH - 128 ) / 2;
  121. r.Y := ( SCREEN_HEIGHT - 128 ) / 2;
  122. r.W := 128;
  123. r.H := 128;
  124. // äîáàâëÿåì ïðîâåðêó íà ïðîèãðûâàíèå çâóêà, òîëüêî åñëè ìíîãî ðàçâíûõ çâóêîâ/ìóçûêè, òî íîìåðà íàäî ìåíÿòü (íå òîëüêî 1!!!)
  125. if col2d_PointInRect(mouseX, mouseY, r) and (audio = 1) Then
  126. begin
  127. p := snd_Get(SND_STREAM, audio, SND_STATE_PLAYING);
  128. if p = 1 then
  129. snd_StopStream(audio);
  130. end;
  131. // ---------------------------------------------------------------------------------------------------------------
  132. if col2d_PointInRect( mouse_X, mouse_Y, r ) and ( audio = 0 ) Then
  133. audio := snd_PlayFile( dirRes + 'music.ogg');
  134. end;
  135. end;
  136. Begin
  137. randomize();
  138. TimeStart := timer_Add(@Timer, 16, t_Start);
  139. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  140. zgl_Reg(SYS_LOAD, @Init);
  141. zgl_Reg(SYS_DRAW, @Draw);
  142. wnd_SetCaption(utf8_Copy('14 - Sound'));
  143. zgl_Init();
  144. End.