
|
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 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.
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.
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 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 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.
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
|