Vachement bien ta jauge Fab. Elle peut même être placée au dessus d’une Jauge AM je pense.
De plus elle peut utiliser des offsets FSUIPC ce que AM ne sait pas faire (par contre AM est aussi compatible XPlane).
Pour simuler un allumage progressif d’un écran cathodique, on peut avec les nouvelles versions d’AM 3.x, en plus de jouer sur la visibilité, faire varier progressivement l’opacité de l’image entre 1.0(100%) et 0.0(transparent) avec un timer et le tour est joué.
@David
Affiches ton code ici, je vais regarder.
La fonction blink() est assez simple en fait. C’est le même principe que pour simuler l’allumage de l’écran LCD, mais avec une astuce en plus.
On va créer un timer avec une répétition infinie avec une période qui correspond à la durée du clignotement en millisecondes.
1- Mais avant ça, une variable booléenne globale de visibilité du voyant est crée et initialisée a false (éteint)
- Code: Tout sélectionner
Etat_voyant=false
2- Le voyant éteint est recouvert par l’image du voyant allumé, cette dernière image est rendue invisible par défaut immédiatement après sa création
- Code: Tout sélectionner
visible(img_voyant_allume, Etat_voyant)
3- A chaque appel de la fonction blink(), on inverse simplement l’état du voyant Etat_voyant avec cette astuce:
- Code: Tout sélectionner
Etat_voyant=not(Etat_voyant)
C’est la magie d’une variable booléenne qui n’a que deux états (true, false), prendre le contraire d’un état quelqu’il soit retourne obligatoirement l’état opposé. C’est assez intuitif, pas(vrai)=faux, et pas(faux)=vrai!
![lunettes lunettesnoires](./images/smilies/icon_cool.gif)
Si Etat_voyant est à true, not(true) donnera false, s’il est a false, not(false) donnera true...
4-Il suffit ensuite, toujours dans la fonction blink(), de gérer la visibilité de l’image « voyant Allumé »en fonction de deux choses:
- l’état du voyant (inversé à chaque appel du timer) tel qu’on vient de le voir,
- et la demande effective de clignotement qui est elle gérée par une autre variable booléenne globale (par exemple Transit)
Attention. Pour qu’une variable ne soit pas utilisee simplement localement au niveau de la fonction elle doit avoir obligatoirement été créé au préalable dans le code et sa valeur initiale donnera son type (ici booléen).
On aura donc inséré au début du code la ligne pour déclarer la variable Transit et du même coup empêcher le clignotement.
- Code: Tout sélectionner
Transit=false
5- Pour terminer la fonction blink(), on mettra donc la ligne suivante qui va gérer la visibilité du voyant allumé en fonction des deux critères décrits précédemment:
- Code: Tout sélectionner
visible(img_voyant_allume, Etat_voyant and Transit)
Pour que le voyant s’allume il faudra que les deux conditions soient remplies simultanément (true and true)
Si Transit est à false, quelque soit la valeur de État_voyant, le voyant ne s’allumera pas ((true and false) ou (false and false)).Quand Transit est à true, le voyant s’allumera seulement un coup sur deux, quand État_voyant est également à true (true and true).
6- La fonction blink() est terminée. Pour faire clignoter le voyant, on mettra donc au moment nécessaire dans le code (quand tu as détecté la sortie du train et jusqu’au verrouillage)
- Code: Tout sélectionner
Transit=true
Et évidemment on remettra Transit à l’état false lorsqu’on veut que le clignotement s’arrête. Comme la fonction blink() est appelée en permanence par le timer, les prochains appels avec Transit à false n’auront simplement aucun effet sur le voyant...
7- avant de créer notre timer « perpétuel », he conseille au préalable de créer une variable qui contiendra la durée du clignotement en millisecondes, a placer en tout début de code, c’est plus facile pour les réglages lors de la mise au point.
- Code: Tout sélectionner
blink_duration=300
8- On appellera pour terminer toutes les XXX msec la fonction blink() avec notre timer « perpétuel »:
- Code: Tout sélectionner
timer_start(0,blink_duration,blink)
Et c’est tout...
——-
Seul petit défaut de cette méthode, c’est qu’il y a nécessairement un temps de réaction du clignotement d’une période. Si blink() est appelé par le timer avec Transit=true mais que Etat_voyant est déjà à true, le voyant ne s’allumera effectivement qu’au deuxième appel de blink() par le timer (puisqu’on aura la première fois (false et true))
Quand la période de clignotement est relativement courte (200 a 500 Msec), ça ne se voit pas trop, pour des périodes plus longues, on peut s’apercevoir aléatoirement que le voyant ne réagit qu’apres.
Il faut à ce moment là gérer le timer de manière plus fine, l’arrêter et le redémarrer mais c’est un peu plus compliqué et ça rajoute du code en plus.
Jacques