Interactive Control - Multi buttons

Posledním krůčkem k úplnému zvládnutí IC je zápis tzv. multiButtons. Jsou to tlačítka, která nespouštějí pouze jednu událost, ale celou sadu událostí. Události musíme vytvořit, sepsat si je (k tomu použijeme i trochu matematiky - ale ne hodně), a zapsat do multiButtons (dále jen MB).

Kam a jak zapisovat MB

Ta jako vždy, mají Multi Buttons své místo zápisu. Kam a jak zapisovat MB uvidíte zde na příkladu:

1
2<interactiveComponents minDist="7">
3 <multiButtons>
4 <mbutton ...>
5 <control .../>
6 <part .../>
7 ...
8 </mbutton>
9 </multiButtons>
10</interactiveComponents>
11

Jak vidíte, tak jako všechny komponenty je MB zapsáno do oddílu interactiveComponents, kde je vytvořena samostatná část multiButtons. Tato část odbasuje jednotlivá tlačítka, kde každé tlačítko má svůj index a atributy jako u běžného klikatelného tlačítka. Ovšem dále obsahuje každé tlačítko jeden kontrolní element, a x prvků na ovládání. nyní si popíšeme funkce samotného tlačítka a později i zápis prvků na ovládání.

Atributy pro tag mbutton

Atributy onMessage a offMessage

Tyto atributy se používají k definování hlášky, která se má zobrazit po najetí myši. V tomto případě se používá pouze onMessage, ovšem doporučuji také zapsat offMessage - jen pro jistotu. Oba tyto atributy musí obsahovat název definovaného textu v l10n v modDesc.xml.

Atribut name

Tento atribut slouží k zobecnění hlášek - pokud máme například 2 MB, tak pro obě můžeme vypisovat stejnou hlášku s tím, že místo name které se tam má doplnit, napíšeme do hlášky on/offMessage nějaký text a jako zástupný znak pro name použijeme %s. Ve výsledku tak máme třeba jednu onMessage a 2 tlačítka používající stejné hlášky akorát s jiným name. Atribut name obsahuje název definovaného textu v l10n v modDesc.xml.

Atribut size

Tento atribut obsahuje index tlačítka v i3d stroje. Objekt na tomto indexu musí mít nejaký vnořený objekt pro případné přidání efektů. Doporučuji použít tlačítko z archivu který si stáhnete s IC. Kolem tohoto indexu se tvoří klikatelná oblast definovaná v size.

Atribut mark

Tento atribut obsahuje index tlačítka v i3d stroje. Objekt na tomto indexu musí mít nejaký vnořrný objekt pro případné přidání efektů. Doporučuji použít tlačítko z archivu který si stáhnete s IC. Kolem tohoto indexu se tvoří klikatelná oblast definovaná v size. Pokud není mark obsažen v tagu, vytvoří se pouze událost. Takto vytvořenou událost můžete používat v jiném multiButtons.

Atribut synch

Atribut synch se používá pro multiplayer a může obsahovat hodnotu true a nebo false. Tento atribut není povinný a jeho základní hodnota je true. Pokud je hodnota false, pak není synchronizováno chování na MP - tzn.: jeden hráč může vidět něco spuštěné a druhý ne. Vhodné pro nějaké drobné funkce aby se nezatěžovala komunikace při MP.

Atribut isOutside

Tento atribut definuje, zda je tlačíko určeno pro použití mimo stroj a nebo pro použití v kabině. Pokud je false, tlačítko se zobrazí pouze tehdy, když jsme ve stroji. Pokud je true tak to zanmená, že aby se talčítko dalo spustit, tak musíme být v dosahu definovaném minDist. Tento atribut je nepovinný a jeho základní hodnota je false.

Tagy a jejich atributy pro mbutton

Jelikož MB obsahuje pouze dva druhy tagů (viz. příklad) a oba tagy mají stejné atributy, tak popíšu nejprve druhy tagů a poté jejich atributy.

Tag control

Tag control je nepoviný a používá se tam, kde potřebujeme synchronizovat dění dvou událostí. Pokud je nastaven správně, pak se ostatní události řídí podle stavu této akce. Pozor - nastavena musí být akce, která má jednoznačné určování stavu! Tento tag je jen jeden v celém mbutton.

Tagy part

Part tagy jsou tagy, které v sobě uchovávají informaci o tom, které tlačítka mají být spouštěna tímto mbutton. Aby mělo MB smysl, jsou přítomny minimálně dva part tagy. Počet těchto tagů není nijak omezen, taktéž typ události není nijak omezen.

Atribut type

Jak název vypovídá, tento atribut určuje typ akce kterou chceme spouštět. Možné typy jsou shodné s typy tlačítek pro IC. Tedy můžeme využít tyto typy: animation, button, monitor, visibility a mbutton. Typ musí být u každého tagu pro jedno MB.

Atribut index

Tento atribut je velice důležitý a ne vždy se povede zapsat napoprvé dobře. Nejedná se totiž o index v i3d ale o index na tlačítko. Abych to vysvětlil: tím jak tvoříme do IC různé prvky, vznikají události. Tyto události pak mají svůj index, podle pořadí v jakém jsou zapsány do xml. Problém je v odpočítání daného indexu. Když to hodně zjednoduším, tak do indexu se započítává vše, co má mark. Když mám tedy 5 animací, ovládaných přes IC, pak (protože se indexuje od 0) bude první položka mít index 0 a poslední 4. To samé u tlačítek, visibility a mbutton. Problém je u monitorů, kde se do indexu započítávají také tlačítka na zavření a otevření vrstev. Dám sem příklad, snad pochopíte z něj

Příklad na závěr

Jak jsem již miňoval, opět zde bude příklad abych vám ukázal jak multiButtons fungují. Doufám že z příkladu pochopíte logiku multiButtons.

1<interactiveComponents minDist="7" toggleStyle="1">
2 <windows>
3 <!-- 0 --><window synch="false" name="indikace_hydra_predni" size="0.3" animName="indikace_hydra_predni" onMessage="ic_component_open" offMessage="ic_component_close" />
4 <!-- 1 --><window synch="false" name="indikace_hydra_zadni" size="0.3" animName="indikace_hydra_zadni" onMessage="ic_component_open" offMessage="ic_component_close" />
5 </windows>
6 <buttons>
7 <!-- 0 --><button name="toggleFrontImplementUpDown" size="0.015" event="toggleFrontImplementUpDown" onMessage="cp_panel_off" offMessage="cp_panel_on" />
8 <!-- 1 --><button name="toggleBackImplementUpDown" size="0.015" event="toggleBackImplementUpDown" onMessage="cp_panel_off" offMessage="cp_panel_on" />
9 </buttons>
10 <visControls>
11 <!-- 0 --> <button name="indikace_hydra_predni_up" onMessage="cp_panel_on" offMessage="cp_panel_off" size="0.015" type="set" controlElem="0>6|0|15|0|5|0|0|3|9|6" defaultVis="true" >
12 <index index="0>6|0|15|0|5|0|0|3|9|2"/>
13 <index index="0>6|0|15|0|5|0|1|3|9|2"/>
14 <index index="0>6|0|15|0|5|0|0|3|9|6"/>
15 </button>
16 <!-- 1 --> <button name="indikace_hydra_predni_down" onMessage="cp_panel_on" offMessage="cp_panel_off" size="0.015" type="set" controlElem="0>6|0|15|0|5|0|0|3|9|7" defaultVis="false" >
17 <index index="0>6|0|15|0|5|0|0|3|9|3"/>
18 <index index="0>6|0|15|0|5|0|1|3|9|3"/>
19 <index index="0>6|0|15|0|5|0|0|3|9|7"/>
20 </button>
21 <!-- 2 --> <button name="indikace_hydra_zadni_up" onMessage="cp_panel_on" offMessage="cp_panel_off" size="0.015" type="set" controlElem="0>6|0|15|0|5|0|1|3|9|6" defaultVis="true" >
22 <index index="0>6|0|15|0|5|0|0|3|9|1"/>
23 <index index="0>6|0|15|0|5|0|1|3|9|1"/>
24 <index index="0>6|0|15|0|5|0|1|3|9|6"/>
25 </button>
26 <!-- 3 --> <button name="indikace_hydra_zadni_down" onMessage="cp_panel_on" offMessage="cp_panel_off" size="0.015" type="set" controlElem="0>6|0|15|0|5|0|1|3|9|7" defaultVis="false" >
27 <index index="0>6|0|15|0|5|0|0|3|9|0"/>
28 <index index="0>6|0|15|0|5|0|1|3|9|0"/>
29 <index index="0>6|0|15|0|5|0|1|3|9|7"/>
30 </button>
31 </visControls>
32 <multiButtons>
33
34 <!-- monitor - 1 -->
35 <mbutton name="toggleFrontImplementUpDown" mark="0>6|0|15|0|5|0|0|3|0" size="0.03" onMessage="toggleFrontImplementUpDown" offMessage="FoldFrontImplement_on" isOutside="false">
36 <part type="button" index="0"/>
37 <part type="animation" index="0"/>
38 <part type="visibility" index="0"/>
39 <part type="visibility" index="1"/>
40 </mbutton>
41 <mbutton name="toggleBackImplementUpDown" mark="0>6|0|15|0|5|0|0|3|1" size="0.03" onMessage="toggleBackImplementUpDown" offMessage="FoldBackImplement_on" isOutside="false">
42 <part type="button" index="1"/>
43 <part type="animation" index="1"/>
44 <part type="visibility" index="2"/>
45 <part type="visibility" index="3"/>
46 </mbutton>
47</interactiveComponents>

Související video

Skript ke stažení

  1. InteractiveControl (Farm-Share)