Differences

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


fr:wmebook:ch3 2011/10/19 10:54 fr:wmebook:ch3 2011/10/25 13:49 current
Line 1: Line 1:
-====== 3. Premier tour dans les entrailles de WME ======+====== 3. Premier pas dans les entrailles de WME ======
Nous avons découvert les outils et nous avons appris les bases du script, il maintenant temps de voir comment ces connaissances s'applique à la conception d'un jeu. Avant de commencer ce tour nous allons d'abord faire un bref survol des types de fichiers que vous allez utiliser dans WME (et je recommande fortement d'utiliser cette convention de nomination): Nous avons découvert les outils et nous avons appris les bases du script, il maintenant temps de voir comment ces connaissances s'applique à la conception d'un jeu. Avant de commencer ce tour nous allons d'abord faire un bref survol des types de fichiers que vous allez utiliser dans WME (et je recommande fortement d'utiliser cette convention de nomination):
Line 241: Line 241:
Sauvegarder tous les scripts et lancer le jeu. Testez le jeu à fond de sorte que vous soyez sûr que vous comprenez vraiment le codage derrière cette logique. C'est l'un des aspects essentiels de la conception de jeu d'aventure et si vous y arrivé bien, vous saurez en un rien de temps créer vos propres aventures. Sauvegarder tous les scripts et lancer le jeu. Testez le jeu à fond de sorte que vous soyez sûr que vous comprenez vraiment le codage derrière cette logique. C'est l'un des aspects essentiels de la conception de jeu d'aventure et si vous y arrivé bien, vous saurez en un rien de temps créer vos propres aventures.
-**----------------------------------------------------------------  TRADUCTION EN COURS  --------------------------------------------------------------------------**+
**Important:** **Important:**
Chose essentielle à savoir c'est comment fonctionne les chemins dans WME en général. Nous avons vu dans **Game.ChangeScene("scenes\room\room.scene");** que nous n'avons pas commencé par le chemin des données. C'est tout à fait correcte! Écrivez-ça mille fois – Je n'inclurais jamais le nom du Package racine dans le chemin référencé. Pourquoi? Parce que cela fonctionnerait uniquement en mode debug, et lorsque vous compilez votre jeu dans les packages et le distribuez, ça ne marchera pas. La même chose s'applique à tous les fichiers (images, sons, etc.) Jamais référencer les fichiers en dehors des packages. Ils fonctionnerons en mode débogage, mais ne serons pas compilé et vous serez dans le pire des cauchemars. Pensez au Packages comme des répertoires racines virtuels et que tout référencement devrait partir de ce point. On en saura plus à ce sujet dans le chapitre sur les Packages. Chose essentielle à savoir c'est comment fonctionne les chemins dans WME en général. Nous avons vu dans **Game.ChangeScene("scenes\room\room.scene");** que nous n'avons pas commencé par le chemin des données. C'est tout à fait correcte! Écrivez-ça mille fois – Je n'inclurais jamais le nom du Package racine dans le chemin référencé. Pourquoi? Parce que cela fonctionnerait uniquement en mode debug, et lorsque vous compilez votre jeu dans les packages et le distribuez, ça ne marchera pas. La même chose s'applique à tous les fichiers (images, sons, etc.) Jamais référencer les fichiers en dehors des packages. Ils fonctionnerons en mode débogage, mais ne serons pas compilé et vous serez dans le pire des cauchemars. Pensez au Packages comme des répertoires racines virtuels et que tout référencement devrait partir de ce point. On en saura plus à ce sujet dans le chapitre sur les Packages.
-Passons à la dernière partie de ce chapitre, qui  +Passons à la dernière partie de ce chapitre, qui couvrira les problèmes de Daemon (programme fonctionnant en tache de fond). Nous allons commencer tout de suite avec notre premier démon(Daemon). Avant d'expliquer comment ca marche, nous allons jeter un œil sur quelques nouvelles méthodes:  
-Let’s move on to the last part of this chapter, which will cover the daemon issue. We’ll start right off with our first daemon. Before we explain how it works, we’ll have to take a look at a few new methods:+ 
 +**Game.AttachScript(filename);** - Attache un nouveau fichier de script à l'objet jeu (Game), ce qui le rend global pour le jeu entier. Ce script est attaché jusqu'à ce qu'il soit détaché ou se termine. 
 +**Game.DetachScript(filename);** - Détache un script de l'objet jeu (Game).
-**Game.AttachScript(filename);** - Attaches a new script file to the Game object, making it global for the whole game. This script is attached until it’s detached or ends+**Scene.AttachScript(filename);** - Attache un nouveau fichier de script à la scène courante, le rendant actif tant que le joueur ne change pas de scène courante, ou qu'il soit détaché ou se termine
-**Game.DetachScript(filename);** - Detaches script from the Game object.+**Scene.DetachScript(filename);** - Détache un script de l'objet Scène.
-**Scene.AttachScript(filename);** - Attaches a new script file to the current scene,  making it active until player doesn’t change the current scene, or script is detached or ends. +Nous pouvons évidemment attacher un script à l'objet Scène dans l'éditeur de scènes ou un script à l'objet Jeu (Game) dans le gestionnaire de projets, mais nous voulons que notre script soit attaché au milieu du jeu.
-**Scene.DetachScript(filename);** - Detaches script from the Scene object.+
-We can of course attach script to the scene object in the Scene Editor or script to Game object in the Project Manager, but we want our script to be attached in the middle of the gameplay. +La commande suivante que nous allons apprendre est absolument nécessaire pour écrire les Daemons. C'est la commande Sleep.
-Next command we’d learn is totally necessary for the daemon writing. It’s command Sleep. +**Sleep(time);** - Met en pause le script pendant un certain nombre de millisecondes.
-**Sleep(time);** - Pauses the script for certain amount of milliseconds. +
-Sleep serves two purposes. First - it lets the script wait for certain amount of time and second - it hands the program flow to other threads. Here’s the typical daemon pitfall:+Sleep a deux fonctions. Première - il permet au script d'attendre certaine quantité de temps, et la deuxième - elle donne la main au flux du programme pour d'autre tâches. Là c'est le piège typique des Daemon:
<code script> <code script>
var a = 0; var a = 0;
-while (1) // infinite loop, the same as while(true)+while (1) // Boucle sans fin, c'est pareil que while(true)
{ {
  a = a + 1;   a = a + 1;
Line 270: Line 270:
</code> </code>
-**Never do this. It’ll halt your computer. Script takes over the whole processing power and the rest of the game never get control back. This way also Windows never gets control back which results in hung up computer.** So how to fix this?+**Ne jamais faire cela. Ça va stopper votre ordinateur.Le Script prend toute la puissance de traitement et le reste du jeu ne peu plus reprendre le contrôle. En faisant cela, Windows non plus ne pourra recuperer la main ce qui entraine une extinction de l'ordinateur.** Alors comment résoudre ce problème?
<code script> <code script>
Line 282: Line 282:
</code> </code>
-This daemon is correct (remember our previous chapter), because it hands over the control from the script. One millisecond is here only formally. The important fact is that you DO hand over the control.+Ce Daemon est correcte (Souvenez vous du chapitre précédent), parce que ca peut reprend la main sur le script. Une milliseconde c'est ici symbolique. Le fait important est que vous donner la main.
-So enough theory and let’s make some daemon fun with the commands, we’ve just learned. Oh wait. We’d need one more command:+Bon assez de théorie et façon quelques Daemon marrants avec les commandes que nous venons juste de voir. Oh attendez. Nous aurions besoin d'une commande supplémentaire:
-**Game.Msg(text);** - although we’ve seen it before let’s recap that it displays an onscreen debug message. Very useful command.+**Game.Msg(text);** - Bien que nous l'ayons vu auparavant rappelons qu'elle affiche un message de débogage à l'écran.
-What we’re going to do is a funny little timed sequence, which occurs in our warehouse scene. The scenario is as follows. Player examines the door to discover that there’s a time bomb attached to it. If he can’t exit quickly enough, the Scene is reloaded (it’s the hardcore-adventure-fan-way how to tell the player, that he has died).+Ce que nous allons faire est un drôle de petite séquence chronométrée, qui va se passer dans notre scène de l'entrepôt. Le scenario est le suivant. Le joueur examine la porte et découvre qu'il y a une bombe attachée dessus. S'il ne sort pas assez rapidement, la scène est rechargée (c'est la façon "fan d'aventures hardcore" de dire au joueur, qu'il est mort).
-First we’ll create the new script in the scr folder (from the empty template) and name it **bomb.script**.+Premièrement nous allons créer le nouveau script dans le répertoire scr (à partir d'un modèle vierge (Empty template) ) et le nommer **bomb.script**.
-Tip: if you get more skilled, you can add the new files manually by creating a text file with a script extension created in the corresponding folder+Astuce : si vous êtes plus expérimenté, vous pouvez ajouter les nouveaux fichiers manuellement en créant un fichier texte avec une extension script créé dans le dossier correspondant
-Then we modify the **door.script** so it’ll read the following:+ 
 +Ensuite modifiez **door.script** pour avoir cela:
<code script> <code script>
Line 300: Line 301:
on "LeftClick"  on "LeftClick" 
{ {
- Game.Interactive = false;    // We want our player to make more things at once and we don't want to be interrupted.+ Game.Interactive = false;    // Nous voulons que notre joueur fasse plusieurs choses à la fois et nous ne voulons pas être interrompu.
actor.GoToObject(this); actor.GoToObject(this);
- this.Active = false;  // We disable the door so the hotspot is not visible or active anymore+ this.Active = false;  // Nous désactivons la porte afin que le hot-spot ne soit plus visible ou active du tout
- actor.Talk("Oh no. There's a timed bomb attached to the door! I have to find an exit before it explodes."); + actor.Talk("Oh non. Il y a une bombe à retardement attachée à la porte! Je doit m’échapper avant qu'elle n'explose.");
Scene.AttachScript("scenes\warehouse\scr\bomb.script"); Scene.AttachScript("scenes\warehouse\scr\bomb.script");
- Game.Interactive = true; // Allow player to play some more.+ Game.Interactive = true; // Permet au joueur de jouer de nouveau.
} }
</code> </code>
-I’ve hilighted the line which attaches our new script and thus starting the countdown+J'ai ajouté la ligne qui attache notre nouveau script et donc démarre le compte à rebours
-Now let’s look at the **bomb.script** contents.+Maintenant regardons le contenu de **bomb.script**.
<code script> <code script>
#include "scripts\base.inc" #include "scripts\base.inc"
-for (var timer=6;timer>-1;timer = timer -1)  // let's set up a loop which would go down from 6 to 0.+for (var timer=6;timer>-1;timer = timer -1)  // Mettons en place une boucle qui passerait de 6 à 0.
{ {
- Game.Msg("Countdown: " + timer); //Let's display how much time do we have left. + Game.Msg("compte à rebours: " + timer); //Affichons combien de temps il nous reste 
- Sleep(1000); // Sleep one second (and also hand the game over to other threads)+ Sleep(1000); // Pause une seconde (et laisse aussi la main au jeu pour d'autres tâches)
} }
-Game.Interactive = false; //Death cutsene +Game.Interactive = false; //Scène de la mort 
-actor.Talk("I've just died. Let's try again");+actor.Talk("J'suis mort. Essayez encore.");
Game.ChangeScene("scenes\warehouse\warehouse.scene"); Game.ChangeScene("scenes\warehouse\warehouse.scene");
var door = Scene.GetNode("Door"); var door = Scene.GetNode("Door");
-door.Active = true; // If we die, we need to return the door to its active state or we'll never discover the bomb again.+door.Active = true; // Si nous mourons, nous avons besoin de remettre la porte à son état actif ou nous ne pourrons pas découvrir la bombe de nouveau.
Game.Interactive = true; Game.Interactive = true;
</code> </code>
-And the last change we’ll make is to the **exit.script**. If we found an exit in time, actor will be able to escape, but what if he arrives there in the nick of time and while talking his line, the time runs away and he dies? So let’s prevent this from happening by detaching the bomb script and letting him say something more reasonable.+Et le dernier changement que nous allons faire est dans **exit.script**. Si vous trouvez la sortie à temps, l'acteur doit pouvoir s’échapper, mais s'il y arrive juste à temps et tout en disant sa ligne, le temps passe et qu'il meurt? Alors nous allons éviter cela en détachant le script de la bombe et le laisser parler ça serait quelque chose de plus raisonnable.
-So the contents of the **exit.script** would look like this:+Donc le contenu de **exit.script** devrait ressembler à ça:
<code script> <code script>
Line 342: Line 343:
if (door.Active) if (door.Active)
{ {
- actor.Talk("I don't want to return to my flat before I am sure I can't enter the warehouse!");+ actor.Talk("Je ne veux pas retourner à mon appart avant d’être sûr que je ne peux pas entrer dans l'entrepôt!");
} }
else else
{ {
Scene.DetachScript("scenes\warehouse\scr\bomb.script"); Scene.DetachScript("scenes\warehouse\scr\bomb.script");
- actor.Talk("Phew. That was close");+ actor.Talk("Ouf. C'était juste");
Game.ChangeScene("scenes\room\room.scene"); Game.ChangeScene("scenes\room\room.scene");
} }
Line 354: Line 355:
</code> </code>
-Save everything and test our little scheme to see some more of the effects.+Sauvegardez tout et testez notre petit système pour voir un peu plus sur les effets.
-On closing of this chapter I’ll introduce a little change to our scheme. This change is not necessary in our example, but it will be necessary in different case. For now we’re testing, if the entity region Door is Active for another decision. But what if we need to apply the similar logic to more than one scene? If we stand in different scene, we logically can’t use entity this way because it’s not anymore part of the current scene.+Pour clore ce chapitre je vais ajouter un petit changement à notre système. Ce changement n'est pas nécessaire dans notre exemple, mais il le serais dans d'autres cas. Pour le moment nous avons testé, si l'entité région door est active pour prendre une décision. Mais que faire si nous avons besoin d'appliquer cette même logique sur plus d'une scène? Si nous nous tenons dans une scène différentes, logiquement nous ne pouvons pas utiliser une entité de cette façon parce qu'elle ne fait plus partie de la scène courante.
-So what we can do is using a global variable. Let’s make a change to our scripts then+Donc ce que nous pouvons faire c'est d'utiliser une variable globale. Faisons un changement dans nos scripts alors
-Last code listing for this script triplet is then (changes in bold):+ 
 +Ainsi la derniere liste de code de ce triplet de script sera :
**bomb.script** **bomb.script**
Line 365: Line 367:
#include "scripts\base.inc" #include "scripts\base.inc"
-for (var timer=6;timer>-1;timer = timer -1)  // let's set up a loop which would go down from 6 to 0.+for (var timer=6;timer>-1;timer = timer -1)  // Mettons en place une boucle qui passerait de 6 à 0.
{ {
- Game.Msg("Countdown: " + timer); //Let's display how much time do we have left. + Game.Msg("compte à rebours: " + timer); //Affichons combien de temps il nous reste 
- Sleep(1000); // Sleep one second (and also hand the game over to other threads)+ Sleep(1000); // Pause une seconde (et laisse aussi la main au jeu pour d'autres tâches)
} }
-Game.Interactive = false; //Death cutsene +Game.Interactive = false; //Scène de la mort 
-actor.Talk("I've just died. Let's try again");+actor.Talk("J'suis mort. Essayez encore.");
var door = Scene.GetNode("Door"); var door = Scene.GetNode("Door");
-door.Active = true; // If we die, we need to return the door to its active state or we'll never discover the bomb again.+door.Active = true; // Si nous mourons, nous avons besoin de remettre la porte à son état actif ou nous ne pourrons pas découvrir la bombe de nouveau.
global doorClicked = false; global doorClicked = false;
Game.ChangeScene("scenes\warehouse\warehouse.scene"); Game.ChangeScene("scenes\warehouse\warehouse.scene");
Line 386: Line 388:
on "LeftClick"  on "LeftClick" 
{ {
- Game.Interactive = false;    // We want our player to make more things at once and we don't want to be interrupted.+ Game.Interactive = false;    // Nous voulons que notre joueur fasse plusieurs choses à la fois et nous ne voulons pas être interrompu.
global doorClicked = true; global doorClicked = true;
actor.GoToObject(this); actor.GoToObject(this);
- this.Active = false;  // We disable the door so the hotspot is not visible or active anymore+ this.Active = false;  // Nous désactivons la porte afin que le hot-spot ne soit plus visible ou active du tout
- actor.Talk("Oh no. There's a timed bomb attached to the door! I have to find an exit before it explodes."); + actor.Talk("Oh non. Il y a une bombe à retardement attachée à la porte! Je doit m’échapper avant qu'elle n'explose.");
Scene.AttachScript("scenes\warehouse\scr\bomb.script"); Scene.AttachScript("scenes\warehouse\scr\bomb.script");
- Game.Interactive = true; // Allow player to play some more.+ Game.Interactive = true; // Permet au joueur de jouer de nouveau.
} }
</code> </code>
Line 407: Line 409:
if (!doorClicked) if (!doorClicked)
{ {
- actor.Talk("I don't want to return to my flat before I am sure I can't enter the warehouse!");+ actor.Talk("Je ne veux pas retourner à mon appart avant d’être sûr que je ne peux pas entrer dans l'entrepôt!");
} }
else else
{ {
Scene.DetachScript("scenes\warehouse\scr\bomb.script"); Scene.DetachScript("scenes\warehouse\scr\bomb.script");
- actor.Talk("Phew. That was close");+ actor.Talk("Ouf. C'était juste");
Game.ChangeScene("scenes\room\room.scene"); Game.ChangeScene("scenes\room\room.scene");
} }
Line 419: Line 421:
</code> </code>
-We’ve seen in this chapter some neat tricks with the way how we can handle the game logic. We’ve also learned some of the important concepts for the tying scene to the code and we are able to use a couple of very basic commands and object methods. But for now we all the time used a lot of prebuilt demo code. Next chapter is all about starting the project from scratch. We’ll build upon this blank project until we create a little feature packed game. So stay tuned, we’re getting into it.+Nous avons vu dans ce chapitre quelques astuces intéressantes avec la façon dont on peut gérer la logique du jeu. Nous avons aussi appris quelques notions importantes pour lier les scène au code et nous sommes capable d'utiliser un certain nombre de commandes et de méthodes objet très basiques. Mais pour le moment nous avons tout le temps utilisé un grand nombre de codes d'une démo pré-compilés. Le prochain chapitre est au sujet du démarrage d'un projet à partir de zéro. Nous allons partir d'un projet vierge jusqu'à créer un jeu tout simple compilé. Alors restez à l'écoute, on y va.
 
fr/wmebook/ch3.1319014456.txt.gz · Last modified: 2011/10/19 10:54 by Anto0085
Recent changes RSS feed Creative Commons License Driven by DokuWiki