Lifecycle functions

Instruction

Syntaxe

Donne à une FUNCTION un nom réservé pour que le Moteur l’appelle lui-même : une fois au départ, à chaque image, à pas fixe, ou lors d’une collision, d’un déclencheur, d’un message ou d’un événement d’animation.

FUNCTION start()
FUNCTION update(<dt>)
FUNCTION fixedUpdate(<step>)
FUNCTION onCollisionEnter(<other>)
FUNCTION onCollisionStay(<other>)
FUNCTION onCollisionExit(<other>)
FUNCTION onTriggerEnter(<other>)
FUNCTION onTriggerExit(<other>)
FUNCTION onMessage(<message>, <data>, <sender>)
FUNCTION onAnimationEvent(<event>, <data>)
FUNCTION main()
ENDFUNCTION

S’écrit aussi : start, update, fixedUpdate, lateUpdate, onCollision, onTrigger, onMessage, onDestroy

Les éléments

<dt>Les secondes écoulées depuis l’image précédente, 0.1 au plus.
<step>Le pas fixe de la physique, 1/60 de seconde.
<other>L’autre entité du contact ou du déclencheur.
<message>Le texte du message envoyé par un autre script, par exemple avec EntitySend("door", "open").
<data>Les données jointes au message ou à l’événement d’animation.
<sender>L’entité qui a envoyé le message.
<event>Le nom de l’événement d’animation.

À savoir

  • Les lignes hors de toute fonction s’exécutent une fois, au chargement du script, avant start(). C’est la place des déclarations GLOBAL et de la mise en place.
  • Autres noms acceptés : onStart, onUpdate, onFixedUpdate pour les trois premiers ; onCollision et onTrigger valent onCollisionEnter et onTriggerEnter ; onAnimEvent vaut onAnimationEvent. La casse ne compte pas en BASIC : le Moteur reçoit quand même l’orthographe qu’il attend.
  • Une fonction de cycle de vie ne peut pas être surchargée. Un second update est une erreur de compilation : « BASIC lifecycle function cannot be overloaded ».
  • Pas de Sync() dans update : l’image se termine quand la fonction rend la main. Pour mesurer le temps, additionnez dt, ou comptez les images dans une tâche avec YieldTask().
  • Une erreur dans update ne l’arrête pas. L’erreur est signalée et update repart à l’image suivante. Un update qui dépasse 200 ms pendant 5 images de suite est désactivé.
  • Un programme avec un DO … LOOP est exécuté comme main(), de même qu’un programme qui contient Wait(), Sleep(), AWAITTASK, AWAITALL ou AWAITANY n’importe où hors d’une fonction, étiquette de tâche comprise. Le Moteur n’appelle alors jamais start() ni update(), et rien ne le signale. Ne déclarez pas votre propre FUNCTION main() dans un tel programme : elle est remplacée sans avertissement.
  • lateUpdate et onDestroy gardent leur nom réservé, mais l’éditeur ne les appelle pas sur le script d’une entité à ce jour. Ne comptez pas sur eux.
  • Vous pouvez toujours appeler ces fonctions vous-même, comme n’importe quelle autre.

Exemple

GLOBAL elapsed# = 0GLOBAL frames AS integer = 0FUNCTION start()  Console("ready")          ' ready, printed secondENDFUNCTIONFUNCTION update(dt#)  elapsed# = elapsed# + dt#  frames = frames + 1ENDFUNCTIONFUNCTION onMessage(message$, data, sender)  IF message$ = "reset" THEN frames = 0ENDFUNCTIONConsole("loaded")           ' loaded, printed first
Dans le manuel : Fonctions