Fr/Howto: Écrire un simple script en Nasal
Le Nasal est un langage de script disponible dans FlightGear qui ouvre un monde de possibilités pour les modélisateurs d'avion - beaucoup plus d'informations détaillées peuvent être trouvées ailleurs.
Si vous avez des questions spécifiques au Nasal, regardez la FAQ du Nasal et la section Nasal du forum. N'hésitez pas à poser des questions ou à répondre aux questions existantes.
Voici un exemple simple pour vous aider à démarrer, nous allons créer un script basique pour convertir la température du moteur de degrés Fahrenheit à degrés Celsius, comme le requiert les instruments du Fokker 50.
Un tel scénario devrait idéalement être très générique afin qu'il puisse être réutilisé facilement; mais le script est ici délibérément gardé aussi simple que possible.
Création du fichier nasal
Comme beaucoup d'autres choses dans FG, les fonctions nasales peuvent vivres dans de nombreux endroits différents. Ici, cependant, nous allons créer un répertoire "Systems" dans le répertoire principal du fokker50. Plus tard, d'autres fichiers peuvent être ajoutés à ce répertoire; un système électrique, les fonctions de contrôle, d'autres indicateurs du cockpit, etc.
Dans ce nouveau répertoire fokker50/Systems, nous allons ensuite créez un fichier texte vide, nous allons l'appeler "degftodegc.nas". Notez que de nombreuses fonctions différentes peuvent vivres dans le même fichier NAS;. Ce qui pourrait être renommé en quelque chose de plus générique plus tard si d'autres fonctions similaires sont ajoutés dans le temps.
C'est toujours agréable de commencer avec un commentaire utile au début du fichier;
# Converts degF to degC
Maintenant, ouvrons notre fonction;
var convertTemp = func{
Ce que nous devons faire en premier est de lire la température du moteur (en degF) dans l'endroit correspondant de l'arbre des propriétés. Nous allons créer une variable locale pour cela;
var degF = getprop("engines/engine[0]/egt_degf");
Ensuite, nous devons faire la conversion;
var degC = (degF - 32) * 5/9;
Cela semble assez simplee (mais notez le point virgule final à la fin de chaque ligne de la fonction - facile à oublier)
Maintenant que nous avons une variable dans notre script contenant la température en degrés C, nous voulons l'écrire dans un endroit approprié de l'arbre des propriétés et permettre ainsi à nos instruments d'en faire usage;
setprop("engines/engine[0]/egt-degc", degC);
Cette propriété n'existait pas avant, mais sera créée et la valeur contenue dans notre variable "degC" sera entrée dedans. Maintenant que notre scipt semble assez complet, nous pouvons fermer la fonction par une accolade fermante.
}
Inclure le nasal dans le fichier -set
Pour être sure que notre avion à pris connaissance de la présence de ce fichier nasal, nous devons ajouter quelques lignes au fichier -set principal de notre avion (dans notre cas, fokker50-set.xml bien sûr !).
Voici le XML approprié, que je mets dans le bas juste au-dessus de la balise fermante </ PropertyList>:
<nasal> <fokker50> <file>Aircraft/fokker50/Systems/degftodegc.nas</file> </fokker50> </nasal>
Heure décisive, testons notre fonction
Maintenant, nous pouvons lancer Flightgear pour tester notre nouvelle fonction. Démarrer FG de la manière habituelle avec l'avion approprié.
Maintenant, ouvrez la console nasal du menu debug (uniquement disponible dans les versions récentes de FlightGear. Dans un onglet vierge, tapez :
fokker50.convertTemp();
et faites "execute". (La partie "fokker50" vient de l'entrée que nous avons faite dans le fichier -set.xml)
Vous pouvez voire dans l'arbre des propriétés (file/browse internal properties) que nous avons maintenant une nouvelle propriété egt pour le premier moteur (/engines/engine), avec la valeur dans degC - Victoire !
Cependant, vous verrez aussi qu'elle ne change pas, sauf si vous exécutez la fonction de nouveau. Nous avons besoin d'ajouter un peu plus de choses à notre script afin de le faire tourner en permanence; ajouter ceci à la fin de votre fonction (avant l'accolade fermante!)
settimer(convertTemp, 0.1);
Le Settimer va appeler la fonction ConvertTemp, et le second argument détermine la fréquence avec laquelle elle le fait. Si votre fonction exige une réponse aussi rapide que possible, utilisez 0.
Maintenant, notre fonction, une fois appelé, sera constamment mise à jour la propriété degC - mais nous avons encore à l'appeler manuellement. Afin de lancer la fonction, nous allons utiliser un "listener"; il regarde une propriété donnée et appelle la fonction désirée à chaque fois que la propriété est écrite. C'est une méthode idéal et efficace à utiliser pour pour des interrupteurs qui ne change pas très souvent de position.
Placez ceci après la clôture de la fonction convertTemp :
setlistener("sim/signals/fdm-initialized", convertTemp);
L'écoute pour la propriété fdm-initialized est réglée (ce sera le cas lorsque le SIM est démarré), et notre fonction ConvertTemp démarre quand cela arrive.
Pour terminer
Comme "exercice pour le lecteur" (j'ai toujours détesté ça !) vous devez faire un script pour convertir la température pour le deuxième moteur.
Maintenant, vous devriez être en mesure de tirer profit des informations plus détaillées disponibles sur les nasales ici sur le wiki,sur www.plausible.org/nasal, et aussi d'autres script nasal préexistants qui peuvent être utilisés et adaptés.