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 :

  1. 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.
  2. Pour chaque évènement, on défini une variable d'indicateur pour informer la boucle de jeu que l'évènement est arrivé.
  3. 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

Autres Langues