krpano tour.xml配置 项目自制 - 内测可用
1、skin_settings
<!-- CC:添加属性!
musicbjgroup="0" - 背景声音组!
musicspeakgroup="0" - 解说声音组!
loadingtext="加载中!" - 修改了场景加载时候,显示的文字!
thumbs_text="true" - 缩略图上显示名称。
title="true" - 左下角显示标题!
-->
<skin_settings maps="false"
maps_type="google"
maps_bing_api_key=""
maps_google_api_key=""
maps_zoombuttons="false"
gyro="true"
webvr="true"
webvr_gyro_keeplookingdirection="false"
webvr_prev_next_hotspots="true"
littleplanetintro="false"
title="true"
thumbs="true"
thumbs_width="120" thumbs_height="80" thumbs_padding="10" thumbs_crop="0|40|240|160"
thumbs_opened="false"
thumbs_text="true"
thumbs_dragging="true"
thumbs_onhoverscrolling="false"
thumbs_scrollbuttons="false"
thumbs_scrollindicator="false"
thumbs_loop="false"
tooltips_buttons="false"
tooltips_thumbs="false"
tooltips_hotspots="false"
tooltips_mapspots="false"
deeplinking="false"
loadscene_flags="MERGE"
loadscene_blend="OPENBLEND(0.5, 0.0, 0.75, 0.05, linear)"
loadscene_blend_prev="SLIDEBLEND(0.5, 180, 0.75, linear)"
loadscene_blend_next="SLIDEBLEND(0.5, 0, 0.75, linear)"
loadingtext="GGG..."
layout_width="100%"
layout_maxwidth="814"
controlbar_width="-24"
controlbar_height="40"
controlbar_offset="20"
controlbar_offset_closed="-40"
controlbar_overlap.no-fractionalscaling="10"
controlbar_overlap.fractionalscaling="0"
design_skin_images="vtourskin.png"
design_bgcolor="0x2D3E50"
design_bgalpha="0.8"
design_bgborder="0"
design_bgroundedge="1"
design_bgshadow="0 4 10 0x000000 0.3"
design_thumbborder_bgborder="3 0xFFFFFF 1.0"
design_thumbborder_padding="2"
design_thumbborder_bgroundedge="0"
design_text_css="color:#FFFFFF; font-family:Arial;"
design_text_shadow="1"
musicbjgroup="0"
musicspeakgroup="0"
/>
2、官方提供的皮肤选择(个人喜欢的一款)
<!-- CC:下为官方提供的皮肤! -->
<!-- <include url="skin/vtourskin_design_flat_light.xml" /> -->
<!-- <include url="skin/vtourskin_design_glass.xml" /> -->
<!-- <include url="skin/vtourskin_design_ultra_light.xml" /> -->
<include url="skin/vtourskin_design_117.xml" />
<!-- <include url="skin/vtourskin_design_117round.xml" /> -->
<!-- <include url="skin/vtourskin_design_black.xml" /> -->
<!-- startup action - load the first scene -->
3、启动时,加载内容设置!
<!-- startup action - load the first scene -->
<action name="startup" autorun="onstart" >
if(startscene === null OR !scene[get(startscene)], copy(startscene,scene[0].name); );
loadscene(get(startscene), null, MERGE);
if(startactions !== null, startactions() );
<!-- CC: 插入下行代码,播放背景声音!
bj - 背景声音的ID!
-->
playsound(bj, get(scene[get(xml.scene)].bjmusic), 0);
<!-- CC: 插入下行代码,播放当前解说声音!
scenesound - 当前场景解说的声音ID!
playsound() - 播放声音,传入声音ID - 地址 - 循环: 0 不循环; 1 循环(默认)。
-->
playsound(scenesound, get(scene[get(xml.scene)].speakmusic),0));
<!-- CC: 由于浏览器不然自动播放声音,容易混UI,所以这个播放周后,再暂停!
pausesound() - 传入ID, 则暂停当前ID的声音。
-->
pausesound(scenesound);
</action>
4、核心内容scene和简单说明
<!-- CC: 这个就是场景,一张全景图,一个点位,就是一个场景,一个scene!
bjgroup - 背景声音的组合,将相同背景声音的场景设为一个组, 从1 开始递增。 即 bjgroup="1";
bjmusic - 当前背景声音的地址!相同组bjgroup的背景声音是一样的!
speakgroup - 解说声音的组和,将相同解说声音的场景设为一个组, 从1 开始递增。 即 speakgroup="1";
speakmusic - 当前解说声音的地址!相同组speakmusic的解说声音是一样的!
-->
<scene name="scene_a" title="a" onstart="" havevrimage="true" thumburl="panos/a.tiles/thumb.jpg" lat="" lng="" heading="" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3" >
<!-- CC: 定义当前场景的视图。
hlookat - 就是水平的初始角度,
vlookat - 就是垂直初始角度
fov - 是视角。
maxpixelzoom - 是最大像素变焦 -->
<view hlookat="30.034" vlookat="-21.951" fovtype="MFOV" fov="120.000" maxpixelzoom="2.0" fovmin="70" fovmax="140" limitview="auto"/>
<!-- CC: 小图加载地址! -->
<preview url="panos/a.tiles/preview.jpg" />
<!-- CC: 大图加载地址! -->
<image type="CUBE" multires="true" tilesize="512" if="!webvr.isenabled">
<level tiledimagewidth="4096" tiledimageheight="4096">
<cube url="panos/a.tiles/%s/l3/%v/l3_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="2048" tiledimageheight="2048">
<cube url="panos/a.tiles/%s/l2/%v/l2_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="1024" tiledimageheight="1024">
<cube url="panos/a.tiles/%s/l1/%v/l1_%s_%v_%h.jpg" />
</level>
</image>
<image if="webvr.isenabled">
<cube url="panos/a.tiles/vr/pano_%s.jpg" />
</image>
<!-- 这个就是热点。
skin_hotspotstyle是被引入的,里面有场景加载的混合效果!
hotspot_animation - 热点动效图!
hotspot_animation_register - 热点动图默认第一帧!也就是动效图,默认不动,配合鼠标移入事件,开始播放动效。
hotspot_animation_onoven - 热点动图,鼠标移动上去后,开始动!
add_all_the_time_tooltip_for_VR - 热点显示介绍! 如果有text,那么显示text的内容,否则显示linkedscene="scene_b" 中的b!
text - 热点需要介绍的名字!
linkedscene - 连接的下一个场景,写入场景的名称!
onloaded="hotspot_animation(180 , 200,25);add_all_the_time_tooltip_for_VR()" - 该场景,显示动效,以及展示热点描述!
onloaded="hotspot_animation_register(180 , 200);add_all_the_time_tooltip_for_VR()" - 该场景,显示动效的第一帧,以及展示热点描述!
onover="hotspot_animation_onoven(180,200,30)" - 鼠标移入,动效图开始动画。
-->
<hotspot name="s11" url="img/ts.png" style="skin_hotspotstyle" ath="33.583" atv="33.308" linkedscene="scene_b" onloaded="hotspot_animation(180 , 200,25);add_all_the_time_tooltip_for_VR()" onover="hotspot_animation_register(180,200,25)" text="自定义" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3"/>
<hotspot name="s12" url="img/ts.png" ath="83.583" atv="83.308" linkedscene="scene_b" onloaded="hotspot_animation_register(180 , 200);add_all_the_time_tooltip_for_VR()" onover="hotspot_animation_onoven(180,200,30)" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3" onclick="openhtml()" urll="/3d/learn"/>
</scene>
... ... ... ...
5、打开超链接方法,这里没有使用iframe
<!-- CC: 打开html页面 ,另开窗口打开!没有使用iframe!
_self - 当前页面
_blank - 在新窗口中打开(默认)
注意:要再这里配置ip和端口!
-->
<action name="openhtml" >
txtadd(u ,'http://192.168.0.222:81' , get(urll));
openurl(get(u) ,_blank);
</action>
action - 就是自定义的功能,该方法在scene中hotspot热点的各种事件中去调用。比如onclick 、 onover 、 onout 、 onloaded等等,这些也是常用的事件触发。 当前action使用在热点上!
6、自动旋转的开启,以及相关主要事件
<!-- CC: 自动旋转
onidle 此事件将在没有用户交互的idletime秒后调用
onautorotatestart 自动旋转开始,执行的事件 暂停声音播放:pausesound(bj);pausesound(scenesound);
onautorotatestop 自动旋转结束后,开始执行的事件 下为开启声音播放!
if(layer[voice_bj].url == 'img/voice_bj_on.png' , resumesound(bj) , pausesound(bj));
if(layer[voice_speak].url == 'img/voice_speak_on.png' , resumesound(scenesound) , pausesound(scenesound)) delayedcall(10,);
-->
<autorotate enabled="false"
waittime="10"
accel="1.0"
speed="3.0"
horizon="off"
tofov="off"
oneroundrange="360.0"
zoomslowdown="true"
interruptionevents="userviewchange|layers|keyboard"
/>
<!-- CC: 自动旋转相关事件。 -->
<events name="myAutorotate" keep="true"
onidle="
delayedcall(60, autorotate.start());
"
onautorotatestart="
"
onautorotatestop="
"
/>
7、背景声音自定义UI,及其事件控制
简介:说一下背景声音的相关功能,和逻辑!
a.实现功能
第一:由于浏览器不让自动播放声音,所以一般情况背景声音不能自动播放。我这里有首开页面以及之后的视频,所以可以实现背景声音在首开页面>关闭视频>后自动播放。同时通过自定义的UI按钮,控制暂停/播放。
第二:背景声音的控制,将所有的scene场景,分为几个组,每个组有各自的背景声音。可切换场景,依据分组来播放各自的背景声音。
第三:在切换打开视频等时,除视频外所有声音暂停,关闭视频或者播放完毕后,所有声音依据之前各自的状态继续播放或者暂停。
b.逻辑简述
说几个关键的配置:
第一:skin_settings中的musicbjgroup=“0”; 定义了背景声音的组。
第二:各个scene的属性字段 - bjgroup=“1” bjmusic=“sound/bj_1.mp3” 分别定义了,背景声音组1 ,背景声音地址。如果其他某个scene也播放这个背景声音,那么需要在改scene上加入上述bjgroup=“1” bjmusic=“sound/bj_1.mp3” 属性。
<scene name="scene_a" title="a" onstart="" havevrimage="true" thumburl="panos/a.tiles/thumb.jpg" lat="" lng="" heading="" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3" >
第三:加载每个scene的xml时候,需要判断改场景的scene的bjgroup是否与musicbjgroup相同,如果相同,说明是同一个组的场景,不需要停止当前背景声音,不需要切换背景声音。否则停止,或者切换。再将当前组更新到musicbjgroup中!
onxmlcomplete="
ifnot(scene[get(xml.scene)].bjgroup == skin_settings.musicbjgroup,
playsound(bj, get(scene[get(xml.scene)].bjmusic),0);
copy(skin_settings.musicbjgroup,scene[get(xml.scene)].bjgroup));
"
c.自定义的UI背景声控layer
<!-- CC:背景声音控制按钮,修改了图片名称,记得名称要全部换掉! -->
<!-- CC:描述 声音点击的按钮控制和逻辑。暂停和恢复声音。 注意声音文件名称的格式!
οnclick="
switch(layer[voice_bj].url , 'img/voice_bj_off.png' , 'img/voice_bj_on.png');
if(layer[voice_bj].url == 'img/voice_bj_off.png' ,
pausesound(bj) , resumesound(bj));
"
-->
<layer name="voice_bj"
alpha="1"
handcursor="true"
enabled="true"
children="true"
visible="true"
zorder="77"
align="lefttop"
type="container"
maskchildren="true"
keep="true"
width="10%"
height="10%"
url="img/voice_bj_on.png"
bgcolor="0xFFFFFF"
bgalpha="1"
onclick="
switch(layer[voice_bj].url , 'img/voice_bj_off.png' , 'img/voice_bj_on.png');
if(layer[voice_bj].url == 'img/voice_bj_off.png' ,
pausesound(bj) , resumesound(bj));
"
/>
注意:url 也就是UI的地址。主要有两个UI控制,on/off !
8、解说声音UI及其事情控制
a.简说
解说声音也分组,和背景声音一样,不同的地方是,解说声音,默认不需播放。如下代码:
<action name="startup" autorun="onstart" >
... ...
<!-- CC: 插入下行代码,播放当前解说声音!
scenesound - 当前场景解说的声音ID!
playsound() - 播放声音,传入声音ID - 地址 - 循环: 0 不循环; 1 循环(默认)。
-->
playsound(scenesound, get(scene[get(xml.scene)].speakmusic),0));
<!-- CC: 由于浏览器不然自动播放声音,容易混UI,所以这个播放周后,再暂停!
pausesound() - 传入ID, 则暂停当前ID的声音。
-->
pausesound(scenesound);
... ...
</action>
先播放,再暂停,防止浏览器不然声音播放。
b.自定义的UI解说声控layer
<!-- CC:解说声音控制按钮,如果修改了图片名称,记得名称要全部换掉,不建议修改图片名称! -->
<!-- CC:描述 解说词声音
οnclick="
switch(layer[voice_speak].url , 'img/voice_speak_on.png' , 'img/voice_speak_off.png');
if(layer[voice_speak].url == 'img/voice_speak_off.png' ,
pausesound(scenesound) , resumesound(scenesound));
"-->
<layer name="voice_speak"
alpha="1"
handcursor="true"
enabled="true"
children="true"
visible="true"
zorder="77"
align="righttop"
type="container"
maskchildren="true"
keep="true"
width="10%"
height="10%"
url="img/voice_speak_off.png"
bgcolor="0xFFFFFF"
bgalpha="1"
onclick="
switch(layer[voice_speak].url , 'img/voice_speak_on.png' , 'img/voice_speak_off.png');
if(layer[voice_speak].url == 'img/voice_speak_off.png' ,
pausesound(scenesound) , resumesound(scenesound));
"
/>
9、首开图片和首开视频
<!-- CC: 首页图片! -->
<layer name="index_container"
preload="true"
alpha="1"
handcursor="true"
enabled="true"
children="true"
visible="true"
zorder="99"
type="container"
maskchildren="true"
keep="true"
width="100%"
height="100%"
url="img/index.jpg"
bgcolor="0xFFFFFF"
bgalpha="1"
/>
<!-- CC: 首页图片 - 点击进入按钮!
videoplayer_open() - 是播放开场视频的方法(当点击进入按钮后播放的视频),如果没有开场视频。那么去掉该方法!
-->
<layer name="index_button"
zorder="100"
keep="true"
x="0"
y="250"
type="container"
align="center"
url="img/logo.png"
scale="1"
alpha="0"
enabled="true"
onloaded="tween(alpha,1,1);tweenintrobuttonalpha(0.35)"
onover="stoptween(alpha);set(alpha,1)"
onout="tweenintrobuttonalpha(0.35)"
onclick="
if(layer[voice_bj].url == 'img/voice_bj_off.png' , pausesound(bj) , resumesound(bj));
videoplayer_open('%CURRENTXML%/video/index.mp4|%CURRENTXML%/video/index.webm', '%CURRENTXML%/video/index.jpg', 0.5);pausesound(scenesound);pausesound(bj);
tween(layer[index_container].alpha,0,1);
delayedcall(1,set(layer[index_container].enabled,false);
delayedcall(1,set(layer[index_button].enabled,false);
set(layer[index_container].visible,false));
set(layer[index_button].visible,false));
"
/>
<!-- CC: 图片按钮,呼吸感的方法! -->
<action name="tweenintrobuttonalpha" >
if(%1 == 0.35,
set(alphavalue,1),
set(alphavalue,0.35)
);
tween(layer[index_button].alpha,%1,1,default,tweenintrobuttonalpha(get(alphavalue)));
</action>
10、动效热点的action
<!-- CC: 动效热点,一直动! 在hotspot热点标签中的onloaded=""中调用。如果多个onloaded要加载,中间用分号隔开!-->
<action name="hotspot_animation" scope="local" args="framewidth, frameheight, framerate">
<!-- 定义局部变量 -->
calc(local.xframes, (caller.imagewidth /framewidth) BOR 0);
calc(local.frames, xframes * ((caller.imageheight / frameheight) BOR 0));
def(local.frame, integer, 0);
<!-- 设置第一帧 -->
calc(caller.crop, '0|0|' + framewidth + '|' + frameheight);
<!-- 动画部分 -->
setinterval(calc('crop_anim_' + caller.name), calc(1.0 / framerate),
if(caller.loaded,
inc(frame);
if(frame GE frames, if(caller.onlastframe !== null, callwith(caller, onlastframe() ) ); set(frame,0); );
mod(xpos, frame, xframes);
div(ypos, frame, xframes);
Math.floor(ypos);
mul(xpos, framewidth);
mul(ypos, frameheight);
calc(caller.crop, xpos + '|' + ypos + '|' + framewidth + '|' + frameheight);
,
<!-- 当热点移除时停止动画 -->
clearinterval(calc('crop_anim_' + caller.name));
);
);
</action>
11、动效热点加载时,显示第一帧,鼠标移入显示动画
<!-- CC: 在onover 中,调用该action。 -->
<action name="hotspot_animation_onoven">
if(hotspot[get(name)].animated === null OR hotspot[get(name)].animated == false,
set(hotspot[get(name)].animated,true);
setinterval(calc('crop_anim_' + name), calc(1.0 / %3),
inc(frame);
if(frame GE frames, if(onlastframe !== null, onlastframe() ); set(frame,0); );
mod(xpos, frame, xframes);
div(ypos, frame, xframes);
Math.floor(ypos);
mul(xpos, %1);
mul(ypos, %2);
calc(crop, xpos + '|' + ypos + '|%1|%2');
);
,
set(hotspot[get(name)].animated,false);
clearinterval(calc('crop_anim_' + name));
set(crop, '0|0|%1|%2');
);
</action>
<!-- CC: 在onloaded中调用该action! -->
<action name="hotspot_animation_register">
registerattribute(xframes, calc((imagewidth / %1) BOR 0));
registerattribute(yframes, calc((imageheight / %2) BOR 0));
registerattribute(frames, calc(xframes * yframes));
registerattribute(frame, 0);
set(crop, '0|0|%1|%2');
</action>
12、引入声音播放插件且自由控制声音播放
<!-- CC: 引入声音播放的插件! -->
<plugin name="soundinterface"
url="%SWFPATH%/plugins/soundinterface.swf"
alturl="%SWFPATH%/plugins/soundinterface.js"
rootpath=""
preload="true"
keep="true"
/>
<!-- CC: 自由控制播放声音!
onxmlcomplete="" , - 该事件,当当前场景scene的xml文件加载完成后,执行的方法!
下为 - 背景声音与场景判断,及其播放 、设置!
ifnot(scene[get(xml.scene)].bjgroup == skin_settings.musicbjgroup,
playsound(bj, get(scene[get(xml.scene)].bjmusic),0);
copy(skin_settings.musicbjgroup,scene[get(xml.scene)].bjgroup));
下为 - 解说声音与场景判断,及其播放 、设置!
ifnot(scene[get(xml.scene)].speakgroup == skin_settings.musicspeakgroup,
playsound(scenesound, get(scene[get(xml.scene)].speakmusic),0);
copy(skin_settings.musicspeakgroup,scene[get(xml.scene)].speakgroup));
下为 - 背景声音和解说声音判断,是否暂停或者开始! 图片不建议修改!
if(layer[voice_bj].url == 'img/voice_bj_off.png' , pausesound(scenesound) , resumesound(scenesound));
if(layer[voice_speak].url == 'img/voice_speak_off.png' , pausesound(scenesound) , resumesound(scenesound));
下为 - 加载场景scene判断,是否有视频播放。如果有,那么播放视频。
if(scene[get(xml.scene)].name == 'scene_c',videoplayer_open('%CURRENTXML%/video/scene_1.mp4|%CURRENTXML%/video/scene_1.webm', '%CURRENTXML%/video/scene_1.jpg', 0.5);pausesound(scenesound);pausesound(bj));
-->
<events name="scene1events" keep="true"
onxmlcomplete="
ifnot(scene[get(xml.scene)].bjgroup == skin_settings.musicbjgroup,
playsound(bj, get(scene[get(xml.scene)].bjmusic),0);
copy(skin_settings.musicbjgroup,scene[get(xml.scene)].bjgroup));
ifnot(scene[get(xml.scene)].speakgroup == skin_settings.musicspeakgroup,
playsound(scenesound, get(scene[get(xml.scene)].speakmusic),0);
copy(skin_settings.musicspeakgroup,scene[get(xml.scene)].speakgroup));
if(layer[voice_bj].url == 'img/voice_bj_off.png' , pausesound(bj) , resumesound(bj));
if(layer[voice_speak].url == 'img/voice_speak_off.png' , pausesound(scenesound) , resumesound(scenesound));
if(scene[get(xml.scene)].name == 'scene_c',videoplayer_open('%CURRENTXML%/video/scene_1.mp4|%CURRENTXML%/video/scene_1.webm', '%CURRENTXML%/video/scene_1.jpg', 0.5);pausesound(scenesound);pausesound(bj));
"
/>
13、视频播放控制(官方提供案例前提下的修改)
注意两点:
第一: 修改视频关闭按钮的图片和位置大小等
第二:注意,视频的关闭有背景声音和解说声音的恢复控制。
<!-- CC: 视频播放区域!
可以修改,关闭按钮的位置布局。
-->
<action name="videoplayer_open">
if(layer[videoplayer_bg],
<!-- error -->
trace('videoplayer_open - there is already a videoplayer!'-);
,
<!-- step one - add a background layer and fade it in -->
addlayer(videoplayer_bg);
set(layer[videoplayer_bg].type, container);
set(layer[videoplayer_bg].zorder, 999);
set(layer[videoplayer_bg].safearea, false);
set(layer[videoplayer_bg].align, lefttop);
set(layer[videoplayer_bg].width, 100%);
set(layer[videoplayer_bg].height, 100%);
set(layer[videoplayer_bg].bgcolor, 0x000000);
set(layer[videoplayer_bg].bgalpha, 1);
set(layer[videoplayer_bg].bgcapture, true);
set(layer[videoplayer_bg].alpha, 0.0);
tween(layer[videoplayer_bg].alpha, 1.0, 0.2, default,
addlayer(videoplayer_plugin);
set(layer[videoplayer_plugin].parent, layer[videoplayer_bg]);
set(layer[videoplayer_plugin].align, center);
set(layer[videoplayer_plugin].loop, false);
set(layer[videoplayer_plugin].onclick, togglepause() );
set(layer[videoplayer_plugin].alpha, 0.0);
set(layer[videoplayer_plugin].onloaded, videoplayer_plugin_ready(%1) );
set(layer[videoplayer_plugin].onvideocomplete, videoplayer_close());
if('%2' != null, set(layer[videoplayer_plugin].posterurl,'%2'); );
if('%3' != null, set(layer[videoplayer_plugin].volume,%3); );
if(device.flash,
set(layer[videoplayer_plugin].url,'%SWFPATH%/plugins/videoplayer.swf');
,
set(layer[videoplayer_plugin].url,'%SWFPATH%/plugins/videoplayer.js');
);
);
);
addlayer(videoplayer_cls);
set(layer[videoplayer_cls].zorder, 1000);
set(layer[videoplayer_cls].keep, true);
set(layer[videoplayer_cls].url, '%SWFPATH%/img/cls.png');
set(layer[videoplayer_cls].x, '5%');
set(layer[videoplayer_cls].y, '5%');
set(layer[videoplayer_cls].width, '2%');
set(layer[videoplayer_cls].height, '5%');
set(layer[videoplayer_cls].align, 'righttop');
set(layer[videoplayer_cls].alpha, 0);
tween(layer[videoplayer_cls].alpha , 1 , 1);
set(layer[videoplayer_cls].onclick, videoplayer_close()
);
</action>
<!-- CC: 视频播放! -->
<action name="videoplayer_plugin_ready">
if(layer[videoplayer_plugin],
set(events[videoplayer_events].onresize, videoplayer_plugin_resize() );
set(layer[videoplayer_plugin].pausedonstart, true);
set(layer[videoplayer_plugin].onvideoready,
videoplayer_plugin_resize();
tween(alpha,1,0.5,default, ifnot(device.ios, play() ) );
);
layer[videoplayer_plugin].playvideo(%1);
);
</action>
<!-- CC: 窗口变化后,自适应! -->
<action name="videoplayer_plugin_resize">
div(aspect, layer[videoplayer_plugin].imagewidth, layer[videoplayer_plugin].imageheight);
mul(new_videowidth, stagewidth,1);
div(new_videoheight, new_videowidth, aspect);
mul(max_videoheight, stageheight, 1);
roundval(new_videowidth);
roundval(new_videoheight);
copy(layer[videoplayer_plugin].width, new_videowidth);
copy(layer[videoplayer_plugin].height, new_videoheight);
</action>
<!-- CC: 视频关闭!
视频关闭后,需要依据声音按钮状态,恢复或暂停背景与解说声音的播放!
不建议修改UI图片!
-->
<action name="videoplayer_close">
set(events.[videoplayer_events].name, null);
if(layer[videoplayer_plugin], layer[videoplayer_plugin].pause() );
set(layer[videoplayer_bg].onclick, null);
set(layer[videoplayer_cls].onclick , null);
removelayer(videoplayer_plugin);
removelayer(videoplayer_bg);
removelayer(videoplayer_cls);
tween(layer[videoplayer_plugin].alpha, 0, 1, default,
removelayer(videoplayer_plugin);
removelayer(videoplayer_bg);
removelayer(videoplayer_cls);
);
if(layer[voice_bj].url == 'img/voice_bj_on.png' , resumesound(bj),pausesound(bj));
if(layer[voice_speak].url == 'img/voice_speak_on.png', resumesound(scenesound) , pausesound(scenesound));
</action>
14、完整tour.xml代码
<krpano version="1.19" title="数字史馆">
<include url="skin/vtourskin.xml" />
<!-- customize skin settings: maps, gyro, webvr, thumbnails, tooltips, layout, design, ... -->
<!-- CC:添加属性!
musicbjgroup="0" - 背景声音组!
musicspeakgroup="0" - 解说声音组!
loadingtext="加载中!" - 修改了场景加载时候,显示的文字!
thumbs_text="true" - 缩略图上显示名称。
title="true" - 左下角显示标题!
-->
<skin_settings maps="false"
maps_type="google"
maps_bing_api_key=""
maps_google_api_key=""
maps_zoombuttons="false"
gyro="true"
webvr="true"
webvr_gyro_keeplookingdirection="false"
webvr_prev_next_hotspots="true"
littleplanetintro="false"
title="true"
thumbs="true"
thumbs_width="120" thumbs_height="80" thumbs_padding="10" thumbs_crop="0|40|240|160"
thumbs_opened="false"
thumbs_text="true"
thumbs_dragging="true"
thumbs_onhoverscrolling="false"
thumbs_scrollbuttons="false"
thumbs_scrollindicator="false"
thumbs_loop="false"
tooltips_buttons="false"
tooltips_thumbs="false"
tooltips_hotspots="false"
tooltips_mapspots="false"
deeplinking="false"
loadscene_flags="MERGE"
loadscene_blend="OPENBLEND(0.5, 0.0, 0.75, 0.05, linear)"
loadscene_blend_prev="SLIDEBLEND(0.5, 180, 0.75, linear)"
loadscene_blend_next="SLIDEBLEND(0.5, 0, 0.75, linear)"
loadingtext="GGG..."
layout_width="100%"
layout_maxwidth="814"
controlbar_width="-24"
controlbar_height="40"
controlbar_offset="20"
controlbar_offset_closed="-40"
controlbar_overlap.no-fractionalscaling="10"
controlbar_overlap.fractionalscaling="0"
design_skin_images="vtourskin.png"
design_bgcolor="0x2D3E50"
design_bgalpha="0.8"
design_bgborder="0"
design_bgroundedge="1"
design_bgshadow="0 4 10 0x000000 0.3"
design_thumbborder_bgborder="3 0xFFFFFF 1.0"
design_thumbborder_padding="2"
design_thumbborder_bgroundedge="0"
design_text_css="color:#FFFFFF; font-family:Arial;"
design_text_shadow="1"
musicbjgroup="0"
musicspeakgroup="0"
/>
<!-- qita
For an alternative skin design either change the <skin_settings> values
from above or optionally include one of the predefined designs from below.
-->
<!-- CC:下为官方提供的皮肤! -->
<!-- <include url="skin/vtourskin_design_flat_light.xml" /> -->
<!-- <include url="skin/vtourskin_design_glass.xml" /> -->
<!-- <include url="skin/vtourskin_design_ultra_light.xml" /> -->
<include url="skin/vtourskin_design_117.xml" />
<!-- <include url="skin/vtourskin_design_117round.xml" /> -->
<!-- <include url="skin/vtourskin_design_black.xml" /> -->
<!-- startup action - load the first scene -->
<action name="startup" autorun="onstart" >
if(startscene === null OR !scene[get(startscene)], copy(startscene,scene[0].name); );
loadscene(get(startscene), null, MERGE);
if(startactions !== null, startactions() );
<!-- CC: 插入下行代码,播放背景声音!
bj - 背景声音的ID!
-->
playsound(bj, get(scene[get(xml.scene)].bjmusic), 0);
<!-- CC: 插入下行代码,播放当前解说声音!
scenesound - 当前场景解说的声音ID!
playsound() - 播放声音,传入声音ID - 地址 - 循环: 0 不循环; 1 循环(默认)。
-->
playsound(scenesound, get(scene[get(xml.scene)].speakmusic),0));
<!-- CC: 由于浏览器不然自动播放声音,容易混UI,所以这个播放周后,再暂停!
pausesound() - 传入ID, 则暂停当前ID的声音。
-->
pausesound(scenesound);
</action>
<!-- CC: 这个就是场景,一张全景图,一个点位,就是一个场景,一个scene!
bjgroup - 背景声音的组合,将相同背景声音的场景设为一个组, 从1 开始递增。 即 bjgroup="1";
bjmusic - 当前背景声音的地址!相同组bjgroup的背景声音是一样的!
speakgroup - 解说声音的组和,将相同解说声音的场景设为一个组, 从1 开始递增。 即 speakgroup="1";
speakmusic - 当前解说声音的地址!相同组speakmusic的解说声音是一样的!
-->
<scene name="scene_a" title="a" onstart="" havevrimage="true" thumburl="panos/a.tiles/thumb.jpg" lat="" lng="" heading="" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3" >
<!-- CC: 定义当前场景的视图。
hlookat - 就是水平的初始角度,
vlookat - 就是垂直初始角度
fov - 是视角。
maxpixelzoom - 是最大像素变焦 -->
<view hlookat="30.034" vlookat="-21.951" fovtype="MFOV" fov="120.000" maxpixelzoom="2.0" fovmin="70" fovmax="140" limitview="auto"/>
<!-- CC: 小图加载地址! -->
<preview url="panos/a.tiles/preview.jpg" />
<!-- CC: 大图加载地址! -->
<image type="CUBE" multires="true" tilesize="512" if="!webvr.isenabled">
<level tiledimagewidth="4096" tiledimageheight="4096">
<cube url="panos/a.tiles/%s/l3/%v/l3_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="2048" tiledimageheight="2048">
<cube url="panos/a.tiles/%s/l2/%v/l2_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="1024" tiledimageheight="1024">
<cube url="panos/a.tiles/%s/l1/%v/l1_%s_%v_%h.jpg" />
</level>
</image>
<image if="webvr.isenabled">
<cube url="panos/a.tiles/vr/pano_%s.jpg" />
</image>
<!-- 这个就是热点。
skin_hotspotstyle是被引入的,里面有场景加载的混合效果!
hotspot_animation - 热点动图!
hotspot_animation_register - 热点动图默认第一帧!
hotspot_animation_onoven - 热点动图,鼠标移动上去后,开始动!
add_all_the_time_tooltip_for_VR - 热点显示介绍! 如果有text,那么显示text的内容,否则显示linkedscene="scene_b" 中的b!
text - 热点需要介绍的名字!
linkedscene - 连接的下一个场景,写入场景的名称!
onloaded="hotspot_animation(180 , 200,25);add_all_the_time_tooltip_for_VR()" - 该场景,显示动效,以及展示热点描述!
onloaded="hotspot_animation_register(180 , 200);add_all_the_time_tooltip_for_VR()" - 该场景,显示动效的第一帧,以及展示热点描述!
onover="hotspot_animation_onoven(180,200,30)" - 鼠标移入,动效图开始动画。
-->
<hotspot name="s11" url="img/ts.png" style="skin_hotspotstyle" ath="33.583" atv="33.308" linkedscene="scene_b" onloaded="hotspot_animation(180 , 200,25);add_all_the_time_tooltip_for_VR()" onover="hotspot_animation_register(180,200,25)" text="自定义" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3"/>
<hotspot name="s12" url="img/ts.png" ath="83.583" atv="83.308" linkedscene="scene_b" onloaded="hotspot_animation_register(180 , 200);add_all_the_time_tooltip_for_VR()" onover="hotspot_animation_onoven(180,200,30)" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3" onclick="openhtml()" urll="/3d/learn"/>
</scene>
<scene name="scene_b" title="b" onstart="" havevrimage="true" thumburl="panos/b.tiles/thumb.jpg" lat="" lng="" heading="" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3" >
<view hlookat="1.469" vlookat="-5.777" fovtype="MFOV" fov="120.000" maxpixelzoom="2.0" fovmin="70" fovmax="140" limitview="auto" />
<preview url="panos/b.tiles/preview.jpg" />
<image type="CUBE" multires="true" tilesize="512" if="!webvr.isenabled">
<level tiledimagewidth="4096" tiledimageheight="4096">
<cube url="panos/b.tiles/%s/l3/%v/l3_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="2048" tiledimageheight="2048">
<cube url="panos/b.tiles/%s/l2/%v/l2_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="1024" tiledimageheight="1024">
<cube url="panos/b.tiles/%s/l1/%v/l1_%s_%v_%h.jpg" />
</level>
</image>
<image if="webvr.isenabled">
<cube url="panos/b.tiles/vr/pano_%s.jpg" />
</image>
<!-- style="skin_hotspotstyle" -->
<hotspot name="spot1" url="img/ts.png" ath="-0.046" atv="15.150" style="skin_hotspotstyle" linkedscene="scene_c"/>
</scene>
<scene name="scene_c" title="c" onstart="" havevrimage="true" thumburl="panos/c.tiles/thumb.jpg" lat="" lng="" heading="" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="2" speakmusic="sound/speak_2.mp3">
<view hlookat="3.623" vlookat="-17.429" fovtype="MFOV" fov="120.000" maxpixelzoom="2.0" fovmin="70" fovmax="140" limitview="auto" />
<preview url="panos/c.tiles/preview.jpg" />
<image type="CUBE" multires="true" tilesize="512" if="!webvr.isenabled">
<level tiledimagewidth="4096" tiledimageheight="4096">
<cube url="panos/c.tiles/%s/l3/%v/l3_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="2048" tiledimageheight="2048">
<cube url="panos/c.tiles/%s/l2/%v/l2_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="1024" tiledimageheight="1024">
<cube url="panos/c.tiles/%s/l1/%v/l1_%s_%v_%h.jpg" />
</level>
</image>
<image if="webvr.isenabled">
<cube url="panos/c.tiles/vr/pano_%s.jpg" />
</image>
<hotspot name="spot1" style="skin_hotspotstyle" ath="2.313" atv="31.905" linkedscene="scene_d" />
</scene>
<scene name="scene_d" title="d" onstart="" havevrimage="true" thumburl="panos/d.tiles/thumb.jpg" lat="" lng="" heading="" bjgroup="1" bjmusic="sound/bj_1.mp3" speakgroup="2" speakmusic="sound/speak_2.mp3">
<view hlookat="2.546" vlookat="-17.135" fovtype="MFOV" fov="120.000" maxpixelzoom="2.0" fovmin="70" fovmax="140" limitview="auto" />
<preview url="panos/d.tiles/preview.jpg" />
<image type="CUBE" multires="true" tilesize="512" if="!webvr.isenabled">
<level tiledimagewidth="4096" tiledimageheight="4096">
<cube url="panos/d.tiles/%s/l3/%v/l3_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="2048" tiledimageheight="2048">
<cube url="panos/d.tiles/%s/l2/%v/l2_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="1024" tiledimageheight="1024">
<cube url="panos/d.tiles/%s/l1/%v/l1_%s_%v_%h.jpg" />
</level>
</image>
<image if="webvr.isenabled">
<cube url="panos/d.tiles/vr/pano_%s.jpg" />
</image>
<hotspot name="spot1" style="skin_hotspotstyle" ath="-48.276" atv="16.216" linkedscene="scene_e" />
</scene>
<scene name="scene_e" title="e" onstart="" havevrimage="true" thumburl="panos/e.tiles/thumb.jpg" lat="" lng="" heading="" bjgroup="2" bjmusic="sound/bj_2.mp3" speakgroup="1" speakmusic="sound/speak_1.mp3">
<view hlookat="-1.273" vlookat="-18.604" fovtype="MFOV" fov="120.000" maxpixelzoom="2.0" fovmin="70" fovmax="140" limitview="auto" />
<preview url="panos/e.tiles/preview.jpg" />
<image type="CUBE" multires="true" tilesize="512" if="!webvr.isenabled">
<level tiledimagewidth="4096" tiledimageheight="4096">
<cube url="panos/e.tiles/%s/l3/%v/l3_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="2048" tiledimageheight="2048">
<cube url="panos/e.tiles/%s/l2/%v/l2_%s_%v_%h.jpg" />
</level>
<level tiledimagewidth="1024" tiledimageheight="1024">
<cube url="panos/e.tiles/%s/l1/%v/l1_%s_%v_%h.jpg" />
</level>
</image>
<image if="webvr.isenabled">
<cube url="panos/e.tiles/vr/pano_%s.jpg" />
</image>
<hotspot name="spot1" style="skin_hotspotstyle" ath="177.268" atv="22.327" linkedscene="scene_a" />
</scene>
<!-- CC: 打开html页面 ,另开窗口打开!没有使用iframe!
_self - 当前页面
_blank - 在新窗口中打开(默认)
注意:要再这里配置ip和端口!
-->
<action name="openhtml" >
txtadd(u ,'http://192.168.0.222:81' , get(urll));
openurl(get(u) ,_blank);
</action>
<!-- CC: 自动旋转
onidle 此事件将在没有用户交互的idletime秒后调用
onautorotatestart 自动旋转开始,执行的事件 暂停声音播放:pausesound(bj);pausesound(scenesound);
onautorotatestop 自动旋转结束后,开始执行的事件 下为开启声音播放!
if(layer[voice_bj].url == 'img/voice_bj_on.png' , resumesound(bj) , pausesound(bj));
if(layer[voice_speak].url == 'img/voice_speak_on.png' , resumesound(scenesound) , pausesound(scenesound)) delayedcall(10,);
-->
<autorotate enabled="false"
waittime="10"
accel="1.0"
speed="3.0"
horizon="off"
tofov="off"
oneroundrange="360.0"
zoomslowdown="true"
interruptionevents="userviewchange|layers|keyboard"
/>
<!-- CC: 自动旋转相关事件。 -->
<events name="myAutorotate" keep="true"
onidle="
delayedcall(60, autorotate.start());
"
onautorotatestart="
"
onautorotatestop="
"
/>
<!-- CC:背景声音控制按钮,修改了图片名称,记得名称要全部换掉! -->
<!-- CC:描述 声音点击的按钮控制和逻辑。暂停和恢复声音。 注意声音文件名称的格式!
onclick="
switch(layer[voice_bj].url , 'img/voice_bj_off.png' , 'img/voice_bj_on.png');
if(layer[voice_bj].url == 'img/voice_bj_off.png' ,
pausesound(bj) , resumesound(bj));
"
-->
<layer name="voice_bj"
alpha="1"
handcursor="true"
enabled="true"
children="true"
visible="true"
zorder="77"
align="lefttop"
type="container"
maskchildren="true"
keep="true"
width="10%"
height="10%"
url="img/voice_bj_on.png"
bgcolor="0xFFFFFF"
bgalpha="1"
onclick="
switch(layer[voice_bj].url , 'img/voice_bj_off.png' , 'img/voice_bj_on.png');
if(layer[voice_bj].url == 'img/voice_bj_off.png' ,
pausesound(bj) , resumesound(bj));
"
/>
<!-- CC:解说声音控制按钮,如果修改了图片名称,记得名称要全部换掉,不建议修改图片名称! -->
<!-- CC:描述 解说词声音
onclick="
switch(layer[voice_speak].url , 'img/voice_speak_on.png' , 'img/voice_speak_off.png');
if(layer[voice_speak].url == 'img/voice_speak_off.png' ,
pausesound(scenesound) , resumesound(scenesound));
"-->
<layer name="voice_speak"
alpha="1"
handcursor="true"
enabled="true"
children="true"
visible="true"
zorder="77"
align="righttop"
type="container"
maskchildren="true"
keep="true"
width="10%"
height="10%"
url="img/voice_speak_off.png"
bgcolor="0xFFFFFF"
bgalpha="1"
onclick="
switch(layer[voice_speak].url , 'img/voice_speak_on.png' , 'img/voice_speak_off.png');
if(layer[voice_speak].url == 'img/voice_speak_off.png' ,
pausesound(scenesound) , resumesound(scenesound));
"
/>
<!-- CC: 首页图片! -->
<layer name="index_container"
preload="true"
alpha="1"
handcursor="true"
enabled="true"
children="true"
visible="true"
zorder="99"
type="container"
maskchildren="true"
keep="true"
width="100%"
height="100%"
url="img/index.jpg"
bgcolor="0xFFFFFF"
bgalpha="1"
/>
<!-- CC: 首页图片 - 点击进入按钮!
videoplayer_open() - 是播放开场视频的方法(当点击进入按钮后播放的视频),如果没有开场视频。那么去掉改方法!
-->
<layer name="index_button"
zorder="100"
keep="true"
x="0"
y="250"
type="container"
align="center"
url="img/logo.png"
scale="1"
alpha="0"
enabled="true"
onloaded="tween(alpha,1,1);tweenintrobuttonalpha(0.35)"
onover="stoptween(alpha);set(alpha,1)"
onout="tweenintrobuttonalpha(0.35)"
onclick="
if(layer[voice_bj].url == 'img/voice_bj_off.png' , pausesound(bj) , resumesound(bj));
videoplayer_open('%CURRENTXML%/video/index.mp4|%CURRENTXML%/video/index.webm', '%CURRENTXML%/video/index.jpg', 0.5);pausesound(scenesound);pausesound(bj);
tween(layer[index_container].alpha,0,1);
delayedcall(1,set(layer[index_container].enabled,false);
delayedcall(1,set(layer[index_button].enabled,false);
set(layer[index_container].visible,false));
set(layer[index_button].visible,false));
"
/>
<!-- CC: 图片按钮,呼吸感的方法! -->
<action name="tweenintrobuttonalpha" >
if(%1 == 0.35,
set(alphavalue,1),
set(alphavalue,0.35)
);
tween(layer[index_button].alpha,%1,1,default,tweenintrobuttonalpha(get(alphavalue)));
</action>
<!-- CC: 动效热点,一直动! 在hotspot热点标签中的onloaded=""中调用。如果多个onloaded要加载,中间用分号隔开!-->
<action name="hotspot_animation" scope="local" args="framewidth, frameheight, framerate">
<!-- 定义局部变量 -->
calc(local.xframes, (caller.imagewidth /framewidth) BOR 0);
calc(local.frames, xframes * ((caller.imageheight / frameheight) BOR 0));
def(local.frame, integer, 0);
<!-- 设置第一帧 -->
calc(caller.crop, '0|0|' + framewidth + '|' + frameheight);
<!-- 动画部分 -->
setinterval(calc('crop_anim_' + caller.name), calc(1.0 / framerate),
if(caller.loaded,
inc(frame);
if(frame GE frames, if(caller.onlastframe !== null, callwith(caller, onlastframe() ) ); set(frame,0); );
mod(xpos, frame, xframes);
div(ypos, frame, xframes);
Math.floor(ypos);
mul(xpos, framewidth);
mul(ypos, frameheight);
calc(caller.crop, xpos + '|' + ypos + '|' + framewidth + '|' + frameheight);
,
<!-- 当热点移除时停止动画 -->
clearinterval(calc('crop_anim_' + caller.name));
);
);
</action>
<!-- 显示热点的描述 ,可以自定义text,可以是场景名称!在hotspot热点标签中的onloaded=""中调用。如果多个onloaded要加载,中间用分号隔开! -->
<action name="add_all_the_time_tooltip_for_VR">
txtadd(tooltipname, 'vrtooltip_', get(name));
addhotspot(get(tooltipname));
set(hotspot[get(tooltipname)],
type=text,
edge=get(hotspot[get(name)].edge),
distorted=get(hotspot[get(name)].distorted),
ath=get(hotspot[get(name)].ath),
atv=get(hotspot[get(name)].atv),
oy=-50,
ox=0,
vcenter=true,
padding=5,
mipmapping=true,
oversampling=2,
bg=true,
bgcolor=0x000000,
bgroundedge=5,
bgalpha=0.65,
bgborder=0,
bgshadow='0 0 0 0x000000 0',
css=calc(device.mobile ? 'text-align:center; color:#FFFFFF; font-family:MicrosoftYahei; font-weight:bold; font-size:14px;':'text-align:left; color:#FFFFFF; font-family:MicrosoftYahei; font-size:14px;'),
txtshadow='0 0 0 0x000000 0';
enabled=true,
);
txtadd(hotspot[get(tooltipname)].onclick,'callwith(hotspot[',get(name),'],onclick)');
if(text == '' OR text === null,
copy(hotspot[get(tooltipname)].html,scene[get(linkedscene)].title),
copy(hotspot[get(tooltipname)].html,text);
);
if(lp_running == false,
set(hotspot[get(tooltipname)].visible,true);
,
if(!webvr.isenabled,
if(lp_running == true,
set(hotspot[get(tooltipname)].visible,false);
set(hotspot[get(tooltipname)].mark2,true);
);
);
);
if(hotspot[get(name)].normal == false,
set(hotspot[get(tooltipname)].normal,false);
set(hotspot[get(tooltipname)].onloaded,
if(webvr.isenabled,
set(visible,false);
,
if(lp_running == false OR lp_running == null OR lp_running === null,
set(visible,true);
);
);
);
);
</action>
<!-- CC: 在onclick 或者onover 或者onout中,调用该action。但是不能同时使用onclick和onover -->
<action name="hotspot_animation_onoven">
if(hotspot[get(name)].animated === null OR hotspot[get(name)].animated == false,
set(hotspot[get(name)].animated,true);
setinterval(calc('crop_anim_' + name), calc(1.0 / %3),
inc(frame);
if(frame GE frames, if(onlastframe !== null, onlastframe() ); set(frame,0); );
mod(xpos, frame, xframes);
div(ypos, frame, xframes);
Math.floor(ypos);
mul(xpos, %1);
mul(ypos, %2);
calc(crop, xpos + '|' + ypos + '|%1|%2');
);
,
set(hotspot[get(name)].animated,false);
clearinterval(calc('crop_anim_' + name));
set(crop, '0|0|%1|%2');
);
</action>
<!-- CC: 在onloaded中调用该action! -->
<action name="hotspot_animation_register">
registerattribute(xframes, calc((imagewidth / %1) BOR 0));
registerattribute(yframes, calc((imageheight / %2) BOR 0));
registerattribute(frames, calc(xframes * yframes));
registerattribute(frame, 0);
set(crop, '0|0|%1|%2');
</action>
<!-- CC: 引入声音播放的插件! -->
<plugin name="soundinterface"
url="%SWFPATH%/plugins/soundinterface.swf"
alturl="%SWFPATH%/plugins/soundinterface.js"
rootpath=""
preload="true"
keep="true"
/>
<!-- CC: 自由控制播放声音!
onxmlcomplete="" , - 该事件,当当前场景scene的xml文件加载完成后,执行的方法!
下为 - 背景声音与场景判断,及其播放 、设置!
ifnot(scene[get(xml.scene)].bjgroup == skin_settings.musicbjgroup,
playsound(bj, get(scene[get(xml.scene)].bjmusic),0);
copy(skin_settings.musicbjgroup,scene[get(xml.scene)].bjgroup));
下为 - 解说声音与场景判断,及其播放 、设置!
ifnot(scene[get(xml.scene)].speakgroup == skin_settings.musicspeakgroup,
playsound(scenesound, get(scene[get(xml.scene)].speakmusic),0);
copy(skin_settings.musicspeakgroup,scene[get(xml.scene)].speakgroup));
下为 - 背景声音和解说声音判断,是否暂停或者开始! 图片不建议修改!
if(layer[voice_bj].url == 'img/voice_bj_off.png' , pausesound(scenesound) , resumesound(scenesound));
if(layer[voice_speak].url == 'img/voice_speak_off.png' , pausesound(scenesound) , resumesound(scenesound));
下为 - 加载场景scene判断,是否有视频播放。如果有,那么播放视频。
if(scene[get(xml.scene)].name == 'scene_c',videoplayer_open('%CURRENTXML%/video/scene_1.mp4|%CURRENTXML%/video/scene_1.webm', '%CURRENTXML%/video/scene_1.jpg', 0.5);pausesound(scenesound);pausesound(bj));
-->
<events name="scene1events" keep="true"
onxmlcomplete="
ifnot(scene[get(xml.scene)].bjgroup == skin_settings.musicbjgroup,
playsound(bj, get(scene[get(xml.scene)].bjmusic),0);
copy(skin_settings.musicbjgroup,scene[get(xml.scene)].bjgroup));
ifnot(scene[get(xml.scene)].speakgroup == skin_settings.musicspeakgroup,
playsound(scenesound, get(scene[get(xml.scene)].speakmusic),0);
copy(skin_settings.musicspeakgroup,scene[get(xml.scene)].speakgroup));
if(layer[voice_bj].url == 'img/voice_bj_off.png' , pausesound(bj) , resumesound(bj));
if(layer[voice_speak].url == 'img/voice_speak_off.png' , pausesound(scenesound) , resumesound(scenesound));
if(scene[get(xml.scene)].name == 'scene_c',videoplayer_open('%CURRENTXML%/video/scene_1.mp4|%CURRENTXML%/video/scene_1.webm', '%CURRENTXML%/video/scene_1.jpg', 0.5);pausesound(scenesound);pausesound(bj));
"
/>
<!-- CC: 视频播放区域!
可以修改,关闭按钮的位置布局。
-->
<action name="videoplayer_open">
if(layer[videoplayer_bg],
<!-- error -->
trace('videoplayer_open - there is already a videoplayer!'-);
,
<!-- step one - add a background layer and fade it in -->
addlayer(videoplayer_bg);
set(layer[videoplayer_bg].type, container);
set(layer[videoplayer_bg].zorder, 999);
set(layer[videoplayer_bg].safearea, false);
set(layer[videoplayer_bg].align, lefttop);
set(layer[videoplayer_bg].width, 100%);
set(layer[videoplayer_bg].height, 100%);
set(layer[videoplayer_bg].bgcolor, 0x000000);
set(layer[videoplayer_bg].bgalpha, 1);
set(layer[videoplayer_bg].bgcapture, true);
set(layer[videoplayer_bg].alpha, 0.0);
tween(layer[videoplayer_bg].alpha, 1.0, 0.2, default,
addlayer(videoplayer_plugin);
set(layer[videoplayer_plugin].parent, layer[videoplayer_bg]);
set(layer[videoplayer_plugin].align, center);
set(layer[videoplayer_plugin].loop, false);
set(layer[videoplayer_plugin].onclick, togglepause() );
set(layer[videoplayer_plugin].alpha, 0.0);
set(layer[videoplayer_plugin].onloaded, videoplayer_plugin_ready(%1) );
set(layer[videoplayer_plugin].onvideocomplete, videoplayer_close());
if('%2' != null, set(layer[videoplayer_plugin].posterurl,'%2'); );
if('%3' != null, set(layer[videoplayer_plugin].volume,%3); );
if(device.flash,
set(layer[videoplayer_plugin].url,'%SWFPATH%/plugins/videoplayer.swf');
,
set(layer[videoplayer_plugin].url,'%SWFPATH%/plugins/videoplayer.js');
);
);
);
addlayer(videoplayer_cls);
set(layer[videoplayer_cls].zorder, 1000);
set(layer[videoplayer_cls].keep, true);
set(layer[videoplayer_cls].url, '%SWFPATH%/img/cls.png');
set(layer[videoplayer_cls].x, '5%');
set(layer[videoplayer_cls].y, '5%');
set(layer[videoplayer_cls].width, '2%');
set(layer[videoplayer_cls].height, '5%');
set(layer[videoplayer_cls].align, 'righttop');
set(layer[videoplayer_cls].alpha, 0);
tween(layer[videoplayer_cls].alpha , 1 , 1);
set(layer[videoplayer_cls].onclick, videoplayer_close()
);
</action>
<!-- CC: 视频播放! -->
<action name="videoplayer_plugin_ready">
if(layer[videoplayer_plugin],
set(events[videoplayer_events].onresize, videoplayer_plugin_resize() );
set(layer[videoplayer_plugin].pausedonstart, true);
set(layer[videoplayer_plugin].onvideoready,
videoplayer_plugin_resize();
tween(alpha,1,0.5,default, ifnot(device.ios, play() ) );
);
layer[videoplayer_plugin].playvideo(%1);
);
</action>
<!-- CC: 窗口变化后,自适应! -->
<action name="videoplayer_plugin_resize">
div(aspect, layer[videoplayer_plugin].imagewidth, layer[videoplayer_plugin].imageheight);
mul(new_videowidth, stagewidth,1);
div(new_videoheight, new_videowidth, aspect);
mul(max_videoheight, stageheight, 1);
roundval(new_videowidth);
roundval(new_videoheight);
copy(layer[videoplayer_plugin].width, new_videowidth);
copy(layer[videoplayer_plugin].height, new_videoheight);
</action>
<!-- CC: 视频关闭!
视频关闭后,需要依据声音按钮状态,恢复或暂停背景与解说声音的播放!
不建议修改UI图片!
-->
<action name="videoplayer_close">
set(events.[videoplayer_events].name, null);
if(layer[videoplayer_plugin], layer[videoplayer_plugin].pause() );
set(layer[videoplayer_bg].onclick, null);
set(layer[videoplayer_cls].onclick , null);
removelayer(videoplayer_plugin);
removelayer(videoplayer_bg);
removelayer(videoplayer_cls);
tween(layer[videoplayer_plugin].alpha, 0, 1, default,
removelayer(videoplayer_plugin);
removelayer(videoplayer_bg);
removelayer(videoplayer_cls);
);
if(layer[voice_bj].url == 'img/voice_bj_on.png' , resumesound(bj),pausesound(bj));
if(layer[voice_speak].url == 'img/voice_speak_on.png', resumesound(scenesound) , pausesound(scenesound));
</action>
</krpano>
15、个人参考网址
大神们提供的官方解说
Krpano元素的一些解析
Krpano全景漫游开发手册
16、Krpano软件使用版本
krpano-1.19-pr16
百度网盘 - 下载
提取码:2i76