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


Tutoriel de Scripting, partie 2

Récapitulatif

Dans la première partie du tutoriel, nous avons survolé les bases du scripting : comment écrire un simple script ; utiliser des variables et des expressions conditionnelles. 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 ?

Les Boucles

Vous serez sans doute confronté a une séquence de commandes 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 le même 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é aussi longtemps que la condition entre parenthèses 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

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

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 l'un de l'autre :

if (player.HasInventory(iPremierObjet)) 
{
  if (player.HasInventory(iDeuxiemeObjet))    
  {   
  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 permet d'opter pour cette méthode :

if ((player.HasInventory(iPremierObjet)) && (player.HasInventory(iDeuxiemeObjet)))
{     
  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 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.

if ((player.HasInventory(iClef)) || (player.HasInventory(iTronconneuse)))
{   
  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 n'exécutera le code que lorsqu'une des deux conditions (ou bien les deux à la fois) est vraie.

Faire une chose ou une autre

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) {    
  // 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 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) {    
  // faire quelque chose
}
else if (timer == 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 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 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)     
{    
  // contenu de la fonction ici
}

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 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 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 interne à AGS : écrivez juste le nom, les paramètres et le point virgule.

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

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

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.

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 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 et écrivez-les tout en haut. La fonction doit être en dehors de toutes les autres fonctions.

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

faire_danser();   

Retourner une valeur

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)      
{    
  int resultat;
  resultat = a + b;
  return resultat;
}

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 :

total = ajouter(5, 10);    

par exemple, et total vaudra 15.

Utiliser les fonctions dans les script d'une pièce

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

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 © 2002-2007 Chris Jones.

 
tutoriel_de_scripting_partie_2.txt · Dernière modification: 10/10/2012 20:19 par kitai
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki