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

Ceci est une ancienne révision du document !



Tutoriel de Scripting, partie 2

Récapitulatif

Dans la première partie du tutorial, nous avons survolé les bases du scripting : comment écrire un simple script ; utiliser des variables et des états conditionnels. Vous savez donc à présent utiliser toutes les fonctions intégrées et écrire un script à peu près comme il faut. Bon, c'est quoi la suite ?

Les Boucles

Vous serez sans doute confronté a une séquence de commande qui devra être exécutée plus d'une fois d'affilée. Dans AGS, il faut utiliser la commande while. Le format est virtuellement identique que pour la commande if:

int compteur = 1;
while (compteur < 10) {     
  compteur ++;
}

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. 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.

NOTE:

Faites tout de même attention avec les boucles — il est possible de faire planter votre jeu en utilisant une boucle mal écrite — nommée la boucle infinie. Regardez :

int compteur = 1;
while (compteur > 0) {     
  compteur ++;
}

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. Comme la valeur est toujours au dessus de 0, la boucle va recommencer . Cette boucle particulière va donc recommencer encore et encore — bref, elle tournera à l'infini tant que la valeur compteur ne sera pas inférieure à 1, et votre jeu se soldera par un arrêt brutal.

Conditions multiples

A plusieurs occasions, vous n'arriverez pas a vous décider quoi faire en étant basé sur une seule variable — 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. Vous devriez alors appliquer une condition multiple, et déclarer deux if à l'intérieur de chacun des autres:

if (player.HasInventory(iFirstItem)) 
{
  if (player.HasInventory(iSecondItem.ID))    
  {   
  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. Alors AGS vous propose d'opter pour cette méthode :

if ((player.HasInventory(iFirstItem.ID)) && (player.HasInventory(iSecondItem.ID)))
{     
  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 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 &&.

Vous pouvez étendre cette technique à autant de conditions que vous le voulez. Par exemple, cela va afficher un message si la variable Porte_ouverte est vraie, et si la variable script timer est entre 5 et 10.

if ((Porte_ouverte == true) && (timer > 5) && (timer < 10))    
{ 
  Display ("Tout fonctionne comme prévu.");     
}

Expression 'OU'

Parfois, vous vous retrouverez dans la situation où vous voulez demander si une condition ou une autre sont vraies. 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)))
{   
  player.ChangeRoom(10); 
}

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 &&, 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

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 :

if (timer == 5) {    
  // faire quelque chose
}
if (timer != 5) {
  // faire quelque chose d'autre
}

Ca devrait marcher — toutefois, il y a une méthode plus simple, en utilisant la commande else :

if (timer == 5) {    
  // faire quelque chose
}
else {
  // faire quelque chose d'autre
}

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 :

if (timer == 5) {    
  // faire quelque chose
}
else if (GetGlobalInt(1) == 6) {   
  // faire quelque chose d'autre
}
else {
  // faire ça si c'est ni 5 ni 6.
}

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.

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 :

function dialog_request(int param)     
{    
  // contenu de la fonction ici
}

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.

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.

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.

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.

Je pense que des exemples seront le bienvenu. Avant tout, regardons une fonction établie ; on_event :

function on_event (EventType event, int data) 
{    
  if (event == eEventGotScore) 
  {
    if (data == 5) 
    {
      aSpecialScoreSound.Play();
    }
    Display("Vous avez %d points!", data);    
  }
}

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. Comme vous pouvez le voir, vous utilisez les paramètres de la fonction comme n'importe quelle autre variable.

Notre propre fonction

Maintenant, supposons que nous avons une animation spéciale d'un personnage en train de faire une danse, et nous voulons être capable de la jouer à partir de plusieurs endroits dans le scripts. De loin, la voie la plus facile serait de faire ça dans une fonction :

function faire_danser()  
{       
  cEgo.LockView(10);
  cEgo.Animate(2, 5);    
  cEgo.UnlockView();
}

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.

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.

Maintenant, n'importe où dans le script, quand vous voulez que le personnage danse, faites juste :

faire_danser();   

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 :

function ajouter(int a, int b)      
{    
  int resultat;
  resultat = a + b;
  return resultat;
}

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. Ainsi, ailleurs dans votre script, vous pouvez écrire :

total = ajouter(5, 10);    

par exemple.

Utiliser les fonctions des room scripts

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.

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.

Page créée le 7 juin 2002 ; mise à jour le 19 août 2007. Copyright © 2002-2007 Chris Jones.

 
tutoriel_de_scripting_partie_2.1349619670.txt.gz · Dernière modification: 10/10/2012 20:19 (édition externe)
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki