Daemonion

Stereo example

Jul 3rd, 2012
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.07 KB | None | 0 0
  1. --[[------------------------------------------------------------------------------------------------------------------
  2. Ïðîèãðîâêà çâóêîâ â ãîëîâå àêòåðà
  3. Tunduk Vladimir aka Sidorovich
  4.  
  5. --------------------------------------------------------------------------------------------------------------------]]
  6.  
  7.  
  8. class "action_sound2d"
  9. ----------------------
  10. function action_sound2d:__init (obj, storage)
  11. self.object = obj
  12. self.st = storage
  13. self.snd_obj_l = nil
  14. self.snd_obj_r = nil
  15. self.time = 0
  16. self.playing = false
  17. self.current = 0
  18. end
  19. ----------------------
  20. function action_sound2d:reset_scheme()
  21.  
  22. self:recreate_sounds ()
  23.  
  24. self.st.signals = {}
  25. self.time = time_global ()
  26. self.playing = false
  27. end
  28. ----------------------
  29. function action_sound2d:recreate_sounds ()
  30. self.snd_obj_l = nil
  31. self.snd_obj_r = nil
  32. local name_left, name_right = self:get_sound_name ()
  33.  
  34. if name_left ~= nil then
  35. printf ("RECREATE_SOUNDS. LEFT CHANNEL = %s", name_left)
  36. end
  37.  
  38. if name_right ~= nil then
  39. printf ("RECREATE_SOUNDS. RIGHT CHANNEL = %s", name_right)
  40. end
  41.  
  42. self.snd_obj_l = xr_sound.get_safe_sound_object (name_left)
  43. if name_right ~= nil then
  44. self.snd_obj_r = xr_sound.get_safe_sound_object (name_right)
  45. else
  46. self.snd_obj_r = nil
  47. end
  48. end
  49. ----------------------
  50. function action_sound2d:get_next_sound_index ()
  51. local idx = self.current
  52. local tsize = table.getn (sound_theme.ph_snd_themes[self.st.snd_theme])
  53. if tsize == 1 then
  54. idx = 1
  55. else
  56. while idx == self.current do
  57. idx = math.random (1, tsize)
  58. end
  59. end
  60. self.current = idx
  61. return idx
  62. end
  63. ----------------------
  64. function action_sound2d:get_sound_name ()
  65. local name
  66. if self.st.snd_name ~= nil then
  67. name = self.st.snd_name
  68. else
  69. name = sound_theme.ph_snd_themes[self.st.snd_theme][self:get_next_sound_index ()]
  70. if type(name) == "table" then
  71. name = name[1]
  72. end
  73. end
  74.  
  75. if self.st.stereo == false then
  76. return name, nil
  77. end
  78. return string.format ("%s_l", name), string.format ("%s_r", name)
  79. end
  80. ----------------------
  81. function action_sound2d:update (delta)
  82. if self.snd_obj_l == nil then
  83. return
  84. end
  85.  
  86. local actor = db.actor
  87.  
  88. if self.playing == false then
  89. self:play_sounds ()
  90. self.playing = true
  91. return
  92. end
  93.  
  94. if self.st.stereo == true then
  95. local pos_l, pos_r = self:get_source_positions ()
  96. if self.snd_obj_l ~= nil and self.snd_obj_l:playing () == true then
  97. self.snd_obj_l:set_position (pos_l)
  98. end
  99. if self.snd_obj_r ~= nil and self.snd_obj_r:playing () == true then
  100. self.snd_obj_r:set_position (pos_r)
  101. end
  102. end
  103.  
  104.  
  105. if self.snd_obj_l:playing () == false then
  106. self.st.signals["sound_end"] = true
  107. if self.st.snd_theme ~= nil then
  108. self:recreate_sounds ()
  109. self.time = time_global ()
  110. self.playing = false
  111. end
  112. end
  113.  
  114. xr_logic.try_switch_to_another_section (self.object, self.st, actor)
  115. end
  116. ----------------------
  117. function action_sound2d:play_sounds ()
  118.  
  119. --ðàññ÷åò çàäåðæêè
  120. local d
  121. if self.st.delay == self.st.delay_max then
  122. d = self.st.delay
  123. else
  124. d = math.random (self.st.delay, self.st.delay_max)
  125. end
  126.  
  127. local actor = db.actor
  128. -- åñëè çâóê ìîíî, òî èãðàåì òîëüêî ñ ëåâîãî êàíàëà è òîëüêî â æáàíå àêòåðà
  129. if self.st.stereo == false then
  130. if self.snd_obj_l ~= nil then
  131. self.snd_obj_l:play_at_pos (actor, vector ():set (0, 0, 0), d / 1000.0, sound_object.s2d)
  132. end
  133. else
  134. --åñëè îäèí èç êàíàëîâ îòñóòñâóåò, òî ïèíàòü æåñòîêî çâóêîâèêà
  135. if self.snd_obj_l == nil or self.snd_obj_r == nil then
  136. abort ("Can't play stereo sound because sound file for left or right channel not loaded")
  137. end
  138. --ðàññ÷èòàåì íàïðàâëåíèÿ íà èñòî÷íèêè çâóêà äëÿ ëåâîãî è ïðàâîãî ëîïóõà
  139. local pos_l, pos_r = self:get_source_positions ()
  140. self.snd_obj_l:play_at_pos (actor, pos_l, d / 1000.0, sound_object.s3d)
  141. self.snd_obj_r:play_at_pos (actor, pos_r, d / 1000.0, sound_object.s3d)
  142. end
  143. end
  144. ----------------------
  145. function action_sound2d:get_source_positions ()
  146. local actor = db.actor
  147. local dir = actor:direction ()
  148. dir.y = 0.0
  149. local dir_left = vector_rotate_y (dir, 45)
  150. local dir_right = vector_rotate_y (dir, -45)
  151. dir_left:normalize ()
  152. dir_right:normalize ()
  153. --ðàññ÷èòàåì âûñîòó
  154. local pos = actor:position ()
  155. pos.y = pos.y + 1.5 --íó íèçêîðîñëûé ó íàñ àêòåð...
  156. local pos_l = pos;
  157. return pos_l:add (dir_left:mul (1.5)), pos:add (dir_right:mul (1.5))
  158. end
  159. ----------------------
  160. function action_sound2d:deactivate ()
  161. if self.snd_obj_l ~= nil then
  162. if self.snd_obj_l:playing () == true then
  163. self.snd_obj_l:stop ()
  164. end
  165. self.snd_obj_l = nil
  166. end
  167.  
  168. if self.snd_obj_r ~= nil then
  169. if self.snd_obj_r:playing () == true then
  170. self.snd_obj_r:stop ()
  171. end
  172. self.snd_obj_r = nil
  173. end
  174. end
  175.  
  176.  
  177.  
  178. ----------------------
  179. function add_to_binder( npc, ini, scheme, section, storage )
  180.  
  181. -- local new_action =
  182.  
  183. -- Çàðåãèñòðèðîâàòü âñå actions, â êîòîðûõ äîëæåí áûòü âûçâàí ìåòîä reset_scheme ïðè èçìåíåíèè íàñòðîåê ñõåìû:
  184. xr_logic.subscribe_action_for_events (npc, storage, action_sound2d (npc, storage))
  185. end
  186. ----------------------
  187. function set_scheme (obj, ini, scheme, section, gulag_name)
  188.  
  189. local st = xr_logic.assign_storage_and_bind (obj, ini, scheme, section)
  190. st.logic = xr_logic.cfg_get_switch_conditions (ini, section, obj)
  191. st.snd_name = utils.cfg_get_string (ini, section, "snd", obj, false, "", nil)
  192. st.snd_theme = utils.cfg_get_string (ini, section, "theme", obj, false, "", nil)
  193.  
  194. if st.snd_theme ~= nil and st.snd_name then
  195. abort ("SR_SOUND2D : can't definition sound file name and sound theme at the one time");
  196. end
  197.  
  198. st.delay = utils.cfg_get_number (ini, section, "delay", obj, false, 0)
  199. st.delay_max = utils.cfg_get_number (ini, section, "delay_max", obj, false, 0)
  200. st.stereo = utils.cfg_get_bool (ini, section, "stereo", obj, false, false)
  201.  
  202. if st.delay_max < st.delay then
  203. st.delay_max = st.delay
  204. end
  205.  
  206. if st.snd_name ~= nil then
  207. if st.snd_name == "" then
  208. abort ("SR_SOUND2D : invalid sound name")
  209. end
  210. else
  211. if st.snd_theme == nil or st.snd_theme == "" then
  212. abort ("SR_SOUND2D : invalid sound theme")
  213. end
  214. end
  215.  
  216. end
  217. ----------------------
  218. ----------------------
  219. ----------------------
  220. ----------------------
Advertisement
Add Comment
Please, Sign In to add comment