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.
Bien, nous allons commencer avec quelque chose de vraiment très simple — afficher un message au joueur quand celui ci clic avec l'icône regarder sur un hotspot. En admettant que vous ayez fait le tutoriel principal d'AGS, vous devriez déjà avoir crée un script ressemblant à ça :
function hDoor_Look() { Display("C'est vraiment une large et menaçante porte !"); }
Jettons un oeil sur les détails. ”function” nous dit AGS, que c'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 intégrée que nous allons lancer. Alors, dans les parenthèses nous allons mettre les paramètres pour cette commande. Les paramètres sont des informations que 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 //.
Chacune des commandes que vous pouvez utiliser dans un script est aussi appelé une fonction. Toutes les commandes disponibles sont listés 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, …)Afficher un message sur l'écran. Il sera afficher dans la fenêtre standard de message, et centré au milieu de l'écran.
(la description continues…)
Le point clé ici c'est la partie de la première ligne a l'intérieur des parenthèses. Elle est appelé aussi la liste des paramètres et définit quel 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 un string, une chaine de caractères. Ca 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 d'un script de personnage. Vous devez fournir le nom d'un 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 être utiliser avec n'importe quel type. Pas besoin de fournir quelque chose en particulier, mais la description de la fonction vous demandera tout de même, quel type de valeur il faut utiliser.
Donc, nous savons que notre fonction Display a besoin d'un attribut de type string 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, nous pouvons donc l'ignorer pour le moment.
Pour faire que notre script appelle la fonction, nous appelons son nom; puis les paramètres entre parenthèses, et enfin le point virgule.
Cette syntaxe est très importante, si l'on oubli 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 large et menaçante porte !");
Nous avons déjà fait ça dans le tutorial principal, mais nous avons examiné ça plus de détails, vous devriez comprendre à présent pourquoi nous avons procédé de cette manière.
Le langage du script AGS est orienté objet. Ce qui veut dire que énormément de commande sont sur quelque chose dans le jeu. Vous devriez ne pas confondre orienté objet avec les objets des rooms, ce sont deux choses totalement différentes. Il y a un script instance pour chaque personnage dans le jeu, un pour chaque objet dans une room, un pour chaque 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 Script Name. Par exemple, le script de notre personnage principal est cEgo, alors son instance se nommera cEgo.
Pour effectuer une commande sur quelque chose, vous écrirez le nom de son script suivit par un point, suivit par le nom de la commande. Quand vous taperez le point, l'éditeur AGS va automatiquement afficher par pop-up, une liste des commandes disponibles :
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(iKey);
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 InventoryItem* et un optional int. L'InventoryItem* signifie que vous avez besoin de fournir le nom du script de l'objet inventorié; c'est quelque chose que vous pouvez placer 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é. Il le serait, dans le cas où il serait obligé de spécifier où exactement dans la liste de l'inventaire du personnage, l'objet devrait être ajouté ; cela ne nous concerne pas dans cette situation.
Comme pour toutes les instances individuelles du personnage comme cEgo, il y a une instance spéciale nommée player. Elle doit toujours correspondre au personnage actuellement dirigé par le joueur, donc si vous voulez exécuter une commande sur le personnage joué ( c'est particulièrement utile dans les jeux où le joueur peut diriger plusieurs personnages) alors vous devrez utiliser l'instance player pour faire ça.
Supposons que nous voulons que le joueur récupère un poster rose quand il regarde un hotspot particulier, avec un message qui s'affiche. Assurons nous d'avoir placé un objet d'inventaire et que le poster ai le nom de script iPoster (Voir dans le tutoriel principal comment faire ça), le script va nous faciliter la tâche.
Notre script final ressemblera à ça :
Display("C'est vraiment une large et menaçante porte !"); 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 commande, donc écrire quelque chose comme :
Display("Why did the chicken cross the road?"); Display("Because he was bored.");
Cela voudra dire que le joueur lira les messages dans l'ordre tel que vous l'avez spécifié.
Donc, rappelez vous de ces points vitaux :
Les scripts dans AGS peuvent utiliser les variables. Une variable est dans une zone de stockage mémoire qui contient une valeur, laquelle vous pouvez vérifier et changer avec votre script.
Pour déclarer une variable, vous devez écrire le type de la variable, suivit par le nom de la variable, et enfin d'un point-virgule. Le type peut être “int”, “String” (Notez la lettre capitale S) ou “float”, et le nom peut être ce que vous voulez — c'est ce que vous utiliserez pour se référer à elle 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 pour déclarer une variable avant de pouvoir l'utiliser, sinon le compilateur peut détecter des erreurs et connaitre quel type de donnée vous pouvez stocker dedans.
Initialement, votre variable vaudra 0. Vous pouvez cependant facultativement l'initier avec une valeur sans déclaration, comme ceci :
int myCounter = 5;
laquelle prendra comme valeur initiale, 5.
Un effet indésirable du script, est la tentative d'emuler le langage 'C' comme la portée des variables. Pour faire court, cela signifit que vous avez besoin de placer les définitions de vos variables EN DEHORS de tous les événements, sinon leurs valeurs vont continuer d'être réinitalisées.
Donc pour déclarer une variable utilisée par une des interaction d'un script de room, vous avez besoin de placer la définition au dessus du corps de la fonction principale. Pour que ça ressemble à ça :
// fichier du script de room int myCounter; //(autres scripts événements)// function hDoor_Look() { Display("C'est vraiment une large et menaçante porte !"); } //(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.
Vous pouvez changer la valeur d'une variable facilement dans un script - ecrivez 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 courante de la variable myCOunter, faites comme ceci :
myCounter += 3;
Manifestement, nous avons besoin d'une manière pour connaitre les valeurs contenues dans nos variables, autrement ça serait inutile. Nous allons donc utiliser les états conditionnels, appelés 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 à zéro).
Si myCounter n'est pas égal à 0, 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 un état conditionnel, vous devez TOUJOURS utiliser un opérateur double-égal, lequel comparera les deux valeurs. Si vous utilisez un simple égal vous mettrez une valeur à 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 procède si les deux valeurs sont les mêmes.
compare les deux valeurs, et procède si les deux valeurs ne sont pas les mêmes.
compare les deux valeurs, et procède si la valeur de gauche est inférieure à celle de droite.
compare les deux valeurs, et procède si la valeur de gauche est supérieure à celle de droite.
compare les deux valeurs, et procède si la valeur de gauche est inférieure ou égale à celle de droite.
compare les deux valeurs, et procède si la valeur de gauche est supérieure ou égale à celle de droite.
Maintenant, faisons quelque d'utile avec notre variable. Supposons que nous voulons avoir un message différent à chaque fois que le joueur regarde un hotspot. La première fois, il regarde et cela va le décrire, et si 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 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, 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 clic à nouveau, il observera a nouveau le dernier message.
Parfois, vous voudriez peut-être placer une variable de sorte qu'elle soit partagée entre un script de room et votre script global. Il y a deux manière pour faire ça —— vous pouvez exporter la variable du script global et l'importer dans le script d'entête, 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.
Quand on lit les descriptions d'une fonction 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 souhaiteriez utiliser 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 ().
Le système de script a quelques raccourcis sympa pour des tâche communes lesquelles vous vous retrouverez souvent à faire régulièrement.
Premièrement, les opérateurs ++ et – incrémente et décrémente 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 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 dons d'utiliser les crochets juste pour être sûr.
Enfin, si vous voulez tester pour vois 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");
Nous avons couvert les bases, donc vous devriez maintenant être capable d'écrire votre propre script. Il y a encore beaucoup d'autre contenus disponibles 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.
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php?id=ags30
Enjoy AGS!
Page crée le 6 Juin 2002; mise à jour le 19 Août 2007. Copyright © 2002-2007
Chris Jones.