Arminair
 
*
Witamy, Gość. Zaloguj się lub zarejestruj. Styczeń 17, 2022, 00:21:27


Zaloguj się podając nazwę użytkownika, hasło i długość sesji


Strony: [1]   Do dołu
  Drukuj  
Autor Wątek: XML - opis języka i zastosowanie w FG - SP-WKA  (Przeczytany 5142 razy)
0 użytkowników i 1 Gość przegląda ten wątek.
Wojciech Kaczmarski (SP-WKA)
Administrator
*****
Offline Offline

Wiadomości: 96



Zobacz profil
« : Grudzień 06, 2011, 10:41:03 »

XML - opis języka i zastosowanie w FG
autor: SP-WKA

Poradnik skierowany do każdego zainteresowanego ulepszaniem i modyfikowaniem samolotów. Jeżeli miałeś/aś kontakt z językiem HTML, kurs nie sprawi ci trudności, możesz pominąć część 1. Z góry zakładam, że (nie obraź się) nie znasz za dobrze angielskiego, bo np. katowali cię w szkole rosyjskim, jeżeli moje założenie jest złe, odsyłam cię do folderu ~FlightGear/data/Docs w którym znajdziesz od groma informacji, nie tylko na temat XMLa. Do edytowania plików (i to nie tylko XML) polecam Notepad++ link do pobrania. Jest to ulepszony windowsowski notatnik z różnymi 'bajerami', które bardzo się przydają (np. podświetlenie składni języka, numerowanie linii)



1. Struktura pliku .xml
TAG - słowo kluczowe w nawiasach trójkątnych np. <boeing> <rysiek> <warstwa>. To przykłady trzech tagów. Słowo kluczowe, nazwa - mogą zawierać cyfry, litery, podkreślniki. Zabronionymi znakami są: &, <, >. Należy je zamieniać na odpowiednio: &amp; $lt; &gt;

Struktura pliku przypomina drzewo. Język XML jest podobny do HTML. Z jedną różnicą: tutaj nazwy tagów tworzymy sami. Żadnych restrykcji: w HTMLu tagi były narzucone z góry np. <h8> <body> czy . Są jakby dwa rodzaje tagów: rozpoczynające i kończące. Tag rozpoczynający to po prostu słowo kluczowe w nawiasach (patrz wyżej), tag kończący różni się tym, że przed słowem kluczowym stawiamy znak "/" np. </samolot>. Fragment pliku XML:
[
code]
<samolot>
   <nazwa>boeing 777</nazwa>
   <silniki>2</silniki>
   <fajny>tak</fajny>
</samolot>
[/code] Tutaj widzimy 4 tagi: 'samolot', 'nazwa', 'silniki' i 'fajny'. Tag <samolot> jest nadrzędny dla trzech pozostałych. Jest odpowiednikiem folderu. Spójrzmy na bardziej skomplikowany przykład:
Kod:
<samolot>
<nazwa>boeing 777</nazwa>
<silniki>2</silniki>
<fajny>tak</fajny>
<info>
<callsign>ARA1001</callsign>
<pilot>SP-LEC</pilot>
</info>
</samolot>
Do tego kodu dodałem tag <info>, który jest nadrzędny dla <callsign> i <pilot>. Jest jednak podrzędny dla tagu <samolot>. Dla przejrzystości kodu, stosuje sie tabulatory. Powyższy kod jest rownoważny z tym:
Kod:
<samolot><nazwa>boeing 777</nazwa><silniki>2</silniki><fajny>tak</fajny><info><callsign>ARA1001</callsign><pilot>SP-LEC</pilot></info></samolot>
Dla maszyny to nie ma różnicy. Który jest jednak bardziej czytelny dla człowieka?
Komentarze umieszcza się w znacznikach <!-- --> np. <!--komentarz ble ble ble ble--->. Komentarz nie musi mieścić się w jednej linii.
Kod:
<!--
to jest komentarz
dluzszy niz jedna linia
nie ma zadnego problemu z tym
--->



2. Zastosowanie w FlightGear
Gra wykorzystuje pliki XML do wielu rzeczy: wyświetlania obrazków na panelach (wyświetlaczach) w kokpitach, obracania ich, przesuwania, ustawiania obindowań klawiatury (czyli to, co się stanie po wciśnięciu danego klawisza, plik keyboard.xml w folderze ~FG/data/), ustawiania warunków odtworzenia jakiegoś dźwięku, jego natężenia i innych ciekawych parametrów. To tylko garść przykładów.  Opisując konkretne zastosowania języka XML będę się skupiał na poszczególnych plikach 'składowych' samolotu. Różne funkcje XML zobaczymy w różnych plikach.
Wejdź teraz do folderu ~FlightGear\data\Aircraft\b1900d\Models, jest to folder z modelami 3d samolotu B1900D (pozdro Radio22!). Widzisz, że do każdego pliku .ac (tu jest model 3d, z takich kilku modeli składa się samolot) jest dołączony plik XML. Tam znajdują się wszystkie informacje na temat tego, jak i czy reagują na kliknięcia pokrętła, dźwignie, przyciski i tym podobne elementy kokpitu/samolotu. Teraz zajrzyj do ~FlightGear\data\Aircraft\b1900d\Sound. Tu znajdziemy pliczek informujący grę, kiedy i jakie dźwięki ma odtwarzać. Więcej o tym napiszę w kolejnych rozdziałach. Powiem jeszcze tylko, że TO NIE JEST TAKIE TRUDNE i że wszystko jest trudne zanim nie stanie się proste.



3. Jeszcze kilka słów o tagach
We wszystkich (lub co najmniej w większości) plików XML można spotkać takie same nazwy tagów, niezależnie od tego czy to jest plik z obindowaniami klawiatury czy obrót obrazka na wyświetlaczu. Są to narzucone przez grę słowa kluczowe których szuka w pliku XML. Jest to jedyna restrykcja, troszkę podobna do HTMLa. Te tagi będę nazywał dalej 'uniwersalnymi'.

3.1. Uniwersalne tagi
a) Tag <condition> i podrzędne:
Spójrz jeszcze raz na plik ~FlightGear\data\Aircraft\b1900d\Sound\b1900d-sound.xml W pierwszych liniach zobaczysz coś takiego:
Kod:
            <condition>
                <greater-than>
                    <property>controls/engines/engine[0]/condition</property>
                    <value>0.1</value>
                </greater-than>
            </condition>
Tag <condition> i wszystkie podrzędne dla niego są uniwersalne. Mozna je spotkać nie tylko w konfiguracji dźwięku. Condition oznacza warunek. W tych słowach kluczowych umieszcza się warunki do spełnienia, można je łączyć operatorami logicznymi. Jednak najpierw szkieletu dla tagu <condition>:
Kod:
<condition>
warunek1
warunek2
...
warunekN
</condition>
Domyślnie wszystkie warunki połączone są logicznym 'LUB', więc jeżeli choćby jeden warunek był prawdziwy, cały condition też będzie. Odsyłam to do mojego wstępu do Nasala. Tam są wyjaśnione spójniki logiczne (AND, OR, NOT). W XMLu odpowiednikami tych funktorów są:
--->AND
Kod:
<condition>
<and>
warunek1
warunek2
...
warunekN
</and>
</condition>
Myślę, że po przeczytaniu poradnika do Nasala, ten zapis nie będzie wymagał dodatkowego komentarza. Condition 'zadziała' gdy jednocześnie każdy warunek będzie spełniony.
--->OR
Kod:
<condition>
<or>
warunek1
warunek2
...
warunekN
</or>
</condition>
--->NOT
Kod:
<condition>
<not>
warunek
</not>
</condition>
NOT jest operatorem jednoargumentowym, czyli można go stosować tylko dla jednego warunku.
--->OPERATORY RELACJI
Kod:
<condition>
<not-equals>
<property>/aaa/bbb/zmienna</property>
<value>123<value>
</not-equals>
</condition>
<!---powyzszy condition spelniony dla wartosci zmiennej w tagach PROPERTY nierównej 123--->

<condition>
<equals>
<property>/aaa/bbb/zmienna</property>
<value>dupa<value>
</equals>
</condition>
<!---powyzszy condition spelniony dla wartosci zmiennej w tagach PROPERTY równej "dupa"--->

<condition>
<greater-than>
<property>/aaa/bbb/zmienna</property>
<value>0<value>
</greater-than>
</condition>
<!---powyzszy condition spelniony dla wartosci zmiennej w tagach PROPERTY wiekszej od zera--->

<condition>
<greater-than-equals>
<property>/aaa/bbb/zmienna</property>
<value>-990<value>
</greater-than-equals>
</condition>
<!---powyzszy condition spelniony dla wartosci zmiennej w tagach PROPERTY wiekszej lub rownej -990--->

<!---analogicznie dziala less-than(-equals), oznacza MNIEJ NIZ (lub rowno)--->
<condition>
<less-than>
<property>/aaa/bbb/zmienna</property>
<value>8000<value>
</less-than>
</condition>

<condition>
<less-than-equals>
<property>/aaa/bbb/zmienna</property>
<value>8000<value>
</less-than-equals>
</condition>
Tag EQUALS i NOT-EQUALS można stosować również do zmiennych typu tekstowego. Wszystkie tagi możemy łączyć w skomplikowane układy np:
Kod:
<condition>
<and>
<less-than-equals>
<property>/aaa/bbb/zmienna</property>
<value>8000<value>
</less-than-equals>
<greater-than>
<property>/aaa/xxx/zmienna2</property>
<value>0<value>
</greater-than>
<not>
<property>/aaa/zzz/zmienna3</property>
</not>
</and>
</condition>
Zadziała gdy JEDNOCZEŚNIE (and) zajdą te warunki: zmienna<=8000, zmienna2>0 i zmienna3 przyjmie wartość FALSE (typu Boolean).

b) tag <name>:
Tu po prostu nadajemy czemuś nazwę, to może być np. dźwięk lub warstwa na wyświetlaczu w kokpicie. Przykład na naszym ulubionym b1900d:
Kod:
<crank>
            <name>engstart0</name>
            <reference-dist>3.0</reference-dist>
            <max-dist>6.0</max-dist>
            <mode>once</mode>
            <path>Sounds/turbine_start.wav</path>
            <condition>
                <greater-than>
                    <property>controls/engines/engine[0]/condition</property>
                    <value>0.1</value>
                </greater-than>
            </condition>
            <volume>
                <property>sim/sound/cabin</property>
                <factor>0.3</factor>
            </volume>
            <position>
                <x>-1.5</x>
                <y>2.5</y>
                <z>-0.33</z>
            </position>
        </crank>
Ten dźwięk nazywa się 'engstart0'. Nazwy mogą być dowolne. Pozostałe tagi uniwersalne omówię dalej w artykule.



4. Obindowanie elementu samolotu
4.1. Reakcja na kliknięcie
Powiedzmy, że mamy w kokpicie przycisk który 'nic nie robi' - nie ma żadnego obindowania. Taki przycisk nie podświetla się na żółto po wciśnięciu Ctrl+C. Odsyłam w tym momencie na chwilę do ostatniej części mojego poradnika do Nasala. Posłużę się tym samum przykładem (chociaż to jest przełącznik a nie przycisk):
Kod:
<animation>
        <type>pick</type>
        <object-name>RACT.sw</object-name>
        <action>
            <button>0</button>
            <repeatable>false</repeatable>
            <binding>
            <command>nasal</command>
            <script>print("nacisnales mnie lewym przyciskiem myszy");</script>
            </binding>
        </action>
    </animation>
Tagi po kolei:
<type> wartość: pick. Reakcja na kliknięcie. innym typem jest 'rotate' (obrót elementu samolotu), translate (przesunięcie) ale o tym później
<object-name> wartością jest nazwa elementu.
<action> tag nadrzędny:
<button> - 0, 1, 3, 4 - kolejno lewy przycisk myszy, prawy, rolka w górę, rolka w dół
<repeatable> - wartość true lub false (prawda lub fałsz), czy przycisk ma powtarzać daną czynność cyklicznie przy wciśnietym przycisku myszy.
<binding> tag nadrzędny:
<command> - wartości: nasal, property-toggle. 'nasal' - wykonanie skryptu w tagach <script></script>, 'property-toggle' to zmiana wartości zmiennej na przeciwną.

4.2. Obrót elementu
Samo obindowanie przełącznika nie zmieni nam jego położenia. Działać będzie - ale się nie obróci.
Kod:
    <animation>
        <type>rotate</type>
        <object-name>WSHDheat1.sw</object-name>
        <property>/aaa/zmienna</property>
        <factor>45.0</factor>
        <center>
            <x-m>-4.817</x-m>
            <y-m>-0.316</y-m>
            <z-m>-0.225</z-m>
        </center>
        <axis>
            <x>0</x>
            <y>1</y>
            <z>0</z>
        </axis>
    </animation>
Tagi (kilka jest takich samych jak w przykładzie wyżej):
<property> - zmienna z wartośia liczbową lub zmienna typu Bool (gra potraktuje to jako wartość liczbową 1 i 0)
<factor>45.0</factor> - mnożnik do obliczania kąta obrotu. Kąt obrotu = factor*zmienna.
<center> - punkt obrotu, współrzędne odczytujemy z Blendera zaznaczając obiekt lub jakąś jego cześć i wciskając N. Bierzemy wartości GLOBALNE a nie lokalne (klikamy na Global).
<axis> - tu ustawiamy względem której osi ma sie obracać obiekt. Działa tu zasada prawej dłoni: jezeli kciuk wskazuje kierunek osi (i 'trzymamy' tę oś w ręku) to palce pokazują DODATNIE wartości obrotu. Ułożenie osi tez bierzemy z blendera (widać je na dole po lewe, w rogu). Poszczególne wartości oznaczają skłądową obrotu po danej osi (wartości z zakresu <-1, 1>). Wartość 1 oznacza, że względem tej osi obracamy o kąt=factor*zmienna. Każda inna wartość oznacza: kąt=wartość*factor*zmienna.
4.2.1 Tablica interpolacyjna
To rozwiązanie przydaje się gdy chcemy obrócić element 'skokowo', np. tak:
wartość zmiennej: -2, -1, 0, 1, 2
obrót o kąt kolejno: -60, -45, 0, 45, 60
Nie pomoże nam tu <factor> bo nie ma takiej wartości, która by działała dla każdego kata.
Kod:
        <animation>
        <type>rotate</type>
        <object-name>Extlights</object-name>
        <property>controls/lighting/landing-lights</property>
        <min>0.0</min>
        <max>1.0</max>
        <interpolation>
            <entry>
                <ind>-2</ind><dep>-60</dep>
            </entry>
            <entry>
                <ind>-1</ind><dep>-45</dep>
            </entry>
            <entry>
                <ind>.0</ind><dep>0</dep>
            </entry>
            <entry>
                <ind>1</ind><dep>45</dep>
            </entry>
            <entry>
                <ind>12</ind><dep>60</dep>
            </entry>
        </interpolation>
        <center>
            <x-m>-4.817</x-m>
            <y-m>-0.316</y-m>
            <z-m>-0.225</z-m>
        </center>
        <axis>
            <x>0</x>
            <y>1</y>
            <z>0</z>
        </axis>
    </animation>
Tworzymy 'tabele interpolacyjną' czyli to co słowami opisałem wypisując wartości kątów obrotu nad przykładem. Tag <ind> oznacza wartość wejściową, <dep> wyjściową. Reszta (środek obrotu, osie) jest analogiczna.
« Ostatnia zmiana: Grudzień 06, 2011, 13:20:59 wysłane przez SP-WKA » Zapisane
Strony: [1]   Do góry
  Drukuj  
 
Skocz do:  

Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC | Sitemap




Polityka cookies
Darmowe Fora | Darmowe Forum

wsbchorzow catziee forum-olimpijczykow westsnipes kociakowo