前言:director对于声音的管理实在是不敢恭维。
不知道是不是director的一个bug:
movie1里面sound(1)通道播放声音
从movie1跳转到movie2的话,声音继续播放(这也是我们想要的关于背景音乐的想法,看似director很好用帮我们解决了这个问题),不过这个时候你可以测试几个函数就会发现这里面好像有bug在,
sound(1).isbusy()=1
表示声音通道1有声音在播放
sound(1).status=0
表示声音通道1空闲
为什么会出现这种情况呢?我的理解是director对于每个影片都用了不同的8个声音管理通道,你从一个影片跳转到另一个影片的时候,这个时候director为你创建了另外8个声音通道出来,这或许是director的一个bug,因为有的人在跳转到不同的影片中需要使用同一个背景音乐,而有些人还要求控制这个背景音乐的播放暂停等,而这个时候你如果使用sound(1).pause()这个函数 确实可以停止掉当前播放的背景音乐,但是你再使用sound(1).play()这个函数的话就没有任何作用了,因为你刚才停止的是movie1里面的声音通道1,而你现在所在的movie2里面的声音通道1里面却什么都没有。不知道我是否讲清楚了这个问题。对于sound(1).isbusy()这个函数其实应该是正确的函数,错误的地方在于director对每个影片都用了不同的8个声音通道来管理,其实需要做的是对于每个projector用8个声音通道来管理就够了,这样就不会出现跳转到其它movie的时候sound(1).status=0这种事情了。
但是问题出来了总要想办法解决
问题:关于director里面播放背景音乐跳转movie暂停后不能重新播放的问题
解决的办法一:靠director自己来解决
因为到其它影片需要暂停之后再播放,而director又存在以上的bug(暂且称为bug,),所以我考虑用其它方法来解决,并且pause命令不可以用那我就自己建立背景音乐的状态信息,使用pause的时候就记录下来当是播放的时间并停止当前播放的音乐,重新播放的时候就从这个时候开始播放。
思路:建立一个父脚本来播放音乐,这样的好处是可以用一个脚本来控制音乐,不用每个影片都存在这样的脚本。用到的函数
queue() 播放声音的函数有很多种,但只有queue()可以从某个时间来播放(模拟暂停命令)
sound(channel).currenttime,这个函数用来记录声音播放的时间,暂停后就从这里播放,这里顺便说一下currenttime这个函数,它是可以设置也可以检测的,但是设置的时候会延时几秒种才执行,这也让我郁闷了一下,所以上面播放音乐的函数就只能用queue(),否则可以使用其它播放函数再设置currenttime就可以了。
sound(channel).play(),控制声音的播放
sound(channel).stop(),控制声音的停止
更具体的怎么个实现思路我就不写出来了,以下是代码源文件,大家可以看一下。
-- 对象方法:
-- Object.UpdateFile("声音文件地址",声音通道) --更新背景音乐
-- Object.play() --播放
-- Object.pause() --暂停
-- Object.stop() --停止
-- Object.unload() --声音对象卸载
-- Object.SetVolume(value) --设置通道音量大小
-- Object.GetVolume(soundchannel) --取得通道音量大小
-- 对象属性:
-- pMusicFile --对象播放的声音文件地址
-- pChannel --对象播放声音的通道
-- pSoundState --对象的状态
-- pVolume --对象的音量大小
--*使用说明:
-- 建立对象:BGM=New(script "BGMusci","声音文件地址",声音通道_默认为7)
-- 当不使用时卸载声音对象
|