6. Переменные, передача параметров в экшены, условные операторы

kak sozdat panoramu. Работа с krpano: часть 6. Переменные, передача параметров в экшены, условные операторы.

В данной статье продолжится работа над ранее созданным виртуальным туром.

Но в этот раз более будут более подробно рассмотрены переменные и функции работы с ними.

Помимо этого  попробуем передать параметры в экшены, рассмотрим условные операторы, и продолжим тему структуры кода виртуального тура.


Типы переменных

 

С переменными мы ранее неоднократно сталкивались, когда присваивали одной из них значение true, false, числовое значение и т.д. Рассмотрим подробнее этот вопрос.

В krpano существуют 4 простых типа переменных:

* Boolean. Переменные данного типа могут принимать значения true (правда), false (ложь). В предыдущей статье мы передавали атрибуту keep значение как раз такого типа, тем самым регулируя область видимости отдельных элементов тура.

* Int (от слова Integer). Переменные этого типа могут принимать любые целочисленные значения. Например: 2, 0, -4.

Также переменные такого типа используются для обозначение цвета. Цвет задается в  виде шестнадцатеричного числа и оформляется в виде 0х123456.

0x-показывает что значение в шестнадцатиричной системе.

12-значение красной компоненты цвета

34-значение зеленой компоненты

56-значение синей компоненты.

Если  вам сложно ориентироваться в такой цветовой схеме, то вы можете узнать код интересуещего вас цвета зайдя в палитру фотошопа:

Как создать виртуальный тур в krpano. Шестнадцатеричный код цвета.

* Number. Переменные данного типа могут принимать любые дробные значения.

Например: 4.1, 0.16, -11,234.

* String. Переменные этого типа хранят строковое значение. В качестве значения может выступать любой последовательный набор символов.

Например: “строка1”, “str123”, “Несколько слов”.

Переменные данного типа широко применяются в krpano. Например мы ранее задавали значение выравнивания наподобие “center”, “topleft”. Все это значения строковой переменной.

 

Важно

Для того чтобы русскоязычные значения строковых переменных при просмотре виртуального тура не превращались в непонятные знакосимволы установите кодировку в Notepad++ в UTF-8 (без BOM).

Главное меню->Кодировка-> Преобразовать в UTF-8 без BOM

А также, чтобы в будущем Notepad++ автоматически делал это преобразование зайдите в:

Главное меню->Настройки-> Конфигурация -> Новый документ

Там в меню Кодировка установите UTF-8 без метки BOM, а также поставьте галку При открытие ANSI-файла.

 

Операции с переменными

 

Операции с числовыми переменными в krpano

 

В krpano нет возможности проводить операции с переменными привычным со школьных времен способом.  Т.е. в krpano нельзя написать запись вроде: Z=X+Y. Все основные операции со значениями проводятся при помощи функций.

Математическая функция (результат, значение 1, значение 2*);

Соответственно запись типа Z=X+Y  преобразуется в следующее схематичное выражение:

Сложить(Z,X,Y);

Если, например, надо просто к Z добавить значение X, то можно записать:

Сложить(Z,X);

Поэтому  в математических функциях значение 2 может отсутствовать (обозначена *).

В krpano существую следующие основные функции для переменных типа Int и Number:

Функция Описание Пример
add(variable,valueA,valueB*) Сложение значение двух переменных add(Z,X,Y);
sub(variable,valueA,valueB*) Вычитание sub(Z,X,Y);
mul(variable,valueA,valueB*) Умножение mul(Z,X,Y);
div(variable,valueA,valueB*) Деление div(Z,X,Y);
pow(variable,valueA,valueB*) Возведение в степень pow(Z,X,Y);

 

Если переменной необходимо просто установить какое либо значение, то для этого есть уже знакомая функция set.

Если же необходимо обратиться к значению переменной то применяется функция get.

Например:

 get(x) - будет выдано значение переменной х.

 

Важно

Если написать следующий код:

set (x, 4);

set (y, x);

То переменной y будет присвоено не 4, а строка “x” . Для того чтобы присвоить y именно значение переменной x необходимо написать:

set(y, get(x));

В то же время, нет особой необходимости в математических функциях дополнительно обращаться к значению переменных, можно вполне написать:

add(t, x, y);

В тоже время запись:

add(t, get(x), get(y));

также будет считаться правильной, но получается несколько более громоздкой.

 

Операции со строковыми переменными в krpano

 

Функция Описание Пример
txtadd(destination,txt1,txt2*,txt3*,…*) Складывает строки  txt1, txt2, txt3,… и
записывает результат в destination.
txtadd(t,”строка1”,”строка2”);
t будет присвоено значение “строка1строка2”
subtxt(dstvar,srcvar,startpos,len) Производит вычитание (вырезание) из строки
srcvar участка, начинающегося с позиции
startpos и длиной len.
Результат присваивается dstvar.
set(a, “строка12345″);
subtxt(t,a,0,7);
t будет присвоено значение “строка1″.

 

Текстовые стили

 

Модифицируем тур, который был получен в 5. Создание виртуального тура. Структура тура  так,  чтобы при старте панорамы в верхней части экрана появлялась надпись с названием местности.

Вывод текста задается при помощи фукции:

showtext(text,textstyle*)

text – выводимый текст;

textstyle – его стиль.

Текстовый стиль это набор параметров, которые будут применены к выводимому тексту.

Задается стиль при помощи тега textstyle. У данного тега множество атрибутов, рассмотрим только те, которыми будем пользоваться (остальные можно посмотреть на все том же сайтеkrpano.com)

<textstyle name="style1"
    font="Arial"
    fontsize="18"
    bold="true"
    italic="true"
    background="false"
    border="false"
    textcolor="0x000000"
    origin="top"
    blendmode="layer"
    showtime="2"
    fadetime="1"
    fadeintime="1"
    effect="glow(0xFFFFFF,0.85,4,4);"
  />

 

name=”style1″. Задается имя стиля

font=”Arial”. Название шрифта, при помощи которого будет выведена надпись

fontsize=”18″.  Задается размер шрифта.

bold=”true”. Выделяем жирным.

italic=”true”. Задаем выделение курсивом.

background=”false”. Показывает, нужно ли выводить под надписью однотонный фон. В нашем случае мы отменяем фон

border=”false”. Отменяем выделение текста рамкой.

textcolor=”0×000000″. Задает цвет шрифта. В данном случае здесь задан цвет черный.

origin=”top”.  По умолчанию origin=”cursor”, т.е. текст выводится над курсором. Мы здесь переопределяем значение, чтобы вывод текста происходил в верхней части экрана.

showtime=”2″. Задаем, чтобы текст на экране показывался 2 секунды.

fadetime=”1″. Время затухания текста в секундах.

fadeintime=”1″. Время появления текста.

effect=”glow(0xFFFFFF,0.85,4,4);”. Задаем для текста эффект – glow(свечение). В параметрах указываем цвет – белый, уровень непрозрачности, ширина свечения, сила свечения.

 

Теперь сделаем чтобы текст выводился при старте панорамы. Для этого в у обоих сцен, в тегах scene пропишем событие onstart

<scene name="panorama1" onstart="showtext('Байкал', style1);" >
<scene name="panorama2" onstart="showtext('Черекское ущелье ', style1);" >

 

Код вышеприведенного тега textstyle напишем в общем блоке.

Получится следующий код:

<krpano version="1.0.8.14" onstart="loadscene(panorama1);" >
 
  <plugin name="logo"
    align="righttop"  
    y="5"
    x="5" 
    url="%SWFPATH%/images/logo.png"
    alpha="0.5"
    keep="true"
    onover="tween(plugin[logo].alpha, 1.0, 0.5)"
    onout="tween(plugin[logo].alpha, 0.5, 0.5)"
    onclick="openurl('http://www.1panorama.ru',  _blank)"
  />
 
  <plugin name="intro"
    url="%SWFPATH%/images/intro.png"
    align="center"
    alpha="0"
    keep="true"
    onloaded="tween(plugin[intro].alpha,1,1)"
  />
 
  <plugin name="button"
    url="%SWFPATH%/images/button.png"
    align="center"
    keep="true"
    alpha="0"
    x="150" 
    y="-50"
    crop="0|0|24|24"
    onovercrop="0|24|24|24"
    ondowncrop="0|48|24|24"
    onloaded="tween(plugin[button].alpha,1,1)"
    onclick="hideintro();"
  />
 
  <plugin name="openfullscreen"   
    url="%SWFPATH%/images/buttoncontrol.png"
    align="bottomright"  
    keep="true"
    y="10"
    x="10" 
    visible="true" 
    crop="0|0|30|30" 
    onovercrop="0|30|30|30" 
    onclick="set(fullscreen,true); set(plugin[openfullscreen].visible,false); set(plugin[closefullscreen].visible,true);"
  />
 
  <plugin name="closefullscreen"   
    url="%SWFPATH%/images/buttoncontrol.png"
    align="bottomright"  
    keep="true"
    y="10"
    x="10" 
    visible="false" 
    crop="30|0|30|30" 
    onovercrop="30|30|30|30" 
    onclick="set(fullscreen,false); set(plugin[openfullscreen].visible,true); set(plugin[closefullscreen].visible,false);"
  />
 
  <plugin name="offrotate"   
    url="%SWFPATH%/images/buttoncontrol.png"
    align="bottomright"  
    keep="true"
    y="10"
    x="50" 
    visible="true" 
    crop="90|0|30|30" 
    onovercrop="90|30|30|30" 
    onclick="set(autorotate.enabled,false); set(plugin[onrotate].visible,true); set(plugin[offrotate].visible,false);"
  />
 
 
  <plugin name="onrotate"   
    url="%SWFPATH%/images/buttoncontrol.png"
    align="bottomright"  
    keep="true"
    y="10"
    x="50" 
    visible="false" 
    crop="60|0|30|30" 
    onovercrop="60|30|30|30" 
    onclick="set(autorotate.enabled,true); set(plugin[onrotate].visible,false); set(plugin[offrotate].visible,true);"
  />
 
  <autorotate enabled="true"/>
 
  <textstyle name="style1"
    font="Arial"
    fontsize="18"
    bold="true"
    italic="true"
    background="false"
    border="false"
    textcolor="0x000000"
    origin="top"
    showtime="2"
    fadetime="1"
    fadeintime="1"
    effect="glow(0xFFFFFF,0.85,4,4);"
  />  
 
  <action name="hideintro">
    tween(plugin[intro].alpha,0,1); 
    set(plugin[intro].enabled, false); 
    tween(plugin[button].alpha,0,1); 
    set(plugin[button].enabled, false);
  </action>
 
 
  <scene name="panorama1" onstart="showtext('Байкал', style1);" >
    <view hlookat="0" vlookat="0" fovtype="MFOV" fov="90" maxpixelzoom="1.0" fovmax="120" limitview="auto" />
    <preview url="%SWFPATH%/panoramas/panorama1.tiles/preview.jpg" />
    <image>
      <cube url="%SWFPATH%/panoramas/panorama1.tiles/pano_%s.jpg" />
    </image>
    <hotspot name="spot1-2" url="%SWFPATH%/images/hotspot.png" 
          ath="-105" atv="-4" 
          crop="0|0|26|26" onovercrop="0|26|26|26"
          onclick="loadscene(panorama2);"
          />
    <lensflare name="lf0" set="DEFAULT" visible="true"  ath="-138.7916" atv="-50.7045" size="0.80" blind="0.60" blindcurve="4.00" />
  </scene>  
 
  <scene name="panorama2" onstart="showtext('Черекское ущелье ', style1);" >
    <view hlookat="0" vlookat="0" fovtype="MFOV" fov="90" maxpixelzoom="1.0" fovmax="120" limitview="auto" />
    <preview url="%SWFPATH%/panoramas/panorama2.tiles/preview.jpg" />
    <image>
      <cube url="%SWFPATH%/panoramas/panorama2.tiles/pano_%s.jpg" />
    </image>
    <hotspot name="spot2-1" url="%SWFPATH%/images/hotspot.png" 
          ath="0" atv="0" 
          crop="0|0|26|26" onovercrop="0|26|26|26"
          onclick="loadscene(panorama1);"
          />
  </scene>  
 
</krpano>

 

Теперь если запустить виртуальный тур, то в верхней части экрана можно увидеть название панорам.

 

Передача параметров в экшены

 

Часто возникает необходимость в экшен передать параметр, с которым будет потом вестись работа внутри него.

Модифицируем код так , чтобы каждая сцена начинала свой показ с определенного угла.

В сценах мы уже использовали тег view  с атрибутами hlookat (стартовый горизонтальный угол) и vlookat (стартовый вертикальный угол).

Их можно изменить непосредственно в самих сценах, но мы поступим немного иначе, и будем задавать значение внутри отдельного экшена. Данный экшен как раз и будет тем самым “Стартовым экшеном сцен”, который был показан в структуре кода в 5-ой части цикла уроков по krpano.

Напишем пустой экшен, и разместим его перед сценами. Фактически его можно разместить и перед плагинами, но удобнее когда экшен старта сцен находится поблизости непосредственно от самих сцен.

<action name="start_scene">
 
  </action>

 

Для того чтобы передать в экшен параметр, надо при вызове в скобках поместить значение этого параметра.

Например:

start_scene(41, 12, “пример передачи строковой переменной”);

Т.е. запись полностью аналогична вызову функций. Для того чтобы считать переданные параметры внутри экшена используется запись вида:

%номер_параметра

Т.е. в данном примере.

%1 внутри экшена будет равен 41,

%2 = 12

%3 =”пример передачи строковой переменной”

Значение с процентами могут применяться также как и обычные переменные. Формат работы с ними аналогичен.

Например:

set(x, %2);

В результате этой записи переменной х будет присвоено значение второго передаваемого параметра, т.е. 12.

 

В нашем туре мы будем передавать экшену значения начальных углов сцены, которые потом будем присваивать атрибутам тега view.

Таким образом экшен будет выглядеть следующим образом:

<action name="start_scene">
    set(view.hlookat, %1);
    set(view.vlookat, %2);
  </action>

 

Вызов экшена допишем в событие сцены onstart.

Для первой сцены событие будет выглядеть следующим образом (значения стартовых углов заданы произвольно):

onstart=”showtext(‘Байкал’, style1); start_scene(90,0);”

Для второй:

onstart=”showtext(‘Черекское ущелье ‘, style1); start_scene(100,0);”

 

Теперь если запустить виртуальный тур, то можно заметить что начальные углы сцены изменились.

 

Условные операторы

 

Как и в “больших” языках программирования в krpano существуют так называемые условные операторы.

В данных операторах, выполнение участка кода зависит в зависимости от значения условия. Если условие выполняется, то далее krpano переходит к одному участку кода. Если нет, то к другому.

Как создать виртуальный тур на krpano. Работа условного оператора.

В качестве условий чаще всего выступает сравнение одной переменной с другой.

Например:

Пусть у нас x=5, y=10.

В качестве условия зададим x<y

В данном случае условие выполняется, в результате выполняется код 1.

Если же изначально было бы у нас x=15, y=10, то условие бы не выполнялось (т.е.  условие x было бы ложно, а именно  false), поэтому бы выполнялся код 2.

В krpano условный оператор задается следующим образом:

if(condition, then-actions, else-actions*)

где:

condition – условие;

then-actions – код, который выполняется если условие правдиво;

else-actions – код, который выполняется если условие ложно.

Т.е. если перевести вышепоказанный пример в такую конструкцию, то получится следующее

if(x<y, код1, код2);

 

А теперь небольшое задание: как сделать такое условие, которое независимо от начальных данных всегда правдиво, или всегда ложно?
Ответ будет дан в конце этого раздела.

 

В качестве условий, как выше писалось чаще всего выступает сравнение переменных. Для этого используются следующие операторы:

“<” – меньше

“<=”- меньше либо равно

“>” – больше

“>=” – больше либо равно

“==” – равно. Здесь стоит именно два знака “равно”. Такой формат записи пришел из “больших” языков программирования, чтобы отделить просто “=” (т.е. присваивание значения), от сравнения на равенство.

В krpano иногда можно забыть, и поставить один знак “равно” вместо двух, что приведет к тому что условный оператор не будет работать. Поэтому проверяйте ваш формат записи условия.

“!=” – не равно.

 

Но с использованием знаков “больше\меньше” в krpano есть определенные ньюансы.

Эти же знакосимволы используются и при оформление тегов и применив сравнение на “больше\меньше” окрашивание кода в notepade++ сбивается (оригинальный xml-формат вне описания тегов такие знаки не поддерживает). А это не сильно приятно, как визуально, так и практически (зачастую можно по цвету определить где произошла ошибка).

Поэтому в krpano были введено альтернативное написание знаков “больше\меньше”.

Вместо “<” – “LT” (от выражения “Lower Than”).

Вместо “>” – “GT” (Greater Than).

Вместо “<=” – “LE”  (Lower or Equal than).

Вместо “>=” – “GE” (Greater or Equal than).

Обычные знаки “больше\меньше” в krpano также работают, но их использовать не рекомендуется.

Пример:

Нахождение наибольшего числа среди двух значений.

Необходимо сравнить значение переменных x и y, после чего переменной t присвоить наибольшее значение.

Код, который решает такую задачу в krpano будет выглядеть так:

if(x GT y, set(t, get(x)), set(t, get(y)));

 

А теперь ответ на вышеобозначенное задание.

Условие, которое всегда правдиво это собственно и есть true, а которое ложно - false. Поэтому если, например, записать:

if( true, set(t, get(x)), set(t, get(y)));

то всегда и при любых случаях  переменной t  будет присвоено значение переменной x.

 

Оптимизация работы с krpano и настройка тура

 

Создание стартового экшена сцен

 

Тема оптимизации работ чрезвычайно обширна и охватить ее в небольшом разделе невозможно. Можно сказать, что это некая “философия структуризации и работы с кодом” :) .

Здесь же будут показан одна из концепций и ее реализация простым способом.

Наверное, всем хотелось бы облегчить себе работу в программировании виртуального тура. Поэтому попробуем организовать код так, чтобы отдельные его участки можно было применять в новых турах. Т.е. попробуем создать универсальные отдельные элементы тура. Тогда добавление функционала в новый тур будет фактически заключаться в простом копировании участка кода.

В данном туре  сделаем так, чтобы с минимальными доработками можно было добавлять в новый тур функционал: название сцены сверху экрана и задание стартовых углов просмотра. Помимо этого сделаем более удобную настройку элементов тура.

Для начала изменим код экшена start_scene.

В качестве передаваемого параметра теперь у нас будет только номер сцены (1 или 2).

В самом экшене будем считывать параметр и в зависимости равен он 1 или 2 корректировтаь параметры сцены. Это легко можно сделать при помощи условного оператора.

Теперь событие старта сцены вместо:

onstart=”showtext(‘Байкал’, style1); start_scene(90,0);”

будет:

onstart=”start_scene(1);”

Во второй же сцене вместо:

onstart=”showtext(‘Черекское ущелье ‘, style1); start_scene(100,0);”

запишем:

onstart=”start_scene(2);”

 

Теперь же в самом экшене будем сравнивать значение %1 (т.е. передаваемого параметра) и в зависимости от его значение настраивать сцену.

Экшен примет вид:

<action name="start_scene">
    if(%1==1, showtext('Байкал', style1);
        set(view.hlookat, 90);
        set(view.vlookat, 0);
    );
    if(%1==2, showtext('Черекское ущелье ', style1); 
        set(view.hlookat, 100);
        set(view.vlookat, 0);
    );
  </action>

 

Т.е. сначала мы сравниваем передаваемый параметр с 1, и если он ему равен, то выполняется вывод надписи и устанавливаются начальные углы сцены.

Обратите внимание, что все 3 функции внутри if  записаны через “;”. Если условие правдиво, то все 3 функции последовательно срабатывают. Код, который выполняется если условие ложно в данном случае мы не записали.

Если передаваемый параметр равен 2, то производится настройка сцены исходя из заданых значений для  второй сцены.

Два оператора if в данном случае можно объединить в 1.

Получится:

if(%1==1, showtext('Байкал', style1);
        set(view.hlookat, 90);
        set(view.vlookat, 0);
        , 
        showtext('Черекское ущелье ', style1); 
        set(view.hlookat, 100);
        set(view.vlookat, 0);
    );

 

Тут получится что если передаваемый параметр равен 1, то применяем настройки для первой сцены, иначе – для второй.

Коды “если условие правдиво” и “если условие ложно” разделен “,”. Внутри же этих кодов функции разделены “;”.

Но вернемся к первому варианту записи, потому как он более универсален, и позволяет легко добавить обработку параметров если сцен больше двух.

 

Вывод значение настроек в отдельный экшен.

 

А теперь попробуем создать экшен настроек (этот экшен у нас обозначен в структуре кода в уроке 5) и вывести туда все настройки сцен виртуального тура. Это позволит более удобно их редактировать.

Сразу после закрытия тега textstyle создадим экшен scene_options и пропишем туда переменные со значениями настроек сцен.

<action name="scene_options">
    set(scene1_h, 90);
    set(scene1_v, 0);
    set(scene1_text, "Байкал");
    set(scene2_h, 90);
    set(scene2_v, 0);
    set(scene2_text, "Черекское ущелье");
  </action>

 

Здесь мы последовательно для каждой сцены задали значения переменным: начальный горизонтальный угол, начальный вертикальный угол и текст, который надо выводить в верхней части экрана.

Данный экшен мы будем вызывать сразу после старта тура (только тура а не сцены), ведь установить настройки виртуального тура это первое что необходимо сделать при его запуске.

Поэтому изменим самую первую строку скрипта с

<krpano version=”1.0.8.14″ onstart=”loadscene(panorama1);” >

на

<krpano version=”1.0.8.14″ onstart=”scene_options();” >

А загрузку первой панорамы поместим в экшен scene_options.

Получится:

<action name="scene_options">
    set(scene1_h, 90);
    set(scene1_v, 0);
    set(scene1_text, "Байкал");
    set(scene2_h, 90);
    set(scene2_v, 0);
    set(scene2_text, "Черекское ущелье");
    loadscene(panorama1);
  </action>

 

В экшене start_scene изменим все прописанные значение настроек на обращения к значениям новых переменных.

<action name="start_scene">
    if(%1==1, showtext(get(scene1_text), style1);
      set(view.hlookat, get(scene1_h));
      set(view.vlookat, get(scene1_v));
    );
    if(%1==2, showtext(get(scene2_text), style1); 
      set(view.hlookat, get(scene2_h));
      set(view.vlookat, get(scene2_v));
    );
  </action>

 

В результате получится следующий код виртуального тура:

<krpano version="1.0.8.14" onstart="scene_options();" >
  <plugin name="logo"
    align="righttop"  
    y="5"
    x="5" 
    url="%SWFPATH%/images/logo.png"
    alpha="0.5"
    keep="true"
    onover="tween(plugin[logo].alpha, 1.0, 0.5)"
    onout="tween(plugin[logo].alpha, 0.5, 0.5)"
    onclick="openurl('http://www.1panorama.ru',  _blank)"
  />
 
  <plugin name="intro"
    url="%SWFPATH%/images/intro.png"
    align="center"
    alpha="0"
    keep="true"
    onloaded="tween(plugin[intro].alpha,1,1)"
  />
 
  <plugin name="button"
    url="%SWFPATH%/images/button.png"
    align="center"
    keep="true"
    alpha="0"
    x="150" 
    y="-50"
    crop="0|0|24|24"
    onovercrop="0|24|24|24"
    ondowncrop="0|48|24|24"
    onloaded="tween(plugin[button].alpha,1,1)"
    onclick="hideintro();"
  />
 
  <plugin name="openfullscreen"   
    url="%SWFPATH%/images/buttoncontrol.png"
    align="bottomright"  
    keep="true"
    y="10"
    x="10" 
    visible="true" 
    crop="0|0|30|30" 
    onovercrop="0|30|30|30" 
    onclick="set(fullscreen,true); set(plugin[openfullscreen].visible,false); set(plugin[closefullscreen].visible,true);"
  />
 
  <plugin name="closefullscreen"   
    url="%SWFPATH%/images/buttoncontrol.png"
    align="bottomright"  
    keep="true"
    y="10"
    x="10" 
    visible="false" 
    crop="30|0|30|30" 
    onovercrop="30|30|30|30" 
    onclick="set(fullscreen,false); set(plugin[openfullscreen].visible,true); set(plugin[closefullscreen].visible,false);"
  />
 
  <plugin name="offrotate"   
    url="%SWFPATH%/images/buttoncontrol.png"
    align="bottomright"  
    keep="true"
    y="10"
    x="50" 
    visible="true" 
    crop="90|0|30|30" 
    onovercrop="90|30|30|30" 
    onclick="set(autorotate.enabled,false); set(plugin[onrotate].visible,true); set(plugin[offrotate].visible,false);"
  />
 
 
  <plugin name="onrotate"   
    url="%SWFPATH%/images/buttoncontrol.png"
    align="bottomright"  
    keep="true"
    y="10"
    x="50" 
    visible="false" 
    crop="60|0|30|30" 
    onovercrop="60|30|30|30" 
    onclick="set(autorotate.enabled,true); set(plugin[onrotate].visible,false); set(plugin[offrotate].visible,true);"
  />
 
  <autorotate enabled="true"/>
 
  <textstyle name="style1"
    font="Arial"
    fontsize="18"
    bold="true"
    italic="true"
    background="false"
    border="false"
    textcolor="0x000000"
    origin="top"
    showtime="2"
    fadetime="1"
    fadeintime="1"
    effect="glow(0xFFFFFF,0.85,4,4);"
  />  
 
  <action name="scene_options">
    set(scene1_h, 90);
    set(scene1_v, 0);
    set(scene1_text, "Байкал");
    set(scene2_h, 90);
    set(scene2_v, 0);
    set(scene2_text, "Черекское ущелье");
    loadscene(panorama1);
  </action>
 
  <action name="hideintro">
    tween(plugin[intro].alpha,0,1); 
    set(plugin[intro].enabled, false); 
    tween(plugin[button].alpha,0,1); 
    set(plugin[button].enabled, false);
  </action>
 
  <action name="start_scene">
    if(%1==1, showtext(get(scene1_text), style1);
        set(view.hlookat, get(scene1_h));
        set(view.vlookat, get(scene1_v));
    );
    if(%1==2, showtext(get(scene2_text), style1); 
        set(view.hlookat, get(scene2_h));
        set(view.vlookat, get(scene2_v));
    );
  </action>
 
  <scene name="panorama1" onstart="start_scene(1);" >
    <view hlookat="0" vlookat="0" fovtype="MFOV" fov="90" maxpixelzoom="1.0" fovmax="120" limitview="auto" />
    <preview url="%SWFPATH%/panoramas/panorama1.tiles/preview.jpg" />
    <image>
      <cube url="%SWFPATH%/panoramas/panorama1.tiles/pano_%s.jpg" />
    </image>
    <hotspot name="spot1-2" url="%SWFPATH%/images/hotspot.png" 
          ath="-105" atv="-4" 
          crop="0|0|26|26" onovercrop="0|26|26|26"
          onclick="loadscene(panorama2);"
          />
    <lensflare name="lf0" set="DEFAULT" visible="true"  ath="-138.7916" atv="-50.7045" size="0.80" blind="0.60" blindcurve="4.00" />
  </scene>  
 
  <scene name="panorama2" onstart="start_scene(2);" >
    <view hlookat="0" vlookat="0" fovtype="MFOV" fov="90" maxpixelzoom="1.0" fovmax="120" limitview="auto" />
    <preview url="%SWFPATH%/panoramas/panorama2.tiles/preview.jpg" />
    <image>
      <cube url="%SWFPATH%/panoramas/panorama2.tiles/pano_%s.jpg" />
    </image>
    <hotspot name="spot2-1" url="%SWFPATH%/images/hotspot.png" 
          ath="0" atv="0" 
          crop="0|0|26|26" onovercrop="0|26|26|26"
          onclick="loadscene(panorama1);"
          />
  </scene>  
 
</krpano>

 

Таким образом у нас получился код тура где все его настройки сосредоточены в одном экшене и теперь можно легко менять начальные углы обзора, название сцены, задавать какую сцену необходимо грузить первой.

В будущем настройки лучше также выносить в этот экшен, чтобы можно было быстро при необходимости перенастроить виртуальный тур.

Появилась также некая универсализация кода. Теперь можно легко добавлять новые сцены в тур, прописав только в событие старта сцены экшен  start_scene(номер сцены) и немного модифицировав сам start_scene под изменившееся количество цен.

Если же требуется сделать новый виртуальный тур и он содержит такое же количество сцен, то скопировав с этого тура экшены start_scene и scene_options и прописав их вызов – можно быстро добавить текущий функционал в новый тур. Что быстрее, чем заново писать код этого функционала.

Таким образом за счет большей универсальности кода достигается оптимизация работ над виртуальными турами.


Все статьи по работе с krpano


Остались вопросы?


Задайте их на форуме