随心所欲控制VR全景各场景声音
<krpano onstart="playsound(bg, backgroundmusic.mp3,0); loadscene(scene1,null,MERGE);">
<plugin name="soundinterface" url="soundinterface.swf" alturl="soundinterface.js" preload="true" />
<scene name="scene1">
<events name="scene1events" onxmlcomplete="tween(sound[bg].volume, 0.5);playsound(scene1sound, scene1music.mp3,1,tween(sound[bg].volume, 1));" onremovepano="stopsound(scene1sound);" />
...
scene>
<scene name="scene2">
<events name="scene2events" onxmlcomplete="tween(sound[bg].volume, 0.5);playsound(scene2sound, scene2music.mp3,1,tween(sound[bg].volume, 1));" onremovepano="stopsound(scene2sound);" />
...
scene>
krpano>
现在,我们来讲讲如何随心所欲的来控制场景的音乐,我们来假设这么一种情况。有三个展厅,每个展厅我们有三个场景,但我们只有三个解说词对应着这三个展厅,也就是当同一展厅的场景互相切换时,我们需要解说词是持续的,而不是因场景的变换而停止或重新开始。例如展厅1的场景a、b、c之间的相互切换,或者展厅2的场景d、e、f的相互切换时,其解说词是流动的,只有当不同展厅的场景切换时,才会中止之前展厅的解说词,而开始新的展厅的解说词,例如从展厅1的场景b到展厅2的场景f。
我们来假定四个场景,其中第一个场景和第三个场景属于一个“展厅”,第二个和第四个场景属于另外一个“展厅”,至于全局音乐为了方便,我们暂时不添加。
<krpano>
<plugin name="soundinterface" url="soundinterface.swf" alturl="soundinterface.js" preload="true" />
<skin_settings ...
...
musicgroup="0" />
<scene name="scene1"… group="1">
<events name="scene1events"
onxmlcomplete="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,
playsound(scene1sound, scene1music.mp3,1);
copy(skin_settings.musicgroup,scene[get(xml.scene)].group));"
onremovepano="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,stopsound(scene1sound));" />
...
scene>
<scene name="scene2"… group="2">
<events name="scene2events"
onxmlcomplete="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,
playsound(scene2sound, scene2music.mp3,1);
copy(skin_settings.musicgroup,scene[get(xml.scene)].group));"
onremovepano="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,stopsound(scene2sound));" />
...
scene>
<scene name="scene3"… group="1">
<events name="scene3events"
onxmlcomplete="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,
playsound(scene1sound, scene1music.mp3,1);
copy(skin_settings.musicgroup,scene[get(xml.scene)].group));"
onremovepano="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,stopsound(scene1sound));" />
...
scene>
<scene name="scene4"… group="2">
<events name="scene4events"
onxmlcomplete="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,
playsound(scene2sound, scene2music.mp3,1);
copy(skin_settings.musicgroup,scene[get(xml.scene)].group));"
onremovepano="ifnot(scene[get(xml.scene)].group == skin_settings.musicgroup,stopsound(scene2sound));" />
...
scene>
krpano>
我们先来看一个自定义属性 musicgroup,这是一个记录上一个场景的展厅id的属性,也就是看看上一个场景的展厅是属于哪一个组,如果和当前scene的group是同一个组的话,我们就不会停止音乐,也不会重新播放音乐。
<skin_settings ...
...
musicgroup="0" />
可以看到每个scene的标签内都自定义个一个属性group,后面的数字就是为了区别它们所属的组,相同数值的scene将被视为同一个“展厅”的场景。
因此我们先要判断ifnot,看看当前场景的group是否与上一个场景的展厅id相同,如果不相同的话,就播放音乐。同理不相同的话,还要移除上一个场景的音乐。还要记得用一个copy将当前group的数值复制到musicgroup中。这样每次判断的时候总是上一次场景的id。
0人觉得很赞