Tutoriels,  Cours, Forums, Download, Exemples de code, Scripts, Gratuit et Freeware, Tests, Comparatifs, etc.


Le site du SDK GENESIS3D pour les compilateurs C++Builder et Bcc55
 G3DBuilder  Présentation G3D11 Borland SDK   Tutoriels  Astuces Images   Télécharger  Liens

Un paquet de composants pour G3D11

Par Olivier Constans - 10/2001

 

Petit rappels (ou grande découvertes) sur l'utilisation de Genesis

Toute application Genesis nécessite plusieurs étapes d'initialisation. Pour illustrer ces étapes, je prendrai des morceaux de codes extraits du 1er tutoriel de ce site qui présentait la construction d'une mini application. Je rappelle ici que nous sommes dans le contexte d'une application écrite en CBuilder et donc qui utilise la VCL pour définir la fenêtre principale de l'application.

Voici résumée ces étapes:

  1. Récupérer par un moyen quelconque les préférences de l'utilisateur en ce qui concerne le choix du driver et la résolution graphique.
  2. Mémoriser le handle de la fenêtre qui servira de conteneur à l'affichage de la vue 3d
  3. Créer l'objet moteur genesis à partir de ce handle
  4. initialiser les différents driver (sons, systèmes...)

Ces opérations sont éffectuées lors de la création de la fiche:

//---------------------------------------------------------------------------
// Genesis initialization when the form is created
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{

// Initialisation des variables de classe, pointeur...


InitApp() ;

//se garantir des problèmes de virgules flottantes


_control87(MCW_EM , MCW_EM) ;

// Routine de chargement des préférences:(driver, screen resolution (mode))


LoadPrefs();

// Récupérer le handle de la fiche principale de l'application

mainwindowhandle = Form1->Handle ; // get the window handle

// Creation de l'objet moteur

Engine = geEngine_Create(mainwindowhandle ,"Mini Application Genesis 3D",".");
if (!Engine)
{
Application->MessageBox("Unable to create the engine", "Erreur init",MB_OK);
Close();
}

// Initialiser les divers drivers

SoundSys = geSound_CreateSoundSystem(mainwindowhandle) ;
if (!SoundSys)
{
Application->MessageBox("Unable to initialize the sound","Erreur init", MB_OK);
Close();
}

// Get the system driver of the engine


DrvSys = geEngine_GetDriverSystem(Engine) ;
if (!DrvSys)
{
Application->MessageBox("Unable to get the system driver", "Erreur init",MB_OK);
Close();
}

}

 

Une fois que l'objet moteur est créé, nous allons maintenant lui affecter le driver choisi, et fixer le mode graphique choisi

, puis charger l'arbre bsp qui contient le niveau initial (le monde à rendre) . Ce monde sera alors ajouté au moteur.

On ajoutera aussi au monde à ce moment là les différents acteurs, fontes, bitmap, camera....

//---------------------------------------------------------------------------
// Engine Initialization
//---------------------------------------------------------------------------
geBoolean __fastcall TForm1::InitEngine(HWND hWnd)
{


// Routine de sélection du driver choisi
if (!FindDriver())
{ Application->MessageBox("Driver or mode not found","Erreur init", MB_OK);
return GE_FALSE;
}


// Si le driver choisi est D3D, représenté (par le caractère ( dans genesis) alors on ajuste la
luminosité.

if(ourdriver=='(') geEngine_SetGamma(Engine , 1.0f) ;

//Chargement du niveau (arbre BSP) et création du monde à représenter


if(!(LoadLevel("Niveau\\Map01.bsp")))
{
Application->MessageBox("Unable to load the level","Erreur init", MB_OK);
return GE_FALSE;
}

// read the message in order to see if esc has been pressed
Application->ProcessMessages() ;

// Set the camera rectangle
Rect.Left = 0;
Rect.Right = CWidth -1 ;
Rect.Top = 0;
Rect.Bottom = CHeight - 1 ;
// Creer la camera
Camera = geCamera_Create(2.0f , &Rect);
if (!Camera)
{
Application->MessageBox("Unable to create the camera","Erreur init", MB_OK);
return GE_FALSE;
}


// Initialiser la matrice XForm qui représente le positionement de la camera
// (orientation et position)

geXForm3d_SetIdentity(&XForm);


// Orienter la camera
geXForm3d_RotateX(&XForm , 0.0f);
geXForm3d_RotateY(&XForm , 0.0f);
geXForm3d_RotateZ(&XForm , 0.0f);

// Placer la camera à sa position de départ
geXForm3d_Translate(&XForm , 0,0,0) ;

geCamera_SetWorldSpaceXForm(Camera , &XForm) ;

// Ok ...

return GE_TRUE;

}

Une fois ces opérations d'initialisation effectuées , nous avons donc un monde à rendre en 3d, une camera qui nous permet

d'afficher l'endroit du monde vers lequel pointe l'objectif de la camera et normalement (pas dans cet exemple) des acteurs plaès en divers

point du monde (les monstres, les objets à trouver,....).

Maintenant, nous pouvons donc passer à la boucle principale du programme ou nous allons gérer les interraction de tous ces éléments et leurs déplacement dans le monde avant finalement de calculer l'image à rendre.

//---------------------------------------------------------------------------
// Actions ... when the form becomes active
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
//Initialiser le moteur, monde, camera, acteurs....
if(InitEngine(mainwindowhandle)==GE_FALSE) Close();

run = true ;
//------------------
//Boucle de rendu
//------------------
while (run)
{
//On déplace la camera selon l'action de l'utilisateur, c'est ici aussi que l'on mettra les différentes

// routines qui vont gérer le déplacement des acteurs (monstres, joueur, etc)


MoveCamera() ;

//Application->ProcessMessages() ; // lire les évènements (mouse, keyboard...

// Ici on va effectuer le calcul de l'image
if (!geEngine_BeginFrame(Engine , Camera ,GE_FALSE))
{ Application->MessageBox("Unable to begin a new frame","Erreur exec", MB_OK);
run = false;
break ;
}

// Rendu de la scène
if(!geEngine_RenderWorld(Engine , Form1->World , Camera , 0.0))
{ Application->MessageBox("Unable to render","Erreur exec", MB_OK);
run = false;
break ;
}
// Affichage de la scène
if(!geEngine_EndFrame(Engine))
{ Application->MessageBox("Unable to end the frame","Erreur exec", MB_OK);
run = false;
break ;
}
}
Close() ;

}

Je passerai ici les détails du reste du programme, ce dernier est relativement simple à comprendre , je dirai simplement qu'à chaque boucle on lit le clavier pour voir si l'utilisateur à pressé la touche Esc et si c'est le cas on quitte le programme en libérant la mémoire des différents objets créés.

A présent que nous avons les grandes lignes d'une application genesis 3d ,nous allons maintenant passer au paquet de composant pour genesis.

 

Contenu et installation du paquet de composants G3D11

 

A la lumière du chapitre précédent, nous pouvons donc déterminer que pour une application génésis nous avons besoin de plusieurs objets qui seront les composants de base de notre paquet:

Un objet moteur

Une boite de dialogue de sélection du driver et du mode graphique

Un objet objet genesis

Un objet camera

Un objet monde

Un objet sons

Un objet acteur

Un objet joueur

Ces composants vont permettre d'écrire un programme de visualisation 3d d'une façon très concise et rapide.

Pour installer le paquet de composant, dézippez le G3d11_beta.zip fourni dans le répertoire projets de votre compilateur Cbuilder5, ...\Borland\CBuilder5\Projects.

Vous devez donc avoir un sous répertoire G3D11 qui contient le paquet, le répertoire avec les include et la bibliothèque d'importation.

Prenez l'option intaller des paquet du menu composants de cbuilder et penez l'option ajouter. Dans la fenêtre de sélection de fichier qui suit, positionnez vous sur le répertoire dézippé précédement, et sélectionnez g3d11.bpl. Validez et voilà , normalement, vous avez un nouvel onglet g3d11 dans votre pallette de composants et qui contient les composants Genesis3d version beta.

Voici les noms des composants installés:

Descriptif sommaire:

TG3dEngine : l'objet moteur

TG3dDrvEnum : La boîte de dialogue de sélection du driver et du mode

TG3dWorld: L'objet qui permet de créer le monde et de charger un niveau dans le moteur

TG3dSound: Un objet pour gérer les sons - NON TESTE

TG3dObject: Le composant de base des tous les objets de genesis. Il définit entre autre la position x,y,z dans le monde, les angles , la matrice de transformations.

TG3dCamera: Un objet camera, ce composant est dérivé de TG3dObject.

TG3dActor : Permet d'ajouter des acteurs animés au monde et des les y faire se déplacer. Dérive de TG3dObject. Dans le programme exemple, 3acteurs sont définis, Bob, Bill et le Joueur.

TG3dPlayer: Dérivé de TG3dActor, c'est un acteur particulier qui représente le personnage du joueur, pour des jeux du style FPS.

TG3dActorList : Objet permettant de mémoriser tous les acteurs ajouttés au monde et d'effectuer un test de collisions entre eux.

TG3dSprite: Objet représentant un bitmap à afficher (par exemple un dessin de curseur).

Le programme exemple: ProjetB

Vous trouverez les sources prêt à compiler d'un exemple d'utilisation des composants G3d.

Ce programme gère l'affichage de 3 personnages, un personnage au repos , un personnage en mouvement , dotés d'un très sommaire petit module d'AI (Si je me cogne à quelque chose, je recule, je me tourne d'un angle au hazard et je continue ma route dans la nouvelle direction...Ouaaaah! ) et le 3ème personnage et le joueur contrôlé par les flèche haut et bas (avancer/reculer) et la souris pour tourner. Esc permet de sortir du programme.

.....à suivre : descriptif des composants et commentaire du programme

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




Vos questions techniques :Le Forum C/C++ - Publiez vos avis, liens, cours & articles : Publication
et rejoignez-nous dans l'équipe de rédaction de l'Association d'entraide des développeurs Francophones
Copyright 2000, 2001 www.developpez.com
Hit-Parade