krpano 项目自制 - 内测可用 - 喜欢分享

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

17、目录说明

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值