Pages traduites Pages à traduire Pages en cours de traduction
A propos
 


repeatedly_execute (_always)

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);
    }
  }
}
 
repexec.txt · Dernière modification: 07/10/2012 16:21 (édition externe)
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki