Differences

This shows you the differences between the selected revision and the current
version of the page.


fr:wmebook:ch2 2011/10/17 16:53 fr:wmebook:ch2 2011/10/19 13:12 current
Line 118: Line 118:
-====== 2.1 Les tableaux magiques ======+ 
 +====== 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: 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:
Line 224: Line 225:
-====== 2.2 les Conditions ======+ 
 + 
 +====== 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: 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:
Line 353: Line 356:
BUG: Ne pas utiliser de boucles à l’intérieur des branches case. Elles ne fonctionnent pas. If vous en avez besoin, écrivez une //fonction// (expliqué plus tard) qui contient la boucle. Cette parade fonctionne. BUG: Ne pas utiliser de boucles à l’intérieur des branches case. Elles ne fonctionnent pas. If vous en avez besoin, écrivez une //fonction// (expliqué plus tard) qui contient la boucle. Cette parade fonctionne.
 +
 +
 +
Line 358: Line 364:
====== 2.3. Les boucles ====== ====== 2.3. Les boucles ======
-**EN COURS DE TRADUCTION**+
Il y a plein de fois où on veut utiliser une action répétitive. WME fournit diverses façons de réaliser cela. Il y a plein de fois où on veut utiliser une action répétitive. WME fournit diverses façons de réaliser cela.
Line 401: Line 407:
</code> </code>
-Cet exemple probablement inutile encore une fois evalue l'expression dans le while et si c'est vrai, il execute le bloc. En d'autre terme, tant que a n'est pas egal à 5, mettre un autre nombre aléatoire dedans.+Cet exemple probablement inutile encore une fois évalue l'expression dans le while et si c'est vrai, il exécute le bloc. En d'autre terme, tant que a n'est pas egal à 5, mettre un autre nombre aléatoire dedans.
**Important:** **Important:**
 +Maintenant vous vous demandez surement qu'est ce que vient faire là cette commande Sleep(1);. Il s'agit d'un problème un peu plus poussé, mais si vous essayez la boucle sans le Sleep, votre jeu va bloquer et parfois l'ordinateur aussi. Pourquoi? Parce que la boucle while voudra tourner et tourner bouffant un tas de ressource du processeur. Et le reste du moteur, fera attention au timing et les autres chose ne seront pas la priorité! Alors l'ensemble WME voudra seulement tourner. Et si vous êtes pas chanceux et que le random n'est pas de votre coté, donnant tout les autres nombre que 5, votre ordinateur aura de sérieux problèmes. La fonction Sleep() qui exige du temps en millisecondes ne fait pas quelque chose de gênant. Une pause d'une milliseconde est difficilement percevable, mais elle permet au processus de reprendre la main sur script! Ainsi votre jeu ne sera jamais bloqué.
-Now you’re probably wondering what is going on with that Sleep(1); command. This is a bit more advanced issue, but if you tried the loop without the Sleep, your game would freeze and sometimes even your computer too. Why? Because the while loop would loop and loop and loop eating a lot of processor power. And the rest of the engine, which takes care of the timer and other things would never get the priority! So the whole WME would just loop. And if you’re unlucky and Random won’t be on your side returning all other numbers than 5, your computer will have serious problems. Function Sleep() which takes time in milliseconds doesn’t do anything obvious. Waiting one millisecond can hardly be noticed, but it returns control from this script to other processes! So your game will never get stuck+Il y a aussi une autre utilité pour les boucles **while** - qu'on appelle //boucle sans fin//. 
 + 
 +Ça peut être illustré par cet exemple: 
 +<code script> 
 +while (1) 
 +
 +  //faire quelque chose ici;// 
 +  Sleep(1); 
 +
 +</code> 
 + 
 +ces boucles sont vraiment sympa pour faire quelque chose en processus de fond que vous auriez besoin d’étendre sur l'ensemble du jeu. Par exemple, vous pouvez vérifier si la musique de fond joue et si elle stoppe, vous pouvez jouer une autre chanson de la play-list ou dans le projet de démonstration ce processus gère l'affichage des légendes (score par exemple). 
 + 
 + 
 + 
 + 
 +====== 2.4. Les Fonctions ====== 
 + 
 +Comme nous avons pu le voir dans le cas de Sleep() ou Random(), il y a des chose appelés Fonction. Une fonction est un tres gros gain de temps, parce qu'elle prend en charge plusieurs lignes de code. Imaginez cet exemple : Vous voulez afficher dix fois le mot Hell. Mais vous voulez le faire plus d'une fois dans votre code. Sans les fonctions vous devriez faire ca: 
 + 
 +<code script> 
 +for (var a=0; a<10;a=a+1) Game.Msg("Hell"); 
 +Game.Msg("1"); 
 +for (a=0; a<10;a=a+1) Game.Msg("Hell"); // Notez que j'ai viré le var comme il était déjà déclaré avant. 
 +Game.Msg("2"); 
 +for (a=0; a<10;a=a+1) Game.Msg("Hell");  
 +Game.Msg("3"); 
 +</code> 
 + 
 +Fouillis, non? Nous allons nous simplifier la tache en utilisant une **fonction**. Une focntion c'est un morceau de code réutilisable. C'est défini ^par le mot-clé **function**, nommé à votre guise et des parenthèses dans lesquelles vous pouvez éventuellement mettre quelques paramètres. La sortie de la fonction est designé par le mot-clé **return;** Noter que return oblige à quitter immédiatement la fonction, on peut donc l'utiliser avec quelque code de logique à branches. Donc la déclaration de base pourrait être comme ceci :  
 + 
 +<code script> 
 +function Hell() 
 +
 +  for (a=0; a<10;a=a+1)  
 +  Game.Msg("Hell");  
 +  return; 
 +
 + 
 +Hell(); 
 +Game.Msg(1); 
 +Hell(); 
 +Game.Msg(2); 
 +Hell(); 
 +Game.Msg(3); 
 +</code> 
 + 
 +Vous voyez, c'est beaucoup plus lisible. Mais c'est qu'un début. Imaginez qu'a chaque passage vous deviez écrire 10 fois un mot différent. C'est là que les fonction commence réellement à donner un coup de pied. Nous allons redéfinir notre fonction en ajoutant deux paramètres et la renommer en writeText par exemple. 
 +  
 +<code script> 
 +function writeText(what,count)  
 +
 +  for (a=0; a<count;a=a+1)  
 +  Game.Msg(what);  
 +  return; 
 +
 + 
 +writeText("Hell",10); 
 +writeText("on",2); 
 +writeText("Earth",5); 
 +</code> 
 + 
 +Dans la fonction les paramètres fonctionnent comme des variables locales qui ne sont valable qu'a l’intérieur de la fonction. Ainsi notre fonction a deux paramètres. Le premier désigne quoi écrire et le second combien de fois il doit être écrit. Notre programme ecrirai 10 fois //Helle//, 2 fois //on// et 5 fois //Earth//. Comme vous pouvez le voir, cette fonction simplifie encore plus notre tâche. 
 + 
 +Donc nous savons introduire des données dans la fonction, mais les fonctions peuvent aussi nous retourner des donnée. L'exemple type de ce genre de fonction est Random. Comme nous l'avons vu précédemment, Random attend 2 paramètres et retourne un résultat. Nous pouvons faire pareil au moyen du mot-clé **return**. Écrivons une fonction simple: 
 + 
 +<code script> 
 +function estPlusGrand(nombre1, nombre2) 
 +
 +    if (nombre1 > nombre2) return true; 
 +    return false; 
 +
 + 
 +if (estPlusGrand(1,7)) Game.Msg("Le nombre est supérieur"); 
 +else 
 + Game.Msg("Le nombre est inférieur"); 
 +</code> 
 + 
 +//**Règle de syntaxe no. 6** 
 +Le nom de la fonction ne doit contenir que des caractères alphanumérique et ne doit pas avoir d'espace.// 
 + 
 +Tout devrais être plus clair à ce niveau. Si ça ne l'est pas, s'il vous plait revoyez le chapitre précédent avant que vous ne puissiez plus comprendrez ce qui arrive. La seul chose important est que nous sommes passé à la commande **if**, au lieu de notre bonne vieille comparaison directe, une //fonction//,qui retourne true ou false. La commande **if** évalue la fonction (qui dans se cas retourne //false//) et exécute le bloc //else//. 
 + 
 + 
 +====== 2.5. Les Includes ====== 
 + 
 +Comme nous venons de voir les fonctions peuvent etre vraiment utiles mais il y a hic. Il n'y a pas de façon de définir une fonction globale. Il existe bien deux solutions - Grâce aux Includes et aux Objects. Parlons des Includes.  
 + 
 +Si vous avez regardé un peu dans les projets démo de WME, vous avez vu, que tous les script commence par la ligne 
 + 
 +<code script>#include "scripts\base.inc"</code> 
 + 
 +Cette ligne ajoute des le départ le contenu du fichier scripts\base.inc dans ce fichier. A quoi ça sert? Bien, par exemple, si vous ne voulez pas de déclarer vos variables globales à chaque fois que vous en avez besoin dans un nouveau script, il suffit de les mettre dans un fichier .inc et de les inclure. Si vous les mettez dans votre fichier base.inc, vous aurez cette ligne automatiquement incluse à cause du modèle scène. Utile n'est ce pas? Mais c'est pas tout. Vous pouvez aussi mettre vos fonctions couramment utilisées dans certaines fichiers include et les inclurent, si bien que vous n'aurez plus besoin de les copier / coller dans tous les scripts où vous en avez besoin. Notez qu'il n'y a pas de point-virgule à la fin de ligne include! 
 + 
 +**Important:** 
 +Ne jamais initialiser vos variables dans les fichiers include. Elles seraient réinitialisée a chaque inclusion de votre script. 
 + 
 + 
 + 
 + 
 + 
 + 
 +====== 2.6. Les Objets ====== 
 + 
 +Le dernier chapitre est dédié à un parie vraiment cool du langage de programmation de WME - Les Objets. 
 + 
 +Nous allons démarrer doucement avec la réflexion suivante. Imaginez que vous ayez un objet du monde réel. disons une table. Évidemment le terme table est plutôt abstrait - elle peut être faite de plastique, bois, métal ou autre, elle peut avoir plusieurs couleurs, elle peut être chère ou pas. Ça serais pas génial d'avoir toutes les informations sur cette table ensembles?  
 + 
 +<code script> 
 +var table; 
 + 
 +table.Material = "bois"; 
 +table.Color = "noire"; 
 +table.Price = 100; 
 + 
 +Game.Msg(table.Price); 
 +</code> 
 + 
 +Ce que nous avons fait ici est que nous avons défini une variable, mais au lieu d’accéder directement a cette variable, nous avons défini quelques //Attributs// à cette variable. Nous ne pouvons plus utiliser la variable comme une simple boite. Elle est devenue un objet pour nous. 
 + 
 +Maintenant vous devez certainement penser "C'est bien beau tout ça, mais comment faire si nous avons 10 tables. Avons-nous besoin de 10 variables et de les déclarer comme ça? Ça sera de nouveau le bazar". 
 + 
 +Bon, la magie des Objets n'est pas seulement dans les //attributs//, mais aussi dans les **méthodes**. Une méthode c'est une fonction normale, qui appartient à l'objet. Toutes les fois que vous avez utilisé Game.Msg et seulement maintenant vous découvrez, que c'est une méthode de l'objet Game. Le pire est, que presque tout ce dont vous aurez accès du côté de WME est orienté objet et c'est sûr vous allez rencontrer votre dose d'objets. 
 + 
 +Mais revenons à notre tâche en cours - comment pouvons-nous réellement définir un objet pour être plus souple qui as seulement quelques attributs? 
 + 
 +Premièrement nous allons créer un fichier de définition d'objet. appelons-le table.script. 
 + 
 +<code script> 
 +#include "scripts\base.inc" 
 + 
 +method initialize(material, color, price) 
 +
 +  this.Material = material; 
 +  this.Color = color; 
 +  this.Price = price; 
 +
 +</code> 
 + 
 +//**Règle de syntaxe no. 5** 
 +Si nous voulons accéder à un attribut ou une méthode d'un objet, nous utilisons le point comme vu dans l'exemple précédent.// 
 + 
 +Comme nous le voyons là, nous sommes à l’intérieur de l'objet donc on ne peut plus utiliser table.Material etc... parce que nous ne savons pas comment la variable englobant notre table sera appelée. C'est pourquoi nous avons un identifiant spécial appelé **this** qui pointe sur l'objet lui-même. De cette façon ça définira toujours l'attribut à la bonne variable. 
 + 
 +Dans le script nous voulons créer un tel objet, nous devons d’abord le créer: 
 + 
 +<code script> 
 +var table = new Object("table.script");  
 +</code> 
 + 
 +et puis nous pouvons configurer les propriétés de l'objet ainsi 
 + 
 +<code script> 
 +table.initialize("bois","noire",100); 
 +</code> 
 + 
 +Cela paraît déjà beaucoup plus souple, mais nous pouvons aller encore un peu plus loin. Disons que nous allons créer un jeu sur un vendeur de table qui aura 10 tables différentes. Pourquoi ne pas utiliser un tableau pour elles? 
 + 
 +<code script> 
 +for (var a=0;a<10;a=a+1) 
 +
 +  tables[a] = new Object("table.script"); 
 +
 +</code> 
 + 
 +Mais voilà il y a un piège! Vous ne pouvez pas faire quelque chose comme: **tables[a].initialize();** parce WME ne supporte pas la notation de point pour tableaux ou des objets imbriqués. Pas plus que vous ne pouvez pas faire quelque chose comme Game.Scene.SomeAttribute parce WME ne supporte qu'un seul point imbrication. Mais il y a une solution de contournement grâce à la variable temporaire. 
 + 
 + 
 +Le premier cas serait réécrit comme: 
 +<code script> 
 +var tmp = tables[a]; 
 +tmp.initialize("bois","noire",100); 
 +</code> 
 + 
 +et l'autre comme: 
 + 
 +<code script> 
 +var tmp = Game.Scene; 
 +tmp.SomeAttribute = 1; 
 +</code>
 +Je pense que cela devrait être suffisant pour vous permettre de commencer avec les scripts. Le reste est juste une application de ce que vous venez d'apprendre. Je suis sûr que vous n'aurez aucune difficulté à comprendre ce qui se passe maintenant.
 
fr/wmebook/ch2.1318863181.txt.gz · Last modified: 2011/10/17 16:53 by Anto0085
Recent changes RSS feed Creative Commons License Driven by DokuWiki