FlightGear/Gli script XML: differenze tra le versioni
Riga 42: | Riga 42: | ||
</source> |
</source> |
||
In questi caso all'interno di ''<binding>..</binding>'' vi è il codice che potrà modificare il valore dell'asse '''0''' (''<axis n="'''0'''">'') tramite il comando di sistema ''<command>'''property-scale'''</command>'' che contiene alcuni parametri, il primo è il nome della proprietà dell'albero globale delle proprietà (''<property>'''/controls/flight/aileron'''</property>'') che dovrà essere unito in binding con il valore dell'asse '''0''' |
In questi caso all'interno di ''<binding>..</binding>'' vi è il codice che potrà modificare il valore dell'asse '''0''' (''<axis n="'''0'''">'') tramite il comando di sistema ''<command>'''property-scale'''</command>'' che contiene alcuni parametri, il primo è il nome della proprietà dell'albero globale delle proprietà (''<property>'''/controls/flight/aileron'''</property>'') che dovrà essere unito in binding con il valore dell'asse '''0''' (''<axis n="'''0'''">''). I successivi quattro parametri sono richiesti, tutti o solo in parte, dipende la contesto, dal comando '''property-scale''' e definiscono il tipo di trasformazione del dato numerico che realizza il comando '''property-scale'''. |
||
È anche possibile fare un binding non verso una chiamata C++ come '''property-scale''' ma verso uno script in Nasal, in questo caso potremo avere il seguente codice XML: |
|||
<source lang="xml"> |
|||
<PropertyList> |
|||
... |
|||
<axis n="0"> |
|||
<desc>Aileron</desc> |
|||
<binding> |
|||
<command>nasal</command> |
|||
<script>controls.throttleAxis()</script> |
|||
</binding> |
|||
</axis> |
|||
</source> |
|||
Il questo caso il comando C++ richiamerà l'interprete Nasal (''<command>'''nasal'''</command>'') seguito come parametro dal codice Nasal (''<script>'''...'''</script>'') che nel nostro esempio è semplicemente una chiamata ad una funzione Nasal di nome ''controls.throttleAxis()'' posizionata all'interno dell'aerea che raccoglie tutti gli script Nasal standard di FligtGear. |
|||
=Riferimenti= |
=Riferimenti= |
Versione delle 00:49, 5 mar 2012
In questo capitolo si descrive come costruire l'impalcatura principale di FlightGear, impalcatura fatta di codice XML che si appoggia sulle fondamenta di programmi scritti in C++. L'utilizzo del cosce XML ha permesso, all'inizio, di definire la possibilità di programmare facilmente l'interfaccia grafica GUI (Graphical user interface) senza dover scrivere righe in codice C++. Questo approccio, molto simile a quello utilizzato per costruire le interfacce grafiche Web, ha permesso di allargare notevolmente la fascia dei possibili programmatori di FlightGear prima spaventati dalla complessità del codice C++.
Successivamente l'uso dell'XML si è allargato ad altre parti del programma ed è diventato lo strumento di interfaccia tra il nucleo di FlightGear in C++ ed il linguaggio di programmazione Nasal utilizzato per scrivere efficaci script che di fatto coprono la maggior parte del codice scritto.
Binding
Nei linguaggi di programmazione il concetto di Binding è quello di generare un legame tra due differenti insiemi di codice. Ad esempio il nucleo portante di codice di FlightGear è formato da una serie di programmi in C++ che causa la loro intrinseca complessità sono gestiti solo da pochi ed esperti programmatori. Il Bindig fa si che i dati provenienti da alcune proprietà, dette per l'appunto <PropertyList> possano essere modificate da appositi comandi XML i quali non solo altro che chiamate al codice C++ che costituiscono il nucleo del programma.
Un tipico esempio è la modifica dei valori rilasciati da un asse del joystick in modo che siano compatibili con i valori previsti da FlightGear. Ovviamente alcune cose, come l'interfacciamento tra il PC ed il joystick, avviene tramite programmi di sistema operativo e quindi per mezzo di chiamate scritte in C++. Queste chiamate di basso livello permettono la generazione di un albero delle proprietà del dispositivo joystick raffigurato in questo esempio per il solo asse 0 e bottone 0 da una struttura XML del seguente tipo:
<PropertyList>
<name>Logitech Inc. WingMan Force 3D</name>
<axis n="0">
<desc>Aileron</desc>
</axis>
<button n="0">
<desc>Brakes</desc>
</button>
</PropertyList>
Questa struttura contiene tre oggetti, il nome della proprietà (<name>..</name>) e due variabili <axis n="0">..</axis> e <button n="0">..</button>. A questo punto è possibile fare il binding ovvero legare il valore presente in una certa proprietà con qualche trasformazione che può avvenire richiamando un codice in C++ e/o utilizzando uno script in Nasal.
<PropertyList>
...
<axis n="0">
<desc>Aileron</desc>
<binding>
<command>property-scale</command>
<property>/controls/flight/aileron</property>
<factor type="double">1.9</factor>
<offset type="double">-0.055</offset>
<dead-band type="double">0.15</dead-band>
<power type="double">1.0</power>
</binding>
</axis>
In questi caso all'interno di <binding>..</binding> vi è il codice che potrà modificare il valore dell'asse 0 (<axis n="0">) tramite il comando di sistema <command>property-scale</command> che contiene alcuni parametri, il primo è il nome della proprietà dell'albero globale delle proprietà (<property>/controls/flight/aileron</property>) che dovrà essere unito in binding con il valore dell'asse 0 (<axis n="0">). I successivi quattro parametri sono richiesti, tutti o solo in parte, dipende la contesto, dal comando property-scale e definiscono il tipo di trasformazione del dato numerico che realizza il comando property-scale.
È anche possibile fare un binding non verso una chiamata C++ come property-scale ma verso uno script in Nasal, in questo caso potremo avere il seguente codice XML:
<PropertyList>
...
<axis n="0">
<desc>Aileron</desc>
<binding>
<command>nasal</command>
<script>controls.throttleAxis()</script>
</binding>
</axis>
Il questo caso il comando C++ richiamerà l'interprete Nasal (<command>nasal</command>) seguito come parametro dal codice Nasal (<script>...</script>) che nel nostro esempio è semplicemente una chiamata ad una funzione Nasal di nome controls.throttleAxis() posizionata all'interno dell'aerea che raccoglie tutti gli script Nasal standard di FligtGear.