Kolor – KRPano – 手動添加熱點,並觸發外部 JavsScript

Kolor 產出 HTML5 以後,整包資料夾基本上會有兩種文件

  • indexdata/
  • index.html

因為 Kolor 的核心採用 KRPano 的環景系統,使用 HTML5 的時候會呼叫 KRPano 的 JavaScript 去讀取 XML 設定檔。我們的所有熱點(hotspot),包含替換場景的熱點,都是設定在 XML。所以我們若要增加、替換熱點,幾乎可以不需要從 Kolor 重新跑介面化的流程做產出的行為。

熱點與動作設定的位置

打開 indexdata/index.xml ,找到你的場景名稱的註解。通常會長這樣

<!-- **** @PanoName="大清來治" @PanoFile="....jpg" **** -->
<!-- **** Width="11712px" Height="5856px" **** -->

<scene name="pano59"
       heading="0"
       group="panogroup84"
       thumburl="%FIRSTXML%/pano_59/thumbnail.jpg"
       backgroundsound=""
       backgroundsoundloops="0"
       haspolygons="false"
       titleid="pano59_title"
       descriptionid=""
       multires="true"
       planar="false"
       full360="true"
       video="false"
       seen="false">
  • @PanoName 會出現你設定的場景名稱
  • screen 場景標籤,將所有屬性與動作包圍起來。一個 screen 代表一個場景。
    • name 場景的唯一名稱

我們可以理解『場景編號 pano59 』的顯示名稱叫做『大清來治』。這個對應的名稱,可以參考 indexdata/index_messages_zh.xml 中的翻譯,可以看到

<data name="zh_pano59_title"><![CDATA[大清來治]]></data>

 

手動添加熱點

在 index.xml 找到你要的場景下方,找到這個註解

<!-- **** 3 Point Spots **** -->
  • 代表這個場景有3個熱點,通常是由 Kolor 自動計算所編譯出來的

環景設計師可能透過 Kolor 產出整批檔案,我因為要添加尋寶遊戲的寶藏,每天位置都不一樣,如果每次都要透過 Kolor 替換熱點的位置會很麻煩,所以在這裡需要手動添加。

先來理解我們看到可能已經存在的熱點設定:

  <hotspot name="spotpoint873"
           ath="70.267310" atv="4.499996"
           style="IconDefaultPointSpotStyle"
           tag="point"
           descriptionid=""
           onclick="onclickspotpoint873"
           />
  <hotspot name="spotpoint873" devices="flash" zorder="3"/>
  <hotspot name="spotpoint873" devices="html5" zorder="3" zorder2="1"/>
  <action name="onclickspotpoint873">
        mainloadscene(pano58);lookat(-91.800000, 0.900000, 90.000000);
  </action>
  • hotspot
    • name 代表這個熱點的唯一名稱
    • ath 座標
    • atv 座標
    • style 對應顯示圖片的樣式名稱。設定在 indexdata/index_skin.xml
    • onclick 點擊熱點後觸發的動作名稱
    • tooltip 滑鼠在上面的提示文字
  • action
    • name 代表這個動作的唯一名稱
    • 注意,內容不是寫 JS,而是寫 KRPano 的語言喔!如果要呼叫JS,務必透過 KRPano 的轉接

當點擊熱點『spotpoint873』,會讀取標籤『onclickspotpoint873』內的動作。所以如果我們要手動增加一個,那就複製這段,建議貼在所有的預設熱點之後,避免維護上的麻煩。

  <!-- 金球 開始 -->
    <hotspot name="ball_1"
             ath="270" atv="57"
             style="Icon金球"
             tag="point"
             descriptionid=""
             onclick="onclick_ball_1"
             tooltip="ball_tooltip"
             />
    <hotspot name="ball_1" devices="flash" zorder="3"/>
    <hotspot name="ball_1" devices="html5" zorder="3" zorder2="1"/>
    <action name="onclick_ball_1">
          js(ball_find('ball_1'))
    </action>
  <!-- 金球 結束 -->

點擊熱點,會透過 KRPano 的 JavaScript API 『js()』去呼叫外部的 JavaScript 。所以我們的 JavaScript 可以這樣來接收點擊的金球編號:

function ball_find(ball_id) {
  alert(ball_id);
}

因為我的提示字元的屬性 tooltip 設定為 ball_tooltip,所以打開 indexdata/index_messages_zh.xml 添加在 <krpano> 內部,命名規則設定如

  <data name="zh_ball_tooltip"><![CDATA[你找到一顆金球了]]></data>

金球編號『ball_1』的樣式,會讀取 indexdata/index_skin.xml 中名為 『Icon金球』的樣式標籤。所以打開 indexdata/index_skin.xml 添加在 <krpano version=”1.19″> 後方

<?xml version="1.0" encoding="UTF-8"?>
<krpano version="1.19">
  
  <!-- Spot Style - 金球 開始 -->
  <style name="Icon金球"
         url="%FIRSTXML%/spots/hotspot_direction_big_sequence_user_defaultpoint12.png"
         visible="false"
         frame="0"
         lastframe="10"
         framewidth="80"
         frameheight="80"
         stopspotsequence="false"
         crop="0|0|80|100"
         onloaded="startspotanimation(0.1);"
         onhover="onhoverIcon金球"
         onout="onoutIcon金球"
         />

  <action name="onhoverIcon金球">
    showtooltip('hotspot');
  </action>
  <action name="onoutIcon金球">
    hideTooltip();
  </action>  
  <!-- Spot Style - 金球 結束 --> 

  <!-- Spot Style - Default Point Spot Style 預設樣式,不要去動到囉 --> 
  • style
    • url 顯示的圖片位置
    • visible 預設是否顯示
    • onhover 滑鼠移入
    • onout 滑鼠移出
  • action
    • name 提供給 style[onhover] 的動作

 

環景進入前後,讓熱點從隱藏到顯示

我的環景使用魚眼效果進入畫面。所以當魚眼效果轉換到正常顯示的這段期間,熱點是隱藏的。等到正常顯示後,該熱點才會顯示。

在標籤 screen 中可以看到例如這樣的標籤,我們增加對金球 ball_1 的動作

  <action name="hidepanopointspots">
    set(hotspot[spotpoint873].visible, false);
    set(hotspot[spotpoint874].visible, false);
    set(hotspot[spotpoint875].visible, false);
    set(hotspot[ball_1].visible, false); <!-- 先隱藏 -->
  </action>
  <action name="showpanopointspots">
    set(hotspot[spotpoint873].visible, true);
    set(hotspot[spotpoint874].visible, true);
    set(hotspot[spotpoint875].visible, true);
    set(hotspot[ball_1].visible, true); <!-- 再顯示 -->
  </action>

 

這樣基本上就完成手動添加熱點的動作囉!

發表迴響