Small Basic - Les Bases : Les Evènements (fr-FR)
Cet article trait des bases de l'utilisation des évènements dans Small Basic.
Qu'est-ce qu'un Evènement ?
Un évènement est quelque chose qui survient indépendamment du cours normal de l'exécution des instructions dans un programme.
Le plus suvant il s'agit de quelque chose qui arrive comme le résultat d'une interaction utilisateur, tel que l'appui d'une touche clavier, le clic de la souris ou d'un mouvement de souris.
Dans Small Basic un évènement appparaît dans l'Intellisense avec un symbole éclair.
Un évènement est initialisé en définissant la sous-routine qui sera appelée lorsque l'évènement surviendra. L'affectation de la sous-routine associée doit être effectuée qu'une seule fois. Lorsque l'évènement est provoqué la sous-routine associée est appelée.
L'exemple suivant est un évènement simple qui affiche une boite de dialogue lorsqu'un bouton de la souris est cliqué dans la GraphicsWindow.
GraphicsWindow. MouseDown = OnMouseDown
Sub OnMouseDown
GraphicsWindow.ShowMessage( "Bouton de la souris cliqué" ,"Information")
EndSub
Comment Fonctionne les Evènements ?
Comme un évènement peut avoir lieu a n'importe quel moment, le programme principal sera en train faire autre chose. L'évènement appelera la sous-routine associée au même moment que le programme sera en train de s'exécuter.
Plusieurs points doivent être notés concernant les évènements :
Si un évènement est appelé une seconde fois avant qu'il n'est terminé sa dernière exécution, il sera mis en attente jusqu'à ce que l'évènement précédent soit terminé. Il peut en résulter un long délai avant que tous les évènements soit traités si les évènements sont provoqués souvent (comme un mouvement de la souris) et que la sous-routine de l'évènement est lente.
GraphicsWindow. MouseMove = OnMouseMove
Sub OnMouseMove
Sound.PlayChimeAndWait()
EndSub
Si la sous-routine de l'évènement et le code principal peuvent appeller tous les deux la même sous-routine, alors cette sous-routine peut être appelée par ces deux parties de code au même moment mais avec des résultats non prévisibles.
Timer. Interval = 1000
Timer. Tick = OnTick
While ("True")
doCalc()
Program.Delay(10)
EndWhile
Sub OnTick
doCalc()
TextWindow.WriteLine(sum)
EndSub
Sub doCalc
sum = 0
For i = 1 To 10000
sum = sum+1
EndFor
EndSub
Si la sous-routine et le code principal partagent les mêmes variables, alors dés que ces deux blocs de code changent ces variables au même moment, un comportement étrange peut avoir lieu.
Timer. Interval = 1000
Timer. Tick = OnTick
While ("True")
sum = 0
For i = 1 To 10000
sum = sum+1
EndFor
Program.Delay(10)
EndWhile
Sub OnTick
sum = 0
For i = 1 To 10000
sum = sum+1
EndFor
TextWindow.WriteLine(sum)
EndSub
Utiliser une Boucle de Jeu
La solution pour résoudre certains des problèmes si dessus, est de forcer un seul bloc de code à s'exécuter à la fois. Nous voulons que le code principal exécute tout de manière séquentielle.
Une boucle 'While' infinie qui s'exécute constamment, et se contente de traiter le résultat des évènements est une technique de programmation classique, en particulier pour les jeux d'action. Elle est appelée une 'Boucle de Jeu' ou 'Boucle d'Evènement'.
Nous voulons qu'un indicateur soit défini lorsqu'un évènement à lieu et on utilise cet indicateur dans la boucle principale du jeu, là ou tout s'exécute dans l'ordre sans les problèmes d'exécution de code multiple au même moment. Un indicateur est juste une variable qui est soit vraie soit fausse ou qui contient une simple valeur comme 0 (faux) et 1 (vrai).
La méthode est :
- Créer une boucle de jeu qui s'exécute tant que le programme est actif. Généralement on utilise 'Program.Delay()' pour contrôler la vitesse à laquelle la boucle s'exécute.
- Pour chaque évènement, on défini une variable d'indicateur pour informer la boucle de jeu que l'évènement est arrivé.
- Dans la boucle de jeu, on test chaque indicateur d'évènement ; si il est défini alors on exécute l'action appropriée et on réinitialise l'indicateur comme non défini.
Les exemples suivant montrent comment traiter ces cas.
GraphicsWindow. MouseMove = OnMouseMove
mouseMove = 0
While ("True")
If (mouseMove = 1 ) Then
Sound.PlayChimeAndWait()
mouseMove = 0
EndIf
Program.Delay(20)
EndWhile
Sub OnMouseMove
mouseMove = 1
EndSub
Timer. Interval = 1000
Timer. Tick = OnTick
While ("True")
doCalc()
If (tick = 1 ) Then
doCalc()
TextWindow.WriteLine(sum)
tick = 0
EndIf
Program.Delay(10)
EndWhile
Sub OnTick
tick = 1
EndSub
Sub doCalc
sum = 0
For i = 1 To 10000
sum = sum+1
EndFor
EndSub