Ce qui a été présenté de FunDelphi jusqu'ici ne vous permet guère de faire plus que les SimpleSquares. Nous allons attaquer la partie réellement intéressante de FunDelphi : les conditions avec if. Les conditions permettent d'effectuer certaines instructions dans certains cas, et d'autres instructions sinon.
Un cas classique : un obstacle de style bloc
Commençons par un cas classique, la création d'un obstacle de style bloc, c'est-à-dire qui se détruit si le joueur peut effectuer l'action OpenBronzeLock.
obstacle TBronzeBlock name 'Bloc en bronze'; image 'Blocks/BronzeBlock'; on Pushing do begin inherited; if not KeyPressed then Exit; if Player can OpenBronzeLock then Square.Obstacle := nil else Player.ShowMessage('Ce bloc ne disparaîtra qu''avec une clef de bronze.'); end; end;
L'événement Pushing se déclenche lorsque le joueur pousse sur l'obstacle.
La première instruction, inherited, effectue le comportement par défaut de tout obstacle, à savoir de bloquer le joueur.
Ensuite vient la première condition. La structure d'une condition est if Condition then Instruction. L'instruction n'est exécutée que si la condition est vraie (True). Le mot-clef not inverse la valeur de vérité de ce qui est à sa droite. Donc si c'est False (faux), cela devient True (vrai), et inversement. L'identificateur KeyPressed, en lui-même, vaut True si et seulement si le joueur a effectivement appuyé sur une touche (c'est par exemple False s'il vient d'une flèche).
Cette condition tout entière est donc vraie si KeyPressed vaut False, donc si le joueur vient d'une flèche ou d'un effet similaire. Dans ce cas, l'instruction Exit est exécutée. Celle-ci a pour effet de "partir", de terminer l'événement. Donc, tout ce qui se trouve après le Exit ne sera pas exécuté.
Si par contre le joueur avait appuyé sur une touche, on arrive à la seconde condition. Si le joueur est capable d'ouvrir un verrou en bronze, il faut détruire le bloc. Sinon, il faut lui afficher un message. Le "sinon" se traduit en else en FunDelphi. C'est la deuxième forme de structure d'une condition : if Condition then InstructionSiVrai else InstructionSiFaux.
Contre toute attente, il ne faut pas de point-virgule à la fin de l'instruction InstructionSiVrai. Car bien que ce soit la fin de cette instruction, ce n'est pas la fin du if..then..else tout entier.
La condition ici est Player can OpenBronzeLock. Traduit littéralement de l'anglais au français, cela donne "Joueur peut OuvrirBlocEnBronze". On ne peut plus clair, si ?
Le nil veut dire "rien" ou "aucun". Donc, l'obstacle de la case courante devient "rien". Autrement, dit l'obstacle actuel est détruit.
Plusieurs instructions après then ou else
Normalement, seule la première instruction qui suit directement le then ou le else dépend de celui-ci. Par exemple, dans l'exemple précédent, seul le Exit dépend de la condition not KeyPressed. Pour exécuter plusieurs instructions, entourez-lez de begin et end, comme ceci :
if Player can OpenBronzeLock then begin Square.Obstacle := nil; Player.ShowMessage('Cool ! Tu as réussi à faire disparaître ce bloc.'); end else Player.ShowMessage('Ce bloc ne disparaîtra qu''avec une clef de bronze.'); end;
Comparer des valeurs
Il existe plusieurs opérateurs permettant de comparer des valeurs.
- = teste si ses opérandes sont égaux ;
- <> teste si ses opérandes sont différents ;
- < ou > testent si l'opérande de gauche est respectivement strictement plus petit ou strictement plus grand que l'opérande de droite ;
- <= ou >= sont similaires pour plus petit ou égal et plus grand ou égal.
Par exemple, si vous devez tester si le tag du player est égal à 1, vous utiliserez le code suivant :
if Player.Tag = 1 then Player.ShowMessage('Ton tag vaut 1.');
Combiner plusieurs tests
Vous pouvez combiner plusieurs tests avec les opérateur and et or. Condition1 and Condition2 vaut True si et seulement si Condition1 et Condition2 valent toutes les deux True. Inversement, Condition1 or Condition2 vaut True si au moins une des deux conditions vaut True.
if (Player.Tag = 1) and (Pos.Z = 0) then Player.ShowMessage('Ton tag vaut 1 et tu es au rez-de-chaussée.');
Dans la majorité des cas, vous devrez entourer les sous-conditions de parenthèses, comme dans l'exemple ci-dessus.
3