Translations of this page:

This is an old revision of the document!
—-

2. Guide du Scripting avec Wintermute

Nous avons, jusqu'ici, pu s'en passer au cours des quelques tests de WME, nous avons échappé à l’environnement des développeurs et maintenant vous devez certainement être impatient de progresser! Comme vous l'avez probablement deviné, le noyau de toutes les opérations de WME réside dans les scripts. Mais qu'est ce que le script?

Démarrons par le commencement. Tout logiciel est basé sur un noyau “action / réaction”. Ce qui veut dire en quelque sorte que quelque chose se passe et le programme y répond. L'action peut être n'importe quoi allant d'un clique de souris du joueur à, par exemple, le temps qui passe. Bon, revenons à ma question - Qu'est ce qu'un script? C'est un programme, qui défini les actions à prendre en compte et comment y répondre.

Typiquement votre jeu WME sera construit de plusieurs Scripts. Disons que vous cliquez avec la souris sur une porte. Vous aurez besoin d'un script qui fera dire à votre personnage "la porte est verrouillée". J’espère que vous comprenez ce que je dit là. Plus nous avancerons dans ce chapitre, plus nous verrons de choses fantastiques de WME, mais nous allons commencé par le début.

Le cœur de la programmation de WME réside dans les commandes. Les commandes indiquent à WME quelle action effectuer. Nous pouvons avoir un tas de commandes différentes allant de la simple opération mathématique (addition, soustraction, etc…) à la commande plus complexe tel que ça, par exemple

Game.ChangeScene("une_scene.scene");

qui fait changer la scène actuelle à WME. Mais regardons les rudiments de la création de script(Scripting). Nous allons commencer par quelque chose qui s’appelle Variable. Qu'est ce qu'une variable? C'est une boite dans laquelle vous pouvez stocker des informations. Dans WME (contrairement au C++ par exemple) vous pouvez stocker n'importe quel type d'information dans votre variable (chaine, objet, nombre).

Regardons un exemple :

var myvar = "Hello World";

Le mot-clé var déclare un variable locale appelée myvar laquelle a été remplies avec le texte Hello World. Plus tard nous ferrons appelle au texte de la variable par exemple avec:

Game.Msg(myvar);

Cette ligne affichera Hello World sur l'écran du jeu.

Règle de syntaxe no.1 Comme vous pouvez le voir, toutes les commandes finissent par un point-virgule ;
De plus WME est très sensible au Majuscules/Minuscules! myvar n'est pas la même chose que MyVar. Garder bien ça en tête!

La règle très importante est que dans chaque script nous déclarons une variable qu'une seule fois. Ensuite nous y ferrons référence sans le mot-clé var.

Voyons quelques manipulations de base avec les variables:

var myvar = "Hello World"; 
Game.Msg(myvar); 
 
myvar = 1;		// nous stockons le chiffre 1 dans notre variable 
myvar = myvar + 1;  // Nous ajoutons 1 au chiffre stocké 
Game.Msg(myvar);	// Nous affichons le résultat (chiffre 2) 
 
myvar = myvar * 2; // on multiplie par 2 
myvar = myvar / 4; // divise par 4 
 
myvar = "Le résultat est " + myvar + "!"; 
Game.Msg(myvar); //Affiche Le résultat est 1!

Règle de syntaxe no.2

Si vous voulez commenter quelque chose, utilisez // pour une ligne simple de commentaire 
ou /* */ pour un bloc de commentaires. Les blocs commentées ou commandes ne serons pas exécutés  
 
Exemple: 
 
var a = 1; // Nous stockons 1 dans la variable a 
 
/*  Ce bloc  
   var a=1; 
   a = a +1; 
   a = 0; 
   ne sera jamais exécuté */

ASTUCE: Toujours nommer votre variable de façon intelligente ou vous ne retrouverez plus ce qu'il y a de stocké à l’intérieur. Bien sur que c'est marrant de nommer une variable petitNainRouge mais si vous regarder votre code 5 mois plus tard, vous essayerez désespérément de comprendre pourquoi cette variable marrante est là.Une autre pratique courante c'est d'utiliser les minuscules ou les Majuscules c'est la façon de mettre en majuscules les lettres dans votre nom de variable. Par exemple une variable devant contenir le nombre d’ingrédient ajoutés dans la bouilloire peut être appelée par exemple ingredientsBouilloire.

Comme vous avez le remarquer, j'ai parlé de quelque chose appelé variable locale. le mot locale signifie, que la variable n'est valide que dans le script où elle a été déclarée. Imaginé que vous ayez deux scripts tel que test1.script et test1.script que vont être exécutés à suivre:

fichier test1.script

var a = 10; 
Game.Msg(a); //affiche 10

fichier test2.script

var a = a + 1;  
Game.Msg(a); //affiche 1, parce que la variable n'est valide que dans CE script seulement et du coup sa valeur par défaut est 0

Mais comment faire si on veut partager des valeurs d'un script à un autre? Pour ça nous avons une autre sorte de variable appelée variable globale. Cette variable est déclarée en utilisant le mot-clé global et est valide dans tout le jeu!

Règle de syntaxe no.3
Dans chaque script où l'on veut utiliser une variable globale, ne devons déclarer cette variable par le mot-clé global.

Et maintenant c'est l'heure de faire de arithmétique:

  var a = 1 + 3;  // a = 4 
  a = 3 - 3;  // a = 0 
  a = 3 * 3; // a = 9 (* multiplier par) 
  a = 3 / 3; // a = 1 (/ diviser par)

Regardons notre exemple précédent à nouveau en supposant que test1.script est exécuté en premier et qu'ensuite c'est test2.script:

fichier test1.script

  global a = 10; 
  Game.Msg(a); //affiche 10

fichier test2.script

   global a = a + 1;  
   Game.Msg(a); //affiche 11, parce que la variable est valide pour tout le jeu.

Pour un exemple dans la réalité, disons que vous ayez un bouton dans une scène et que si vous pressez ce bouton, vous voulez qu'une porte dans une scène complétement différente s'ouvre. Vous déclare tout simplement une variable globale et la mettez sur true si le bouton a été appuyé. Dans la scène, où se trouve la porte, vous testez simplement cette variable globale et si c'est égale à true, vous ouvrez la porte. Simplement pour clarifier le terme "true", il y a 2 valeurs spéciales qui peuvent être mis dans les variables - true et false (vrai et faux). On en saura plus sur elles quand nous verront les conditions.

Nous avons découvert avec succès les variables, mais patience - il y a bien plus sur elles. Nous n'en sommes qu'au début.

2.1 Les tableaux magiques

Avant de commencer à parler de tableaux, je vais vous donner un exemple d'un réel problème dans les jeu. Imaginez que vous ayez une porte protégée par digicode. vous devez tapez les 4 chiffres correctement pour que la porte s'ouvre. Vous avez différentes façons de faire cela. Commençons par la pire:

Choix terrible: Depuis le chapitre suivant vous auriez certainement créer 4 variables différentes (par exemple code1, code2, code3, code4) et mis les chiffres tapés dedans. Puis vous les auriez contrôlé une par une pour voir si elles correspondent.

Choix extrêmement compliqué: Vous avez une variable et utilisant une multiplication et des mathématiques, vous créez un nombre que vous comparerez ensuite avec le nombre résultat.

Choix intelligent: vous utilisez un tableaux.

Vous pouvez imaginer in tableau composé de variables. Vous référencez ces variables en les indexant dans un tableau de variable. Cet index est un nombre commençant par 0. Je parie qu'un exemple vaudrais mieux qu'un milliers de mots. Nous allons définir une variable myArray et remplir 3 champs du tableau.

var myArray; 
 
myArray[0] = "Hello World";  
myArray[1] = "Je suis votre premier tableau"; 
myArray[2] = "OUUUAIIS!";

Et bien sur on peut faire:

Game.Msg(myArray[1]);

ou même

var a = 1; 
Game.Msg(myArray[a]);

ce qui affichera la même chose car la variable a contient le nombre 1.

Règle de syntaxe no.4
Nous disons à WME que nous voulons accéder au tableau en utilisant index de l'élément entre crochets.

Si on revient a notre exemple réel avec la porte codée, nous pouvons facilement mettre le code entier dans une seule variable.

var doorCode; 
 
doorCode[0] = 5;  
doorCode[1] = 2; 
doorCode[2] = 3; 
doorCode[3] = 7;

D'accord. Maintenant les codeurs curieux se demande déjà pourquoi on utilise pas quelque chose comme ça:

var doorCode = "5"; 
 
doorCode = doorCode + "2"; 
doorCode = doorCode + "3"; 
doorCode = doorCode + "7"; // le résultat sera 5237 dans une variable.

Bien, on pourrais, mais alors - comment faire si vous avez un code de porte plus complexe et vous vouliez changer, par exemple, le troisième chiffre lorsque tous les quatre ont été rentrés? Ca rend la chose un peu plus complexe et aussi - nous sommes en train de montrer les tableaux donc utilisons les.

Des que vous aurez l'habitude de les utiliser dans les scripts, vous trouverez plein d'utilités aux tableaux. La principale force des tableaux reside dans l'indexage. Vous pouvez accéder à la valeur de l'indice par programmation et c'est pourquoi nous allons examiner maintenant dans un autre exemple concret.

Vous avez surement vu comment les jeux les mieux conçus utilise différentes réponses pour une action de sorte que ce ne soit pas trop ennuyeux. Regardons comment on peu faire ça et utilisons un tableau pour cela. Nous allons aussi introduire une nouvelle commande appelée Random (aléatoire).

Random est une fonction qui retourne un nombre aléatoire dans une plage spécifiée. Nous parlerons des fonctions et comment elles fonctionnent plus tard, pour le moment prenez les comme quelque chose qui fonctionne sans se demander pourquoi.

var answerArray; 
answerArray[0] = "C'est coincé!"; 
answerArray[1] = "Je peux pas le bouger!"; 
answerArray[2] = "Pas de chance. Ça ne bougera pas!"; 
 
var reply = Random(0,2); // Nous remplissons la variable reply avec un nombre au hasard entre 0 et 2 
 
Game.Msg(answerArray[reply]); //On peut donc facilement afficher une réponse au hasard de notre série

Je pense que vous devez être un petit peu fatigué de parler variable Nous nous pencherons donc maintenant sur différentes choses pour revenir un peu plus tard à la grande partie appelés objets.

2.2 les Conditions

Habituellement nous savons ou nous allons. Nous avons parlé précédemment de l’exemple d'une porte et d'un bouton, nous avons perler de tester si le bouton etait appuyé. Mais comment faire ce test? Nous avons une commande de condition appelé if (si) qui le fait pour nous. Encore une fois commençons par du code:

var a = 1; 
 
if (a == 1) Game.Msg("A égal à 1"); // Cette ligne peut être lu : Si a est égal à 1 exécute la commande suivante

Cet exemple complétement inutilisable vous donne une première impression de ce que sont les conditions. Comme les test sont syntaxiquement plus compliqué nous allons nous focaliser sur la bas du test.

Comme vous pouvez le voir, la condition est entre parenthèses.

if (Insérer une condition ici) do quelque chose; ce qui peut être traduit par : si (Insérer une condition ici) fait quelque chose

Le test lui-même peut être fait par la logique suivante:

  1. Si nous voulons tester si quelque-chose est égal à quelque-chose alors on utilise

Si nous voulons tester si quelque-chose est égal à quelque-chose alors on utilise

==

Exemple:

if (a == 1)
  1. Si nous voulons tester si quelque-chose n'est pas égal à quelque-chose alors on utilise
    !=

    Exemple:

    if (a != 1)
  2. Si nous voulons tester si quelque-chose est supérieur à quelque-chose alors on utilise
    >

    Exemple:

    if (a > 1)
  3. Si nous voulons tester si quelque-chose est inférieur à quelque-chose alors on utilise
    <

    Exemple:

    if (a < 1)
  4. Si nous voulons tester si quelque-chose est inférieur ou égal à quelque-chose alors on utilise
    <=

    Exemple:

    if (a <= 1)
  5. Si nous voulons tester si quelque-chose est supérieur ou à quelque-chose alors on utilise
    >=

    Exemple:

    if (a >= 1)

Pour les variables (sont appelées booléens dans ce cas) qui sont true (vraies) ou false (fausses) on peut utiliser un raccourcit:

var a = true; 
if (a) Game.Msg("c'est vrai!"); 
if (!a) Game.Msg("c'est faux!");

Mais le plaisir ne s’arrête certainement pas là! Nous pouvons faire des tests bien plus complexes mais pour les comprendre, nous allons regarder autre chose.

Retour au début:

Prenons notre "if (a == 1)" et si on donnais préalablement la valeur 1 à notre variable a, nous pourrions ainsi lire la condition si 1 est égal à 1. Cet état est vrai.

Si on donnais la valeur 2 à la variable a, nous pourrions lire la condition si 2 est égal à 1. Cet état est faux.

Ceci elle la logique élémentaire de l'informatique en général. Les ordinateurs sont remplis cette logique vrai/faux et nous devons faire avec.

WME lit la condition et fait une évaluation. Si l’état est vrai, il exécute la commande, si l’état est faux, WME ne fait rien et continue. Regardez ceci:

Si nous revenons sur notre cas concret du bouton qui ouvre la porte, on pourrais écrire un script qui gère l’événement quand le bouton à été cliqué comme ceci:

global buttonCliked = true;

et puis dans l'autre script tester la porte comme cela:

global buttonCliked; 
if (buttonCliked) do quelque-chose qui ouvre la porte;

Bon maintenant que nous avons vu les bases des conditions, nous pouvons regarder comment tester plus d'une chose en même temps.

  1. On utilise l'opérateur && si on veut que les 2 conditions soient vraies. if (a > 1 && a < 10) signifie que a doit être supérieur à 1 et inférieur à 10
  2. On utilise l'opérateur || si on veut qu'au moins une des conditions soit vraie. if (a == "John" || b == 1) signifie que a doit être égal à John ou que la variable b doit être égal à 1.

Si on on veut grouper quelques conditions on utilise là encore des parenthèses:

if ( (a>1 && a<10) || (b =="John") ) est un des tests les plus complexes. Il exécutera la commande suivante si la variable a est supérieur à 1 ET inférieur à 10 OU if la variable b contient John.

Règle de syntaxe no.5
Si on veut exécuter plusieurs commande dans la condition, vous utilisez des accolades pour englober les commandes qui seront exécutées.

Exemple:

if (a == 2) { 
  Game.Msg("Hi!"); 
  Game.Msg("Hi again!"); 
}

Les 2 commandes seront exécutées si la variable a est égale à 2

Je pense que vous vous etes deja demandé si vous voulez tester une certaine condition mais vous voulez traiter seulement si l’état est faux. Et c'est là que la command else (sinon) entre en jeu.

var a = 1; 
 
if (a == 1) 
{ 
	Game.Msg("C'est encore vrai."); 
	a = 10; 
} 
else 
	Game.Msg("Tout faux dans le code.");


Vous pouvez, bien sûr, combiner le else avec plusieurs if jusqu’à l'absurde.

If est évidemment pratique, mais il il y a un exemple ou vous pouvez résoudre la situation d'une bien meilleur manière. Cette manière élégante s’appelle switch (aiguiller).

Ce que switch fait c'est d'aiguiller le programme vers différents chemin en fonction d'une variable.

Laisser moi vous montrer un exemple:

var a = Random(0,3); //ça, nous connaissons déjà! 
var b = ""; 
 
switch(a) 
{ 
	case 0: 
		Game.Msg("Choix 0"); 
		b = "Salut"; 
		break; 
	case 1: 
		Game.Msg("Choix 1"); 
		b = "Au revoir"; 
		break; 
	default: 
		Game.Msg("Tous les autres choix"); 
		b = "Que faire?"; 
}

Okay. Here’s quite a lot of things going on. First we branch the code according to the variable a. This variable can be any number ranging from 0 to 3 (because of Random function). If a equals to 0 then we go through the first branch until we reach the command break; If this command wasn’t there, WME would go through all branches until it finds one! So if you want to terminate the branch use break;

Each branch is defined by the keyword case. The specific syntax of case is that you define what should variable in the switch contain if you want to take this route. And after this value is a colon ( : ).

We can also test for strings with for example *case "Sword":*

And again – we enclose the whole nesting in the curly brackets. We’ll see a lot of curly brackets later on.

BUG: Don’t use loops inside of the case branches. They don’t work. If you need, write a function (explained later) which will contain the loop. This workaround works.

 
fr/wmebook/ch2.1318860419.txt.gz · Last modified: 2011/10/17 16:06 by Anto0085
Recent changes RSS feed Creative Commons License Driven by DokuWiki