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


Tutoriel de Scripting, partie 1

Dans AGS, toutes les interactions de votre jeu sont traitées à l'aide des scripts. Les scripts sont donc une partie essentielle de la création d'un jeu vidéo, il est donc temps de comprendre comment les utiliser.

Les bases

Bien, nous allons commencer avec quelque chose de vraiment très simple — afficher un message au joueur quand celui-ci clique avec le curseur Observer sur une zone interactive (hotspot). En admettant que vous ayez fait le tutoriel principal d'AGS, vous devriez déjà avoir créé un script ressemblant à ça :

function hDoor_Look() 
{
  Display("C'est vraiment une porte large et menaçante !");    
}     

Jetons un œil sur les détails. ”function” dit à AGS que ce qui suit est un bloc de code qui se lancera quand un événement se produira. ”hDoor_Look” est le nom de cet événement. Les parenthèses vides ( ) annoncent à AGS que cette fonction ne prend aucun paramètres (nous reviendrons là-dessus plus tard). Enfin, les crochets { et } définissent quand ce bloc de code démarre et se termine. Tout ce que vous mettez entre { et } sera lancé quand l'événement se déclenchera.

Display est le nom de la commande que nous allons lancer. Alors, dans les parenthèses nous allons mettre les paramètres pour cette commande. Les paramètres sont des informations dont la commande a besoin pour démarrer — dans ce cas, elle a besoin du message que nous voulons afficher. Enfin nous allons terminer la ligne avec une point-virgule. On utilise le point-virgule pour dire à AGS que c'est la fin de la commande. Tout ce que vous mettrez après ce point virgule deviendra une commande séparée, et pour que le script reste propre et lisible, il est conventionnel de revenir à la ligne.

Il est important de mentionner ici que les lignes qui commencent avec double-slash "//" sont des commentaires - AGS les ignore, elles seront seulement utiles pour vous aider a savoir ce que fait le script. Vous pouvez ajouter des commentaires à votre script simplement en commençant la ligne avec le symbole //.

Les commandes expliquées

Chacune des commandes que vous pouvez utiliser dans un script est aussi appelé une fonction. Toutes les commandes disponibles sont listées dans la partie Scripting du manuel, qui vous expliquera aussi comment les utiliser.

Nous voulons afficher un message pour le joueur, donc nous utiliserons la fonction Display. Regardons de plus près la définition que nous donne le manuel :

Display (string message, …)
Displays a message to the screen. It will be displayed in the standard message box, and centred in the middle of the screen. (description continues…)

Traduction :

Display (chaine de caractère, …)
Affiche un message à l'écran. Il sera affiché dans une boîte de messages standard, et centré au milieu de l'écran.

(la description continue…)

Le point clé ici c'est la partie de la première ligne a l'intérieur des parenthèses. Elle est appelée aussi la liste des paramètres et définit quels paramètres vous donnez à la fonction. Un paramètre est une information que la fonction utilise pour savoir quoi faire ou non.

Chaque paramètre est listé, séparé par des virgules. Voici quelques types de paramètres :

* string nom

Ce paramètre est une une chaîne de caractères (string). Cela signifie que pour ce paramètre, vous fournirez un texte entre guillemets.
Par exemple, “Mon texte”.
nom est le nom par lequel le paramètre sera référencé dans la description de la fonction, ce n'est pas pertinent pour écrire votre script.

* int nom

Ce paramètre est un nombre entier, c'est-à-dire une valeur numérique. Ce qui veut dire que le paramètre sera un nombre, par exemple 65.

* CHARID

Ce paramètre est le nom de script d'un personnage. Vous devez fournir le nom de script d'un des personnage du jeu.

* InventoryItem*

Ce paramètre est un objet d'inventaire. Vous avez besoin de fournir l'objet d'inventaire que vous voulez utiliser.

* …

Ce paramètre est facultatif, et peut correspondre à n'importe quel type. Pas besoin de fournir quelque chose en particulier, mais si vous voulez le faire, la description de la fonction vous informera sur le type de valeur qu'il faut utiliser.

Donc, nous savons que notre fonction Display a besoin d'un attribut de type String (chaîne de caractères) et d'un paramètre optionnel. La description va nous expliquer que le paramètre optionnel est utilisé pour des choses avancées comme afficher différentes valeurs variables dans le message, nous pouvons donc l'ignorer pour le moment.

Pour faire que notre script appelle la fonction, nous entrons son nom, puis les paramètres entre parenthèses, et enfin le point virgule.

Cette syntaxe est très importante, si l'on oublie les parenthèses par exemple, le script ne compilera pas. Aussi, notez que l'on ne DOIT PAS écrire le type de paramètre (Comme “string” ou “int”). On a donc cette ligne dans notre script :

Display("C'est vraiment une porte large et menaçante !");    

Nous avons déjà fait ça dans le tutoriel principal, mais nous venons d'examiner ça plus de détails, vous devriez comprendre à présent pourquoi nous avons procédé de cette manière.

Instances

Le langage du script AGS est orienté objet. Ce qui veut dire que énormément de commandes sont sur quelque chose dans le jeu. Vous devriez ne pas confondre orienté objet avec les objets des pièces, ce sont deux choses totalement différentes. Il y a une instance de script (script instance) pour chaque personnage dans le jeu, un pour chaque objet dans une pièce, un pour chaque zone d'interaction (hotspot) et ainsi de suite.

Le nom par lequel vous avez accès à l'instance dans le script est donné dans l'éditeur comme un attribut : le Script Name (Nom de Script). Par exemple, le nom de script de notre personnage principal est cEgo, alors son instance sera désigné par cEgo.

Pour effectuer une commande sur quelque chose, vous écrirez le nom de script suivi par un point, suivi par le nom de la commande. Quand vous taperez le point, l'éditeur AGS va automatiquement afficher une liste des commandes disponibles dans une fenêtre surgissante (pop-up) :

L'éditeur de script s'auto-complète.

Vous devrez alors choisir la commande appropriée, et placer tout paramètre dans les parenthèses, comme nous avons vu dans la commande Display. Par exemple :

cEgo.AddInventory(iClef);    

Ceci ajoutera la clef dans l'inventaire de personnage EGO. Si vous regardez dans le manuel concernant la fonction AddInventory, vous trouverez qu'elle prend deux paramètres : un Objet d'Inventaire (InventoryItem*) et un entier optionnel (optional int). L'InventoryItem* signifie que vous avez besoin de fournir le nom du script de l'Objet d'Inventaire ; c'est quelque chose que vous pouvez voir/définir dans l'éditeur de script.

L'optional int signifie quant à lui que vous pouvez ajouter le paramètre supplémentaire si vous le voulez, mais que vous n'y êtes pas obligé. Dans le cas où vous le faîtes, il sert à spécifier où exactement dans la liste de l'inventaire du personnage, l'objet devrait être ajouté ; cela ne nous concerne pas ici.

De la même façon qu'il existe des instances pour chaque personnage comme cEgo, il y a une instance spéciale nommée player. Elle correspond toujours au personnage actuellement dirigé par le joueur, donc si vous voulez exécuter une commande sur le personnage joueur (ce qui est particulièrement utile dans les jeux où le joueur peut diriger plusieurs personnages) alors vous utilisez l'instance player pour faire ça.

Séquences de commandes

Supposons que nous voulions que le joueur récupère une affiche rose quand il regarde une zone interactive (hostpot) particulière, avec un message qui s'affiche. En supposant que nous ayons un objet d'inventaire qui soit une affiche dont le nom de script est iAffiche (voir dans le tutoriel principal comment faire ça), le script nous permet d'effectuer ces deux actions très facilement.

Notre script final ressemblera à ça :

Display("C'est vraiment une porte large et menaçante !");    
cEgo.AddInventory(iPoster);

Notons que le système de script est sensible à la casse, donc écrire par exemple addinventory(iposter) ne marchera pas.

L'action dans le script s'exécutera de haut en bas dans l'ordre par lequel vous avez écrit les commandes, donc écrire quelque chose comme :

Display("Pourquoi la poule traverse-t-elle la route ?");    
Display("Parce qu'elle s'ennuit.");

Cela voudra dire que le joueur lira les messages dans l'ordre tel que vous l'avez spécifié.

Récapitulatif

Donc, rappelez-vous de ces points cruciaux :

  • Les chaînes de caractères sont entre guillemets.
  • Le point-virgule après avoir fermé les parenthèses sur chaque ligne.
  • Le script est sensible à la casse.
  • Pour utiliser une commande basée sur une instance, écrivez le nom du script suivi d'un point, suivi par le nom de la commande.
  • L'instance player correspond au personnage dirigé par le joueur.

Variables

Les scripts dans AGS peuvent utiliser les variables. Une variable est dans une zone de stockage mémoire qui contient une valeur, que vous pouvez vérifier et changer avec votre script.

Pour déclarer une variable, vous devez écrire le type de la variable, suivi par le nom de la variable, et enfin d'un point-virgule. Le type peut être “int” (entier), “String” (Notez la lettre capitale S) ou “float” (décimale), et le nom peut être ce que vous voulez — c'est ce que vous utiliserez pour référer à la variable plus tard. Par exemple :

int myCounter;

Le nom de la variable peut uniquement contenir les lettres de A à Z, de a à z et la barre underscore : _

Vous avez besoin de déclarer une variable avant de pouvoir l'utiliser, pour que le compilateur sache quel type de données vous pouvez stocker dans une variable si elle est impliquée dans une erreur.

Initialement, votre variable vaudra 0. Vous pouvez cependant facultativement l'initier avec une dans la déclaration, comme ceci :

int myCounter = 5;      

la varible prendra comme valeur initiale 5.

La portée d'une Variable

Un effet indésirable du script dans sa tentative d'émuler le langage 'C' concerne la portée des variables. Pour faire court, cela signifie que vous avez besoin de placer les définitions de vos variables EN DEHORS de tous les événements, sinon leurs valeurs seront réinitalisées à chaque nouvel appel de la fonction.

Donc pour déclarer une variable utilisée par un script d'une interaction de la pièce, vous avez besoin de placer la définition au-dessus du corps de la fonction principale. Cela doit ressembler à ça :

// fichier du script de le pièce
int myCounter;

//(autres scripts événements)//

function hDoor_Look() 
{
  Display("C'est vraiment une porte large et menaçante !");    
}     

//(suite du fichier)//

Aucune commande de script ne peut être utilisée hors des fonctions (sinon AGS ne les lira pas et ne les fera pas fonctionner !) — seules les déclarations de variables y sont autorisées.

Changer les variables

Vous pouvez changer la valeur d'une variable facilement dans un script - écrivez simplement le nom de la variable, le signe égal, puis la nouvelle valeur, suivie par un point virgule. Ainsi :

myCounter = 10;  

la variable changera pour une valeur de 10.

Vous pouvez aussi ajouter et soustraire une variable en utilisant les opérateurs += et -=. Ainsi, pour ajouter 3 à la valeur de la variable myCOunter, faites comme ceci :

myCounter += 3;    

Vérifier les variables

Manifestement, nous avons besoin d'une manière pour connaître les valeurs contenues dans nos variables, autrement ça serait inutile. Nous allons donc utiliser les expressions conditionnelles, introduites par le mot-clé if. Une condition ressemble à cela :

if (myCounter == 5)    
{   
  myCounter = 0;
}  

Ce qui veut dire que si myCounter contient la valeur 5, alors le script à l'intérieur des crochets { } sera exécuté (lequel va changer la valeur de myCounter pour zéro).

Si myCounter n'est pas égal à 5, le script à l'intérieur des crochets ne s'exécutera pas et le déroulement de l'exécution passera à la suite, après le }.

Notez le double-égal dans la condition. Dans une expression conditionnelle, vous devez TOUJOURS utiliser un opérateur double-égal, lequel comparera les deux valeurs. Si vous utilisez un simple égal, vous modifierez la valeur de la variable à la place, ce qui donnera d'étrange résultats.

Le == est appelé un opérateur, parce qu'il effectue une opération entre deux valeurs. Voici les principaux opérateurs disponibles :

  • ==

compare les deux valeurs, et exécute le code si les deux valeurs sont les mêmes.

  • !=

compare les deux valeurs, et exécute le code si les deux valeurs ne sont pas les mêmes.

  • <

compare les deux valeurs, et exécute le code si la valeur de gauche est inférieure à celle de droite.

  • >

compare les deux valeurs, et exécute le code si la valeur de gauche est supérieure à celle de droite.

  • <=

compare les deux valeurs, et exécute le code si la valeur de gauche est inférieure ou égale à celle de droite.

  • >=

compare les deux valeurs, et exécute le code si la valeur de gauche est supérieure ou égale à celle de droite.

Un peu de pratique

Maintenant, faisons quelque chose d'utile avec notre variable. Supposons que nous voulions avoir un message différent à chaque fois que le joueur regarde une zone interactive (hotspot). La première fois, il regarde et cela va la décrire, et s'il regarde à nouveau, il aura un message différent décrivant quelque chose plus en détail. Notre code ressemblera à quelque chose comme ça :

if (myCounter == 0) 
{
  Display("Vous voyez une bibliothèque.");
}
if (myCounter == 1) 
{
  Display("Regardons de plus près, vous voyez un livre nommé Hamlet.");  
}
if (myCounter == 2) 
{
  Display("Il y a aussi un livre nommé Harry Potter.");
}
if (myCounter == 3)
{
  Display("Il n'y a rien de plus qui soit intéressant là dedans...");  
}
if (myCounter < 3) 
{
  myCounter += 1;
}

myCounter débute initié à 0, donc la première fois que le script sera appelé, il lancera la première commande Display, mais pas les autres. Puis, comme 0 est inférieur à 3, il va ajouter à myCounter la valeur de 1 (dernière expression conditionnelle), et ainsi 0+1 = 1 ; myCounter vaut donc à présent 1.

Un fois que le joueur aura vu tous les messages (myCounter == 3), il n'y a plus de valeur à ajouter, donc si le joueur clique à nouveau, il observera à nouveau le dernier message.

Se faciliter la vie grâce aux variables globales

Parfois, vous voudrez peut-être placer une variable de sorte qu'elle soit partagée entre le script d'une pièce et votre script global. Il y a deux manières de faire cela — vous pouvez exporter la variable du script global et l'importer dans l'entête du script, mais c'est trop avancé pour ce tutoriel. Une façon plus facile est d'utiliser une des 300 GlobalInts — les variables globales —, lesquelles doivent utiliser les fonctions SetGlobalInt et GetGlobalInt pour y avoir accès. Voir les descriptions sur le manuel pour plus d'explications.

Fonctions qui retournent une valeur

Quand on lit les descriptions des fonctions dans le manuel, vous noterez que quelques unes retournent une valeur. Par exemple,

IsGamePaused ()
//Retourne 1 si le jeu est actuellement en pause, ou 0 autrement. 

Vous pouvez les utiliser comme si vous utilisiez une valeur littérale comme “9”. Par exemple, vous pouvez faire :

// Mettre une valeur retour dans notre variable
myCounter = IsGamePaused();  

(OU)

// Tester la valeur retour directement 
if (IsGamePaused() == 0) 
{
  myCounter += 5;
}

N'oubliez pas les parenthèses ().

Raccourcis communs

Le système de script a quelques raccourcis pratiques pour des tâches communes que vous vous retrouverez souvent à faire régulièrement.

Premièrement, les opérateurs ++ et – incrémentent et décrémentent la variable de 1, respectivement. Donc, la dernière partie de notre précédent script peut être écrit :

if (myCounter < 3)   
{     
  myCounter++;
}

Aussi, les crochets { } sont seulement nécessaires si vous avez plus d'une commande à l'intérieur. Si nous n'avons qu'une seule commande, la ligne “myCounter++;” dans notre exemple précédent, nous pouvons alors supprimer les crochets { } complètement et présenter la condition de cette manière :

if (myCounter < 3)      
  myCounter++;

Toutefois, cela peut mener à des erreurs dans le script difficilement repérables, je vous conseille donc d'utiliser les crochets juste pour être sûr.

Enfin, si vous voulez tester pour voir si la valeur d'une variable est à 0 ou non, vous pouvez juste écrire ceci :

if (myCounter)      
  Display("la variable myCounter n'est pas égale à zéro");    

équivalent à:

if (myCounter != 0)      
  Display("la variable myCounter n'est pas égale à zéro");    

Conclusion

Nous avons couvert les bases, donc vous devriez maintenant être capable d'écrire votre propre script. Il y a encore beaucoup d'autre choses que le système peut faire, mais ce que vous venez de voir devrait vous suffire pour commencer.

Quand vous vous sentirez prêt, n'hésitez pas à débuter le chapitre 2 de ce tutoriel, pour apprendre les boucles, les conditions multiples et créer vos propres fonctions. Tutoriel de Scripting, partie 2

Enjoy AGS!

Page créée le 6 Juin 2002; mise à jour le 19 Août 2007. Copyright © 2002-2007 Chris Jones.

 
tutoriel_de_scripting_partie_1.txt · Dernière modification: 03/02/2014 16:11 par 93.182.199.39
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki