Bienvenue sur le site nagame.net
  1. Diminuer la taille du texte
  2. Augmenter la taille du texte
  3. Imprimer
  4. Envoyer ce contenu par mail
  5. Accueil

Le moteur 3D

Le moteur de Farewell utilise la technique de rendu Raycasting, inventée par IdSoftware en 1992 avec le célébre jeu Wolfenstein 3D.

 

Développé et optimisé pour la plateforme GameBoy Advance de Nintendo. Il est le seul moteur en 1*1 (240*160 pixels) de la console (amateur ou commerciale). 2éme originalité, il utilise le mode 1 (habituellement utilisé dans les jeux 2D) qui permet une multiplication d'effets hardware.


 

Présentation du mode 1 de la GBA

Le mode 1 se compose de 3 backgrounds (2 plans 2D et 1 plan Rot/Scale), de 256*256 pixels chacun, soit légérement plus que les dimensions de l'écran. Un background est composé d'une mosaique de tiles (petit bloc de 8*8 pixels). Le chargement d'un background se fait donc en 2 temps : chargement des tiles puis chargement d'une map. Les 3 backgrounds ont une palette unique (256couls - couleur 0=transparence).

 

-- BG0: Plan 2D - 256*256 pixels - 32*32 tiles
-- BG1: Plan 2D - 256*256 pixels - 32*32 tiles
-- BG2: Plan Rot/Scale mode (équivalent du mode7 sur snes) - 256*256 pixels - 32*32 tiles

 

Le mode 1 permet l'affichage de sprites (OAM), composé aussi de tiles, en bloc de 1*1 à 8*8 tiles (soit 64*64 pixels). Les sprites peuvent recevoir quelques effets : alpha-blending, fondu, windows (effet pochoir). L'ensemble des sprites ont aussi leur propre palette (256couls - couleur 0=transparence).

 

La GBA permet de stocker un maximum 1500 tiles environ pour l'ensemble backgrounds sprites ($6000000-$6017FFFF).

 

Dans le cadre de Farewell:
- BG0 est utilisé (temporaire) par le casque (76 tiles utilisés)
- BG1 est utilisé pour le moteur raycasting enemies (600 tiles utilisés)
- BG2 est libre
- Les sprites, par ex. l'arme principal (256 tiles utilisés)

 

Aprés quelques tests concluant, un mode optionnel en anaglyphe pourrais être envisagé.


 

Le raycasting

La technique du raycasting est bien connu, vous trouverez facilement sur le web de nombreux tutoriaux qui la décrivent trés bien. Bien que la plupart soit en anglais, on arrive facilement en recoupant à obtenir son propre moteur.

 

Quelques pistes:
Projet Mazecast : Mon préféré avec ses explications claires sur la technique, l'affichage des sols et plafonds et même l'affichage des sprites.
Ray-Casting Tutorial : La référence !
Wolf3D Dome : Site de passionnés de Wolfenstien 3D.


 

Intelligence Artificielle des enemies

Loin des jeux modernes ou les enemies attaquent en groupe, fuient ou appellent des renforts. Les besoins pour Farewell sont assez basique. Besoin qu'on peux découper en 2 étapes :
- Dans un premier temps, chaque enemie vague à ses occupations en se promenant de salle en salle.
- Puis s'il vous apercoit, se met à vous courser sans relâche...bien entendu dans une certaine limite ! Vous devez pouvoir le semer assez facilement (distance, virage rapide).

 

Les 2 étapes sont, en réalité, trés proches. Dans la premiére, l'enemie poursuit un "spot" (ou goal), simple point "virtuel" éparpillé sur la carte. Une fois l'objectif atteint, on lui attribut aléatoirement un nouveau. Dans la deuxiéme étape, c'est le joueur qui devient le spot. Dans tous les cas, on peux résumer l'IA à une recherche de chemin entre 2 points.

 

Si vous faites une recherche rapide sur le net, la premier méthode qui vient est connu sous le nom de "pathfinder" (algorithme Astar*). Ce traduit littéralement par "recherche de chemin", le concept revient à rechercher d'abord tous les chemins possibles entre les 2 points puis retenir le plus court. Cette méthode pose plusieurs problémes dans le cas de Farewell :
1. Une recherche de tous les chemins possibles (nécessaire pour avoir le plus court) pour chaque enemie devient vite trés consommateur de CPU
2. Trouver, à tous les coups, le plus court chemin posent un probléme de perfection : l'enemie vous retrouve systématiquement.
3. Dans l'étape 2, vous êtes une cible mouvante et donc à chaqu'un de vos pas, rebelote on doit refaire le calcul ! Ce qui multiplie d'autant le probléme du 1er point.

 

En réalité, si on observe les enemies de Wolfenstein 3D quelques instants, on s'apercoient vite qu'il n'y a aucun pathfinder et que les enemies suivent une logique plutôt basique. Au moindre "cône" vous séparant, l'enemie se retrouve coincé. Simplicité qui donne, au final, une "impression" de faculté plus humaine.

 

Voici l'algo des enemies auquel je suis arrivé :

  u32 Empl, j; 

j=enemie->posx enemie->sensx;

if(j>player.x 32) { enemie->margex=-32; enemie->sensx=-enemie->speed; }
else if(jmargex=32; enemie->sensx=enemie->speed; }

j=enemie->posy enemie->sensy;

if(j>player.y 32) { enemie->margey=-32; enemie->sensy=-enemie->speed; }
else if(jmargey=32; enemie->sensy=enemie->speed; }

Empl=(enemie->posy*64) (enemie->posx enemie->margex);
if(!Empl) enemie->posx =enemie->sensx;

Empl=((enemie->posy enemie->margey)*64) enemie->posx;
if(!Empl) enemie->posy =enemie->sensy;

L'algo consiste en une simple comparaison entre l'enemie (qui ne peux se déplacer qu'en diagonale) et vous. Comparaison auquel on donne une marge minimum (-64 de votre position) et une maximum ( 32 de votre position). Ca nous donne un enemie que se déplace en zigzag et qui arrive, dans la limite de l'ampleur des marges, à contourner les obtacles.