[[ags|{{:contents.gif}}]] [[scripting|{{:up.gif}}]] [[fonctions_globales_predefinies|{{:back.gif}}]] [[personnalisation_de_l_affichage_des_options_des_dialogues|{{:forward.gif}}]] ---- ===== 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); } } } {{tag>français}}