Steelbox
RECHERCHE
INFORMATIQUE
PASSIONS
¤ TGE

Torque Game Engine (TGE) est le moteur de jeu que j'ai utilisé lors de mon premier stage dans le monde des jeux vidéo. Un moteur de jeux est un programme qui rassemble plein d'éléments qui permettent à un jeu d'exister plus facilement et qui a ses caractéristiques propres. Il est possible d'établir un classement des moteurs de jeux. Concernant Torque, on verra qu'il s'oriente plus vers des jeux en réseaux (FPS, jeux de voitures,...). Ce moteur a déjà été utilisé pour des jeux commerciaux (Tribes 2, Marble Blast, Think Tanks...). Il utilise OpenGL (il est également possible d’utiliser DirectX mais le résultat est en général moins voir peu satisfaisant), ce qui le rend portable sur plusieurs plates-formes comme Windows, Mac et Linux.

De plus, la communauté rassemblée autour de ce moteur est en plein essor et la liste des fonctionnalités supportées par ce moteur ne cesse de s'allonger. Ceci n'est sûrement pas un hasard et prouve que ce moteur a de réels atouts. Tout ou presque est faisable par script (portant l'extension .cs). Le moteur gère le texturage, de nombreuses méthodes d'ombrages et de lumières. Torque n'incorpore pas de vrai moteur physique (comme ODE par exemple), mis à part le fait qu'il gère les collisions entre objets. Il possède également quelques options supplémentaires (comme les effets de particules avec gestion du vent, de la gravité,...).

Il existe des packs vendus par des développeurs indépendants pour l'intelligence artificielle, des objets 3D, ...

Le moteur n'est pas entièrement gratuit puisqu'il coûte 100 dollars, mais ce n'est rien comparé à ce que pourrait coûter d'autres moteurs de jeux professionnels comme Renderware. En plus, il n'y a pas d'obligations supplémentaires, même si vous avez l'intention de vendre votre jeu donc tout le monde est à la même enseigne avec ce moteur.

 

Torque : un moteur de type Client/Serveur

Torque engine est un moteur plutôt orienté pour les jeux en réseau puisqu’il se base sur un mécanisme de client/serveur avec une distinction du rôle des 2 acteurs :

- serveur : il contient les fonctions de décisions de hauts niveaux.

- client : il s'occupe de la GUI, de la gestion des langues pour les menus. Il utilise des fonctions fournies par le serveur.

Torque peut aussi être utilisé pour un jeu en local bien sûr, mais les performances pourront être réduites si le trafic réseau est important.

 

Il faut savoir que l’organisation de Torque au niveau des scripts se base sur des répertoires avec un enchaînement assez particulier dans l’exécution des fonctions (avec l'expérience, vous verrez d'ailleurs qu'il est difficile de débugger du script car il n'existe pas de debugger de scripts digne de ce nom pour vous aidez à suivre le chemin d'un programme). Pour débuter, mieux vaut utiliser les .cs fournis dans le répertoire common qui contient toutes les fonctions de base, les paramètres client et serveur,...

 

Eléments d'un jeu 3d

Le moteur ne fait pas le jeu dans son ensemble, il y a encore de multiples éléments extérieurs qui vont permettrent de réaliser un vrai jeu en 3d comme :

  • Les scripts

Les fichiers scripts ont habituellement l’extension .cs (.gui pour la définition de la GUI ou .mis pour les missions). En fait, Torque utilise les outils lex et Yacc pour parser les fichiers .cs. Vous pourrez regarder les possibilités fournies par le script dans la documentation téléchargeable ici. A l’exemple de LUA qui devient de plus en plus célèbre, le script permet d’étendre une application en se servant du moteur du jeu. Il est ainsi possible d’ajouter de multiples fonctionnalités à un jeu sans avoir les sources du moteur à disposition (il faut dire qu’il y a tout de même certains cas ou l’ajout d’une fonctionnalité est indispensable dans le moteur ou bien tout simplement plus facile à gérer par ce dernier).

 

Il s’agit d’un environnement graphique qui est affiché en mode pixel à l'écran et sur lequel l'utilisateur peut agir avec différents périphériques d'entrée comme le clavier, la souris, la dictée vocale, etc. Des images, des animations (en 2 ou 3 dimensions), et même des vidéos peuvent être rendues à l'écran.

 

La GUI comprend les HUD (Heads Up Display) qui permettent l’affichage des informations à l'écran comme vôtre santé, vos munitions,…

Un éditeur de GUI est fourni par Torque (touche F10 du clavier en mode DEBUG).

 

Remarque : L'éditeur GUI propose une construction dynamique des différents objets qui sont proposés dans une liste déroulante (ou combo box). Pour construire cette liste, le moteur construit un exemplaire de chaque objet qu'il trouve dans les scripts compilés et qu'il détruit juste ensuite (le but est simplement de vérifier que le constructeur de l'objet est appelé correctement).

 

Textures, shaders, modèles, matériaux,…les ressources d'un jeu sont des éléments essentiels dont la gestion doit être la plus efficace possible. En effet, charger 50 fois la même texture en mémoire pourrait par exemple s'avérer désastreux et c'est pourquoi un organe principal est nécessaire pour gérer toutes les ressources. Voyons un peu plus en détails l'utilisation des textures qui permettent d'habiller le jeu.


Les textures sont des images représentant une surface et permettant de simuler l'apparence de celle-ci quand on la colle sur un objet tridimensionnel. Les textures sont essentielles dans un jeu car un objet à géométrie simple (c'est-à-dire ayant peu de polygones) pourra facilement devenir un élément essentiel du décor.

 

Il existe plusieurs méthodes de texturing comme :

- Bump Mapping : Technique permettant d'ajouter un relief à un plan. En perturbant la normale au point (pour le modèle d'illumination).

 

 

- Mipmapping : Le mipmapping est le fait d'afficher des textures de taille différente selon la distance à laquelle on la regarde. De près on utilise une grande texture détaillée et de loin une petite avec très peu de détails.

 

- Alphablending : littéralement le mélange alpha, permet d’obtenir un effet de transparence. Cette technique ne correspond pas seulement à une clé de couleur qu’on mettrait en transparence totale, elle permet en fait d’obtenir des effets translucides suivant le dégradé de couleur de la texture. C’est ce dégradé qui deviendra translucide et pas totalement transparent grâce à l’AlphaBlending.

 

  • Effets sonores

Il y a quelques dizaines d'années, la musique des jeux se contentait de rester un temps soit peu supportable pour le joueur. Aujourd'hui, la musique et les effets sonores servent à donner une ambiance au jeu et à accroître les émotions du joueur.

 

  • Forum, site web

Ils permettent de faire la promotion d’un jeu car il faut savoir que le jeu vidéo ressemble à l’industrie du cinéma (le marketing a une réelle importance). Un véritable navet peut connaître un franc succès commercial alors qu’un jeu visuellement très beau et exploitant un bon scénario peut passer à côté (tout n’étant que subjectif, je ne donnerai pas d’exemple au risque de susciter des débats).

 

 

 

Torque

 

Vocabulaire

Voici quelques définitions concernant des notions que l’on retrouve souvent dans Torque. Les définitions sont en anglais car, de toute façon, si vous voulez maîtriser le moteur de jeu Torque, il faudra que vous ayez un minimum de pratique en anglais puisqu’il n’y a pratiquement aucune documentation en français sur Torque.

 

  • Scene graphs

Scene graphs are data structures used to hierarchically organize and manage the contents of spatially oriented scene data. Traditionally considered a high-level data management facility for 3D content, scene graphs are becoming popular as general-purpose mechanisms for managing a variety of media types. MPEG-4, for instance, uses the Virtual Reality Modeling Language (VRML) scene graph programming model for multimedia scene composition, regardless of whether 3D data is part of such content. In this article, I'll examine what scene graphs are, what problems they address, and scene graph programming models supported by VRML, Extensible 3D (X3D), MPEG-4, and Java 3D.

 

  • ShapeBase

ShapeBase is the renderable shape from which most of the scriptable objects are derived, including the player, vehicle and items classes.  ShapeBase provides basic shape loading, audio channels, and animation as well as damage (and damage states), energy, and the ability to mount images and objects.

 

  • DataBlock

Special kind of object containing a set of characteristics that are used to describe another object’s properties.

 

Missions

Torque utilise le concept de missions qui correspond également à celui de nombreux jeux vidéo. Une mission est définie dans un fichier ayant l’extension .mis

Ces fichiers contiennent des informations concernant les objets du monde (taille, coordonnées, textures,…) mais aussi de nombreuses autres informations comme les items, les joueurs, les triggers,…

 

Les missions sont téléchargées depuis le serveur à destination du client au début d’une mission ou quand un client rejoint une mission en cours d’exécution. De cette façon, le serveur à un contrôle total sur ce que le client peut faire.

 

Chaque mission possède généralement un terrain...

 

Terrain

Unité : tile
Le sol est composé de plusieurs surfaces carrées (patch ou tile), collés les uns aux autres de façon lisse (C1 : les tangentes se recollent).
Chaque patch occupe une feuille d'un grand quadtree (Les QuadTree,ou arbre quaternaire en français sont une structure de donnée qui représente des arbres, dont chaque noeud a quatre fils).


Il y a 2 méthodes pour fabriquer son terrain de jeu :

- le terrain est traité comme les autres objets du monde. On ajoute donc simplement un mesh au format DTS dans le script de mission.

- terrain manager : C'est la méthode la plus utilisée et la plus fiable. Un éditeur spécifique permet de fabriquer le terrain. Cet éditeur est accessible dans Torque en mode DEBUG avec la touche F11 du clavier.

 

Package

Il est possible  d’établir une sorte de mécanisme d’héritage avec les fonctions grâce au package et au mot clé Parent :

 

Packages are collections of functions that can be enabled and disabled at runtime.  Package functions can override (redefine) the behavior of existing functions in the global state or in packages that have been activated earlier.  Prior versions of a function can then be accessed using "Parent".  For example:

 

@code

function foo()

{

    echo("foo!");

}

 

package SamplePackage

{

 

function foo()

{

    echo("Haha!");

    Parent::foo();

}

 

}

 

% foo();

foo!

% ActivatePackage(SamplePackage);

% foo();

Haha!

foo!

@endcode

 

Console

Pour avoir une liste complète des fonctions exportées dans la console et dans les fichiers .cs, reportez vous au fichier TGE_Console_Cmds.rtf.

 

Voici un exemple d’utilisation de la console :

echo(box.getTransform());

Ceci retourne 7 valeurs qui sont :

-         la position de l’objet (X, Y et Z),

-         l’axe des normales (X, Y et Z),

-         rotation par rapport à l’axe

 

Pour connaître les méthodes et les champs disponibles sur un objet, utiliser la méthode dump sur l’objet :

 

You can get a list of all the methods and fields of an object from any object which inherits from SimObject (ie, every object), as well as the documentation on those objects by using the dump() method from the console:

@code

==>$foo = new SimObject();

==>$foo.dump();

 

Pièges à éviter

-         les variables

% indique une variable locale tandis que $ indique une variable globale.

Dans une fonction, vous pouvez donc utiliser des variables locales sans problèmes dans vos fonctions, mais pour la console, sachez que les variables locales ont une portée sur une ligne. C'est-à-dire que si vous tapez les 3 instructions suivantes sur des lignes séparées, ça ne fonctionnera pas :

%myString="test";%StringLength = strlen(%myString);echo(%StringLength);

Il faut donc taper les instructions ci-dessus sur une seule ligne dans la console. Sinon, utiliser des variables globales.

 

-         les noms

Pour pouvoir utiliser un objet dans la console, il faut lui donner un nom.

Exemple :

%shape= new TSStatic() { shapeName = "~/data/shapes/blah/myshape.dts"; };

Ici, on ne peut pas utiliser l’objet TSStatic alors qu’avec al ligne suivante, on peut l’appeler avec myObj :

%shape= new TSStatic(myObj) { shapeName = "~/data/shapes/blah/myshape.dts"; };

-         Table de hachage

Une table de hachage est un tableau dans lequel on accède à un élément à l'aide d'une clé. Chaque clé correspond à un seul élément. Une tentative d'insérer un deuxième élément ayant une clé identique à celle d'un élément existant provoque le remplacement de l'élément existant.

Attention, Torque possède une table de hachage des chaînes (class _StringTable) : Ainsi, si Torque possède déjà une chaîne dans sa table de hachage pour le nom d'un objet, il ne reconstruira pas l'objet la seconde fois où il va l'évaluer (le moteur fait une recherche de l'objet par nom avant la construction). Ainsi, l'objet nomobjet et NOMOBJET désigne le même objet. Si vous faites des comparaisons à la casse sur le nom d'un objet, faite très attention, mieux vaut avoir mis le même nom à la casse près dans tous les fichiers de script.

 

Export des mesh dans Torque

Torque vous donne la possibilité de faire vos propres mesh sous 3dsMax ou Maya puis de les exporter ensuite dans le jeu au format DTS.

 

Reportez vous au document suivant pour plus d’informations : DTS_Nodes.pdf

 

Remarque :

Attention, les textures exportées au format BMP doivent avoir une taille en puissance de 2 (512*512 par exemple).

 

Liens :

http://fosters.realmwarsgame.com/maxdts/

 

Contrôles

Pour donner les contrôles (clavier, souris,…) à un objet : setControlObject

 

TGE utilise des triggers pour gérer les déplacements du joueur (celui avec lequel on a appelé setControlObject). Les variables sont exportées dans la console et on change la valeur des variables en script.

 

$mv variables are used to tell the current control class to move in certain direction, this information is sent to the server and the server moves the object in it. Then the clients are updated with the new locations.

 

void MoveManager::init()

{

   Con::addVariable("mvForwardAction", TypeF32, &mForwardAction);

   Con::addVariable("mvBackwardAction", TypeF32, &mBackwardAction);

   Con::addVariable("mvUpAction", TypeF32, &mUpAction);

   Con::addVariable("mvDownAction", TypeF32, &mDownAction);

   Con::addVariable("mvLeftAction", TypeF32, &mLeftAction);

   Con::addVariable("mvRightAction", TypeF32, &mRightAction);

  

   Con::addVariable("mvFreeLook", TypeBool, &mFreeLook);

   Con::addVariable("mvPitch", TypeF32, &mPitch);

   Con::addVariable("mvYaw", TypeF32, &mYaw);

   Con::addVariable("mvRoll", TypeF32, &mRoll);

   Con::addVariable("mvPitchUpSpeed", TypeF32, &mPitchUpSpeed);

   Con::addVariable("mvPitchDownSpeed", TypeF32, &mPitchDownSpeed);

   Con::addVariable("mvYawLeftSpeed", TypeF32, &mYawLeftSpeed);

   Con::addVariable("mvYawRightSpeed", TypeF32, &mYawRightSpeed);

   Con::addVariable("mvRollLeftSpeed", TypeF32, &mRollLeftSpeed);

   Con::addVariable("mvRollRightSpeed", TypeF32, &mRollRightSpeed);

 

   for(U32 i = 0; i < MaxTriggerKeys; i++)

   {

      char varName[256];

      dSprintf(varName, sizeof(varName), "mvTriggerCount%d", i);

      Con::addVariable(varName, TypeS32, &mTriggerCount[i]);

   }

}

 

- Default Player Event Control Triggers

Comme vous avez pu le voir à la fin de la méthode MoveManager::init, il y a des triggers sur certaines variables pour permettre certains mouvements comme les sauts ou les tirs d’armes :

 

$mvTriggerCount0 Shoots or activates the mounted weapon in image slot 0 of the player's

avatar. (The "fire" button, so to speak.)

$mvTriggerCount1 Shoots or activates the mounted weapon in image slot 1 of the player's

avatar. (The "alt fire.")

$mvTriggerCount2 Initiates the "jump" action and animation for the player's avatar.

$mvTriggerCount3 Initiates the "jetting" (extra boost) action and animation for the vehicle on

which a player's avatar is mounted.

$mvTriggerCount4 Unassigned

$mvTriggerCount5 Unassigned

In the server control code, we can put a trigger handler in our player's avatar for any of

these triggers that override the default action.

 

We define a trigger handler like this:

function MyAvatarClass::onTrigger(%this, %obj, %triggerNum, %val)

{

// trigger activity here

$switch(%triggerNum)

{

case 0:

//replacement for the "fire" action.

case 1:

//replacement for the "alt fire" action.

case 2:

//replacement for the "jump" action.

case 3:

//replacement for the "jetting" action.

case 4:

//whatever you like

case 5:

//whatever you like

}

}

 

- Exemple de gestion des mouvements dans le fichier Client.cs:

function moveforward(%val)

{

$mvForwardAction = %val * $movementSpeed;

}

%val : valeur différente de 0 si bouton pressé et 0 si bouton relâché.



Quelques adresses :

Liste complète des caractéristiques :
http://www.devmaster.net/engines/engine_details.php?id=3

Site officiel :
http://www.garagegames.com

Tutorials d'introduction :
http://members.cox.net/midian/gamedesign/tgeintro.htm
http://holodeck.st.usm.edu/vrcomputing/vrc_t/tutorials/

Essential Guide to Torque Game Engine :
Essential Guide to Torque Game Engine.zip
¤ Image

¤ Jeux vidéo

Algine

Gp2x

OGRE

TGE


© 2005 Steelbox