Construire une mini application en Cbuilder5
par Olivier Constans

Ceci est mon 1er tutoriel et en conséquence, il n'est
peut être pas ce qui se fait de mieux en la matière,
mais j'espère qu'il saura vous guider un petit peu
dans la prise en main de genesis avec Cbuilder.
Je tiens aussi à remercier ici les gens de la sympathique
communauté genesis 3d qui sont toujours prêt
à répondre aux questions et m'ont apporté
une aide précieuse dans la compréhension et
l'utilisation de l'api genesis3d.
Le programme qui sert de support à ce tutoriel est
vraiment très, très sommaire et se limite à
gérer le déplacement d'une camera dans un tout
petit monde 3d.
Il n'est pas non plus optimisé et peu grandement être
amélioré tant dans l'écriture que dans
la structure.
Prérequisit
Pour pouvoir suivre le tutoriel qui suit et utiliser le programme
qui va avec, il vous faudra auparavant avoir installer genesis3d
et le sdk genesis3d pour le c++ de borland.
Mise en place des répertoires
Nous allons créer notre petite application
et pour cela nous allons structurer notre environement.
Nous allons définir un répertoire
MiniApp et à l'intérieur de celui ci nous définirons
un répertoire niveau qui contiendra notre monde. Un
répertoire source dans lequel nous placerons notre
projet Cbuilder et nos sources. L'executable sera placé
dans le répertoire minapp.
Construire le Monde
Tout d'abord, il nous faut construire le monde
que nous allons représenter et dans lequel nous allons
évoluer grâce à genesis3d.
Pour cela , il faut utiliser l'éditeur
de niveau Genedit Classic build 0.57 (que vous irez télécharger
depuis le site www.genesis3d.com section download) ou celui
livré de base avec le sdk genesis3d 1.1 original .
Je ne vais pas ici faire un cours sur l'éditeur
de niveau étant donné qu'il existe déjà
d'excellents tutoriels traitant de la question sur le site
"World of Genesis". Vous pouvez aussi vous référer
au tutoriel de Jean Louis Clément
qui vous présente l'éditeur de niveau de
genesis3d 1.1.
Disons que pour notre petite application il
nous faut une boîte vide (HolloW Box) de dimension assez
correcte pour nous déplacer à l'intérieur
et nous y placerons une sphére solide. Vous n'oublierez
pas de placer une entité deathmatchstart à l'intérieur
de notre cube sans quoi la compilation de niveau échouera.
Ce niveau est livré préconstruit
dans les sources accompagnant ce tutoriel et s'appelle MAP01.
Le source du niveau est MAP01.3dt et l'objet
compilé que nous utiliserons dans notre projet est
MAP01.BSP.
Le projet Cbuilder
Pour offrir un support à notre application genesis, nous
allons définir une fiche dans Cbuilder.
Dans la classe associée à cette fiche, nous définirons
les variables et les méthodes nescessaire à la
mise en oeuvre de genesis .
Les variables principales de l'application:
| geEngine *Engine ; |
Le pointeur vers la structure du moteur |
| geDriver_System *DrvSys ; |
Pointeur vers le driver système |
| geDriver *Driver ; |
Pointeur vers le driver video (d3d
, glide , opengl...) |
| geSound_System *SoundSys ; |
Pointeur vers driver son (non utilisé
ici) |
| geDriver_Mode *Mode ; |
Mode video à utiliser |
| geWorld *World ; |
Pointeur vers la structure représentant
le monde |
| geCamera *Camera ; |
Pointeur vers l'objet camera |
| GE_Rect Rect ; |
Rectangle de clipping de la camera
(champ) |
| geXForm3d XForm; |
Matrice de transformation |
| HWND hWND ; |
handle de la fiche principale |
| char ourdriver ; // driver a utilise |
Driver à utiliser G
= glide, ( = D3d , O =Opengl |
Les méthodes principales :
| geBoolean __fastcall InitEngine(HWND hWnd)
; |
initialisation du moteur |
| bool __fastcall FindDriver(); |
trouver le driver demandé |
| void __fastcall LoadPrefs(char *drv
,int *width , int *height); |
Charger les préférences |
| bool __fastcall LoadLevel(char *Filename)
; |
Charger le niveau |
| void __fastcall ShutDown(); |
Libérer la mémoire |
| void __fastcall MoveCamera() ; |
Déplacer la camera |
Les fichier include:
Dans la déclaration de la classe fiche, nous indiquerons
le fichier genesis.h , ce fichier devra toujours
être indiqué après la directive d'inclusion
de windows.h.
Les options du projet:
Nous indiquerons le chemin des fichier include de genesis
\G3D11_BorlandSdk\Include
Si nous souhaitons utiliser notre programme avec la dll genesis.dll,
nous incluerons au projet la bibliothèque d'importation
genesis.lib soit directement en ajouttant se fichier au projet,
soit en indiquant son chemin dans les options de projets : \G3D11_BorlandSdk\Importlib
Dans ce cas, il faudra placer genesis.dll dans le même
répertoire que l'executable obtenu.
Si par contre nous souhaitons générer un executable
plus gros mais autonome, nous ajouterons au projet la bibliothèque
statique genesis.lib situé dans \G3D11_BorlandSdk\lib
.
Enfin, il convient de définir les constantes conditionnelles
suivantes:
_BCB pour prendre en compte les
spécificités borland dans les include de genesis
GENESISDLLBUILD si nous souhaitons
utiliser genesis.dll seulement
c'est la solution retenue dans notre exemple.
Nous décocherons aussi la case "construire avec
les paquets d'execution" dans l'onglet paquets et la case
"utiliser la RTL dynamique" dans l'onglet Lieur. Cela
aura pour effet de générer un exe un peu plus
gros, mais indépendant de toute dll.
Le programme:
Nous enregistrerons notre projet sous le nom de AppMini.bpr
et le fichier unité sous MiniApp.cpp.
AppMini.cpp contient la fonction winMain de notre applicatin
Cbuilder et rien de spécifique à genesis.
La manipulation de genesis 3d a lieu dans le source se rapportant
à la fiche principale. C'est cette fiche qui servira
de support à genesis pour effectuer l'affichage du rendu
3d.
L'initialisation du moteur va avoir lieu dans lévènement
OnCreate de la fiche.
Cette initialisation est constituée des étapes
suivantes:
Charger les préférences :
LoadPrefs();
lecture d'un petit fichier texte (pref.ini) contenant le driver
et la résolution écran à utiliser. Pour
le driver il s'agit de la 1ère lettre du descriptif du
driver, G pour glide, ( pour DirectX car le texte commence par
un parenthèse et O pour l'opengl.
Récupérer le handle de la fiche et créer
le moteur, en retour si tout c'est bien passé, on récupère
un pointeur vers l'objet moteur.
Form1->hWND = Form1->Handle ;
Form1->Engine = geEngine_Create(Form1->hWND ,"Miniapp
Genesis 3D",".");
Obtenir le driver système associé au moteur
Form1->DrvSys = geEngine_GetDriverSystem(Form1->Engine)
;
Maintenant, la suite se passe lors de l'activation de la fiche
dans l'évènement OnActivate
La méthode InitEngine est appelée et va dans l'ordre
- charger le driver a utiliser (d3d, glide ou opengl) et
initialiser la résolution graphique
- créer l'objet camera
- appeler la méthode LoadLevel qui va charger le
niveau et créer l'objet World et lui affecter l'objet
camera.
- orienter la camera et l'initialiser à sa position
de départ dans le niveau
Si maintenant tout s'est bien passé, alors nous pouvons
démarrer la boucle de rendu qui tant que l'on n'aura
pas appuyé sur esc, va lire la souris et faire avancer
la camera ou l'orienter selon que vous aurez ou non cliqué
sur le bouton gauche.Au départ, la caméra est
en mode avance.
C'est dans le traitement du déplacement de la caméra
que nous trouverons aussi l'appel aux fonctions de détection
de collision qui permettent de ne pas passer au travers des
murs et des objets.
Le calcul du déplacement ainsi que toutes les actions
qui affecteront la nouvelle scène à afficher (déplacement
de personnage, ojets ,explosions,affichage de texte, etc...)
auront toujours lieu entre les appels de fonctions geEngine_BeginFrame
qui prépare le buffer de rendu et geEngine_EndFrame
qui affiche le contenu du buffer de rendu et avant geEngine_RenderWorld qui lance le calcul du rendu de la
nouvelle image 3d .
Le but de cela étant comme dans toutes les applications
3d, d'effectuer les calculs pendant que le moteur affiche l'image
calculée précédement .
Lorsque l'on aura appuyé sur esc, signifiant au programme
de s'arrêter, on appelera la méthode Shutdown qui
se chargera de libérer la mémoire des objets engine,
world, camera...
Voilà a très grand traits esquissés les
principes de base d'un programme pour genesis.
Dans le cadre d'un programme plus complexe, il faudrait envisager
l'initialisation d'un driver pour les sons, la gestions de joysticks,
la gestion des acteurs (les objets animés qui interragissent
avec l'utilisateur) , le changement de niveau, la gestion des
portes ( chagenement de pièces avec portes qui s'ouvre
quand on arrive) , les effets spéciaux, lumières,
effets miroirs, la partie intelligence artificielles pour les
personnages non joueur d'un jeu etc....
Mais à présent, à vous ! Je vous invite
à télécharger la mini application fournie
avec ce tutoriel et à vous amuser avec afin de vous familiariser
avec l'utilisation relativement simple de genesis 3d.
Vous ferez ainsi vos premiers pas dans le monde formidable de
la programmation de scènes en 3d.
Le programme est commenté de manière à
bien expliquer les étapes importantes, aussi n'hésitez
pas à en lire le source qui fait aussi parti du tutoriel.
Téléchargement de l'exemple et installation
Téléchargez le programme projet pour Cbuilder5
ICI et dézippez le tout dans la racine
de votre disque. Un répertoire g3d_tutor sera créé
dans lequel vous trouverez le répertoire MiniApp qui
contient le sujet de notre tutoriel.
NB: Vous pouvez utiliser les sources pour une version
inférieure de cbuilder. Il vous faudra seulement reconstruire
le projet en y ajoutant le source MiniApp.cpp , la bibliothèque
d'importation genesis.lib situé dans le répertoire
implib du Sdk pour borland.
|