demo14.pas 5.4 KB

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