Une des choses que vous aurez le plus souvent à faire dans vos scripts consiste à vérifier
si quelque chose s'est passé dans le jeu – et si c'est le cas, alors provoquer une réaction
en conséquence.
Par exemple, supposons que vous vouliez qu'un oiseau vole de part et d'autre de l'écran en
arrière-plan. Vous aurez besoin de dire à l'oiseau de se déplacer dans une direction, de
détecter lorsqu'il est arrivé, et de lui dire de faire le chemin inverse.
C'est là qu'interviennent les fonctions repeatedly_execute et repeatedly_execute_always.
Quelle différence y'a-t-il entre ces événements ?
L'événement repeatedly_execute est déclenché à chaque cycle de jeu (par défaut donc, 40
fois par seconde), mais seulement lorsque le jeu n'est pas bloqué. Cela signifie que l'événement
sera déclenché tant qu'il n'y a pas d'animation ou de déplacement bloquants en cours (c'est-à-dire
une commande Walk ou Animate passée avec le paramètre eBlock).
D'un autre côté, repeatedly_execute_always est inconditionnellement déclenché à chaque cycle,
que le jeu soit bloqué ou non. Cette constance a un coût : vous ne pourrez y mettre aucun code
qui bloquerait le jeu. Ainsi, si vous essayez d'y placer la commande player.Walk() avec
le paramètre eBlock – ou plus simplement la commande Wait(1);
, alors ces commandes
échoueront car elles seront dans repeatedly_execute_always.
Quand est-ce que j'utilise l'un plutôt que l'autre ?
Vous utiliserez généralement repeatedly_execute pour faire des choses qui affectent le joueur
et repeatedly_execute_always pour gérer des tâches d'arrière-plan qui n'affectent pas directement
le joueur.
Par exemple, si votre jeu possède un système de gestion de la faim, vous pourrez vérifier dans
repeatedly_execute depuis combien de temps le joueur n'a pas mangé – et si cela fait plus
de 20 minutes, alors le personnage joueur devra s'arrêter et frotter son ventre. Puisque, pour
cela, vous utiliserez une animation bloquante, et que vous ne voulez pas interrompre toute éventuelle
scène en cours, repeatedly_execute sera l'endroit idéal pour gérer ça.
D'un autre côté, dans le cas de notre oiseau qui parcourt l'écran, vu que nous ne voulons pas
bloquer le jeu lorsque l'oiseau vole et que cela se passe simplement en arrière-plan,
repeatedly_execute_always sera l'endroit idéal pour gérer ça.
Comment je crée ces événements ?
Dans les scripts principaux, vous créez votre fonction repeatedly_execute en collant simplement
ce qui suit dans le script. Dans GlobalScript.asc, ceci est déjà créé pour vous :
function repeatedly_execute() { // Placez votre code ici }
Dans les pièces, cela est un peu différent. Si vous voulez déclencher un script spécifique à une certaine
pièce, ouvrez le tableau des événements (Events Pane) de la pièce et vous verrez l'événement “Repeatedly execute”.
Cliquez sur le bouton ”…” et une fonction appelée Room_RepExec devrait être créée pour vous.
Rappelez-vous bien ceci – dans les scripts des pièces, vous ne pouvez pas simplement coller une fonction
repeatedly_execute ; à la place vous devez utiliser le tableau des événements pour la créer.
Pour créer repeatedly_execute_always, vous pouvez simplement coller le script qui suit dans le script –
ceci incluant les scripts de pièce. Le code suivant marchera dans n'importe quel script, que ce soit un script
global ou un script de pièce :
function repeatedly_execute_always()
{
// Placez votre code ici
}
Rappelez-vous, évidemment, que les fonctions RepExe et repeatedly_execute_always placées
dans le script d'une pièce se déclencheront uniquement lorsque le joueur se trouve dans cette pièce !
Je peux avoir un exemple ?
Implémentons les deux choses que nous avons évoquées. Voici notre code pour la gestion de la faim :
function repeatedly_execute() { // incrémentons notre variable timer (que nous avons auparavant // créée dans l'éditeur des variables globales) timerFaim++; if (timerFaim == 800) { Display("Vous avez très faim."); player.LockView(FROTTEVENTRE); player.Animate(0, 5, eOnce, eBlock, eForwards); player.UnlockView(); } }
et plaçons le code de l'oiseau volant dans le script de la pièce, parce que cela ne se passe que dans cette pièce :
function repeatedly_execute_always()
{
if (!cOiseau.Moving)
{
if (cOiseau.x < 100)
{
// si l'oiseau est à gauche de l'écran,
// déplaçons-le vers la droite
cOiseau.Walk(400, cOiseau.y, eNoBlock, eAnywhere);
}
else
{
// sinon, déplaçons-le vers la gauche
cOiseau.Walk(0, cOiseau.y, eNoBlock, eAnywhere);
}
}
}