Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
tutoriel_de_scripting_partie_2 07/10/2012 16:21 | tutoriel_de_scripting_partie_2 10/10/2012 20:19 version actuelle | ||
---|---|---|---|
Ligne 4: | Ligne 4: | ||
====Récapitulatif==== | ====Récapitulatif==== | ||
- | Dans la première partie du tutorial, nous avons survolé les bases du scripting : | + | Dans la première partie du tutoriel, nous avons survolé les bases du scripting : |
- | comment écrire un simple script ; utiliser des variables et des états conditionnels. | + | comment écrire un simple script ; utiliser des variables et des expressions conditionnelles. |
- | Vous savez donc à présent utiliser toutes les fonctions intégrées et | + | Vous savez donc à présent utiliser toutes les fonctions internes à AGS et |
écrire un script à peu près comme il faut. Bon, c'est quoi la suite ? | écrire un script à peu près comme il faut. Bon, c'est quoi la suite ? | ||
====Les Boucles==== | ====Les Boucles==== | ||
- | Vous serez sans doute confronté a une séquence de commande qui devra | + | Vous serez sans doute confronté a une séquence de commandes qui devra |
être exécutée plus d'une fois d'affilée. | être exécutée plus d'une fois d'affilée. | ||
Dans AGS, il faut utiliser la commande //while//. | Dans AGS, il faut utiliser la commande //while//. | ||
- | Le format est virtuellement identique que pour la commande //if//: | + | Le format est virtuellement le même que pour la commande //if//: |
int compteur = 1; | int compteur = 1; | ||
Ligne 21: | Ligne 21: | ||
Cela veut dire que le corps de la déclaration de //while// | Cela veut dire que le corps de la déclaration de //while// | ||
- | sera répétée aussi longtemps que la condition entre parenthèse sera vrai. | + | sera répété aussi longtemps que la condition entre parenthèses sera vrai. |
Dans l'exemple, le compteur démarre à 1, la boucle s'enclenchera 9 fois, | Dans l'exemple, le compteur démarre à 1, la boucle s'enclenchera 9 fois, | ||
jusqu'à cette dixième fois, où le compteur vaudra 10, et clôturera la boucle. | jusqu'à cette dixième fois, où le compteur vaudra 10, et clôturera la boucle. | ||
- | //**NOTE**//: | + | //**NOTE**// : |
Faites tout de même attention avec les boucles — il est possible de faire planter | Faites tout de même attention avec les boucles — il est possible de faire planter | ||
Ligne 37: | Ligne 37: | ||
Ici, la variable //compteur// débute à 1, donc la boucle va démarrer. | Ici, la variable //compteur// débute à 1, donc la boucle va démarrer. | ||
Puis, cette valeur va s'incrémenter de 1, et donc valoir 2. | Puis, cette valeur va s'incrémenter de 1, et donc valoir 2. | ||
- | Comme la valeur est toujours au dessus de 0, la boucle va recommencer . | + | Comme la valeur est toujours au dessus de 0, la boucle va recommencer. |
Cette boucle particulière va donc recommencer encore et encore — bref, | Cette boucle particulière va donc recommencer encore et encore — bref, | ||
elle tournera à l'infini tant que la valeur //compteur// | elle tournera à l'infini tant que la valeur //compteur// | ||
Ligne 44: | Ligne 44: | ||
====Conditions multiples==== | ====Conditions multiples==== | ||
- | A plusieurs occasions, vous n'arriverez pas a vous décider quoi faire en étant basé sur une seule variable | + | À plusieurs occasions, vous ne pourrez pas décider quoi faire en vous basant uniquement sur une seule variable |
— dans le cas où il y aurait une combinaisons de choses que vous voulez considérer. | — dans le cas où il y aurait une combinaisons de choses que vous voulez considérer. | ||
- | Par exemple, supposons que vous voulez afficher un message si le joueur a **deux** objets spécifiques dans l'inventaire. | + | Par exemple, supposons que vous vouliez afficher un message si le joueur a **deux** objets spécifiques dans l'inventaire. |
- | Vous devriez alors appliquer une condition multiple, et déclarer deux //if// à l'intérieur de chacun des autres: | + | Vous devriez alors appliquer une condition multiple, et déclarer deux //if// à l'intérieur l'un de l'autre : |
- | if (player.HasInventory(iFirstItem)) | + | if (player.HasInventory(iPremierObjet)) |
{ | { | ||
- | if (player.HasInventory(iSecondItem.ID)) | + | if (player.HasInventory(iDeuxiemeObjet)) |
{ | { | ||
- | Display ("Vous avez les deux objets!"); | + | Display ("Vous avez les deux objets !"); |
} | } | ||
} | } | ||
Toutefois, cela peut devenir lourd et compliqué si vous avez plein de conditions et ça ne fera pas très propre. | Toutefois, cela peut devenir lourd et compliqué si vous avez plein de conditions et ça ne fera pas très propre. | ||
- | Alors AGS vous propose d'opter pour cette méthode : | + | Alors AGS vous permet d'opter pour cette méthode : |
- | if ((player.HasInventory(iFirstItem.ID)) && (player.HasInventory(iSecondItem.ID))) | + | if ((player.HasInventory(iPremierObjet)) && (player.HasInventory(iDeuxiemeObjet))) |
{ | { | ||
- | Display ("Vous avez les deux objets!"); | + | Display ("Vous avez les deux objets !"); |
} | } | ||
- | Cela est rendu plus clair avec l'aide de l'opérateur **&&** . Notez que vous avez besoin d'une parenthèse supplémentaire | + | Cela est rendu plus clair avec l'aide de l'opérateur **&&** . Notez que vous avez besoin d'une parenthèse supplémentaire pour contenir l'ensemble de l'expression. |
- | pour contenir l'ensemble de l'expression. | + | |
Chaque partie de l'expression va à l'intérieur d'une parenthèse, comme d'habitude, et sont jointes avec le symbole de l'opérateur &&. | Chaque partie de l'expression va à l'intérieur d'une parenthèse, comme d'habitude, et sont jointes avec le symbole de l'opérateur &&. | ||
Ligne 82: | Ligne 81: | ||
====Expression 'OU'==== | ====Expression 'OU'==== | ||
- | Parfois, vous vous retrouverez dans la situation où vous voulez demander si une condition **ou** une autre sont vraies. | + | Parfois, vous vous retrouverez dans la situation où vous voulez demander si une condition **ou** une autre est vraie. |
Par exemple, vous proposez de laisser au joueur le choix d'ouvrir une porte avec la clef ou avec l'aide d'une tronçonneuse. | Par exemple, vous proposez de laisser au joueur le choix d'ouvrir une porte avec la clef ou avec l'aide d'une tronçonneuse. | ||
- | if ((player.HasInventory(iDoorKey.ID)) || (player.HasInventory(iChainsaw.ID))) | + | if ((player.HasInventory(iClef)) || (player.HasInventory(iTronconneuse))) |
{ | { | ||
player.ChangeRoom(10); | player.ChangeRoom(10); | ||
Ligne 92: | Ligne 91: | ||
L'opérateur ici est la double barre verticale de concaténation **||** (Windows : Alt Gr + 6 ; Mac : Alt + Maj + L). | L'opérateur ici est la double barre verticale de concaténation **||** (Windows : Alt Gr + 6 ; Mac : Alt + Maj + L). | ||
- | Cela marche exactement de la même manière que l'opérateur &&, | + | Cela marche exactement de la même manière que l'opérateur &&, sauf qu'il n'exécutera le code que lorsqu'une des deux conditions (ou bien les deux à la fois) est vraie. |
- | sauf qu'il procédera que quand une des deux conditions sera vrai, ou bien les deux soient vraies. | + | |
====Faire une chose ou une autre==== | ====Faire une chose ou une autre==== | ||
- | Parfois, vous voulez que le script prenne un sens de l'action si la valeur est fixée, et l'autre sens si elle ne l'est pas. Initialement vous penseriez faire ça : | + | Parfois, vous voulez que le script fasse une certaine action si une valeur est fixée, et une autre action si elle ne l'est pas. Initialement vous penseriez faire ça : |
if (timer == 5) { | if (timer == 5) { | ||
Ligne 115: | Ligne 113: | ||
} | } | ||
- | Ceci vous oblige a modifier la variable à l'intérieur du premier bloc de code, sans affecter quoi que ce soit du second bloc, qu'il fonctionne ou non. Vous pouvez faire autant de test que vous voulez en utilisant la commande //else if//. Alors la partie complète du code devrait se présenter comme cela : | + | Ceci vous permet de modifier la variable à l'intérieur du premier bloc de code, sans affecter quoi que ce soit du second bloc, qu'il fonctionne ou non. Vous pouvez faire autant de tests que vous voulez en utilisant la commande //else if//. Alors la partie complète du code devrait se présenter comme cela : |
if (timer == 5) { | if (timer == 5) { | ||
// faire quelque chose | // faire quelque chose | ||
} | } | ||
- | else if (GetGlobalInt(1) == 6) { | + | else if (timer == 6) { |
// faire quelque chose d'autre | // faire quelque chose d'autre | ||
} | } | ||
Ligne 129: | Ligne 127: | ||
====Votre propre fonction==== | ====Votre propre fonction==== | ||
- | Vous avez probablement remarqué que dans le manuel, il est mention des fonctions comme //repeatedly_execute//, ou //on_event//, et comment vous pouvez les ajouter à votre propre "global script" pour faire des trucs cools. Mais vous vous demandez sans doute, comment exactement ça fonctionne. | + | Vous avez probablement remarqué que dans le manuel, il est mention des fonctions comme //repeatedly_execute//, ou //on_event//, et que vous pouvez les ajouter à vos scripts pour faire des trucs cools. Mais vous vous demandez sans doute comment cela fonctionne exactement. |
- | Rappelez vous que dans la première partie, nous avons découvert les fonctions **parameters** et comment celles ci peuvent être //int//, //string//, etc. Et bien, vous pouvez écrire vos propre fonctions comme cela : | + | Rappelez vous que dans la première partie, nous avons découvert les **paramètres** des focntions et que ceux-là peuvent être de type //int//, //string//, etc. Et bien, vous pouvez écrire ces fonctions comme cela : |
function dialog_request(int param) | function dialog_request(int param) | ||
Ligne 138: | Ligne 136: | ||
} | } | ||
- | Vous commencez donc avec la commande //function//, puis suivit par le nom de la fonction, et après une parenthèse pour y ajouter les types de paramètres et leurs noms. Pour chaque paramètre que vous voulez, vous avez besoin d'écrire son type (//int// ou //string//), suivit par le nom par lequel il sera connu à l'intérieur de la fonction. Ce nom peut être ce que vous voulez — c'est comme nommer une variable. | + | Vous commencez donc avec le mot-clé //function//, puis suivi par le nom de la fonction, et après une parenthèse pour y ajouter les types des paramètres suivis de leur nom. Pour chaque paramètre que vous voulez, vous avez besoin d'écrire son type (//int// ou //string//), suivi par le nom par lequel il sera connu à l'intérieur de la fonction. Ce nom peut être ce que vous voulez — c'est comme nommer une variable. |
- | Il y a quelques fonctions **fixées**, comme dialog_request et on_event, lesquelles font parti d'AGS et dont vous **DEVEZ** utiliser le nombre correct de nombre et de type de paramètres. Toutefois, vous pouvez aussi ajouter vos propres fonctions en les nommant comme vous voulez, et avoir autant de paramètres que nécessaire. | + | Il y a quelques fonctions **fixées**, comme //dialog_request// et //on_event//, lesquelles font parti d'AGS et dont vous **DEVEZ** utiliser le nom et le nombre de paramètres corrects. Toutefois, vous pouvez aussi ajouter vos propres fonctions en les nommant comme vous voulez, et avoir autant de paramètres que nécessaire. |
- | Ces fonctions sont aussi utiles si vous avez un bloc de code que vous avez besoin à deux endroits différents — le mettre dans une fonction à la place, vous empêche de copier/coller et si vous modifiez votre fonction, tous les autres scripts reliés seront mit à jour. | + | Ces fonctions sont aussi utiles si vous avez un bloc de code dont vous avez besoin à deux endroits différents — le mettre dans une fonction à la place vous évitera de copier/coller et si vous modifiez votre fonction, tous les autres scripts reliés seront mis à jour. |
- | Pour appeler votre fonction n'importe où dans le script, faites exactement comme avec une fonction intégrée : écrivez juste le nom, les paramètres et le point virgule. | + | Pour appeler votre fonction n'importe où dans le script, faites exactement comme avec une fonction interne à AGS : écrivez juste le nom, les paramètres et le point virgule. |
- | Je pense que des exemples seront le bienvenu. Avant tout, regardons une fonction établie ; on_event : | + | Je pense que des exemples seront les bienvenus. Avant tout, regardons une fonction établie ; //on_event// : |
- | function on_event (EventType event, int data) | + | function on_event (EventType evenement, int donnees) |
{ | { | ||
- | if (event == eEventGotScore) | + | if (evenement == eEventGotScore) |
{ | { | ||
- | if (data == 5) | + | if (donnees == 5) |
{ | { | ||
- | aSpecialScoreSound.Play(); | + | aSonSpecialScore.Play(); |
} | } | ||
- | Display("Vous avez %d points!", data); | + | Display("Vous avez %d points!", donnees); |
} | } | ||
} | } | ||
- | Avec ce script, où que soit le score du joueur, il y aura un message pour le dire. Aussi, si il lui arrive d'avoir 5 points d'un coup, la fonction lancera un clip audio //aSpecialScoreSound//. | + | Avec ce script, où qu'en soit le score du joueur, un message l'affichera. De plus, si le joueur obtient 5 points d'un coup, la fonction lancera une séquence audio //aSonSpecialScore//. |
Comme vous pouvez le voir, vous utilisez les paramètres de la fonction comme n'importe quelle autre variable. | Comme vous pouvez le voir, vous utilisez les paramètres de la fonction comme n'importe quelle autre variable. | ||
Ligne 173: | Ligne 171: | ||
} | } | ||
- | Cette fonction débute à la vue 10, se répète 2 fois, comme pour l'animation du personnage, attend qu'elle finisse et retourne à la position initiale. | + | Cette fonction attribue la vue 10 au personnage, lance la séquence numéro 2 de l'animation, attend qu'elle finisse et retourne à la vue initiale. |
- | //Astuce//: Si vous vous demandez où placer vos fonctions, ouvrez le //global script// (Game menu, Edit Global Script) et écrivez les ici. La fonction dois être en dehors de toute les autres fonctions. | + | //Astuce// : Si vous vous demandez où placer vos fonctions, ouvrez le //global script// et écrivez-les tout en haut. La fonction doit être en dehors de toutes les autres fonctions. |
- | Maintenant, n'importe où dans le script, quand vous voulez que le personnage danse, faites juste : | + | Maintenant, n'importe où dans le script global, quand vous voulez que le personnage danse, faites juste : |
faire_danser(); | faire_danser(); | ||
Ligne 183: | Ligne 181: | ||
====Retourner une valeur==== | ====Retourner une valeur==== | ||
- | Vous avez peut-être remarqué que dans quelques fonctions intégrées, comme //IsGamePaused//, cela retourne une valeur dans le script. Vous pouvez faire ça dans vos propres fonctions, en utilisant la commande //return//. Donc : | + | Vous avez peut-être remarqué que dans quelques fonctions internes à AGS, comme //IsGamePaused//, cela retourne une valeur dans le script. Vous pouvez faire ça dans vos propres fonctions, en utilisant la commande //return//. Donc : |
function ajouter(int a, int b) | function ajouter(int a, int b) | ||
Ligne 192: | Ligne 190: | ||
} | } | ||
- | Cette fonction ajoute les deux nombres ensemble et retourne le résultat (une fonction inutile en pratique depuis que l'opérateur + fait la même chose, mais elle illustre bien l'utilité du //return//. | + | Cette fonction ajoute les deux nombres ensemble et retourne le résultat (une fonction inutile en pratique puisque l'opérateur + fait la même chose, mais elle illustre bien l'utilité du //return//). |
Ainsi, ailleurs dans votre script, vous pouvez écrire : | Ainsi, ailleurs dans votre script, vous pouvez écrire : | ||
total = ajouter(5, 10); | total = ajouter(5, 10); | ||
- | par exemple. | + | par exemple, et //total// vaudra 15. |
- | ====Utiliser les fonctions des room scripts==== | + | ====Utiliser les fonctions dans les script d'une pièce==== |
- | Vous avez sans doute remarqué que quand vous ajoutez votre propre fonction dans votre //global script//, vous pouvez très bien l'appeler d'ailleurs que du //global script// mais tenter de l'appeler dans un //room script// donne une erreur d'analyse. Le manuel explique comment résoudre ça en utilisant le //script header//. | + | Vous avez sans doute remarqué que quand vous ajoutez votre propre fonction dans le //script global//, vous pouvez très bien l'appeler de n'importe où depuis dans le //script global//, mais tenter de l'appeler dans le //script d'une pièce// déclenche une erreur d'analyse. Le manuel explique comment résoudre ça en utilisant //[[l'entête des scripts]]//. |
====Conclusions==== | ====Conclusions==== | ||
- | Nous avons survolé les quelques sujets des plus avancés du script. Je suis sûr qu'il y a plein de truc que j'ai oublié de mentionner, alors n'hésitez pas à commenter sur les forums. | + | Nous avons survolé quelques sujets plus avancés du script. Je suis sûr qu'il y a plein de trucs que j'ai oublié de mentionner, alors n'hésitez pas à commenter sur les forums. |
Page créée le 7 juin 2002 ; mise à jour le 19 août 2007. Copyright (c) 2002-2007 | Page créée le 7 juin 2002 ; mise à jour le 19 août 2007. Copyright (c) 2002-2007 | ||
Chris Jones. | Chris Jones. | ||
- | {{tag>français révision}} | + | {{tag>français}} |