Intro :
La génération procédurale d’un contenu par un quelconque algorithme permet de le créer de manière intelligente !
Dans cet article nous allons voir comment générer à la volée un labyrinthe en 3D.
Prérequis :
– Savoir lire du C++.
– Savoir ce qu’est un vertex buffer et un index buffer.
– Savoir manipuler un tableau à deux dimensions.
Explications :
Nous allons utiliser une classe Array2D qui nous permettra de manipuler un tableau à deux dimensions.
Voilà le code pour ce tableau spécial et simple d’utilisation (Array2D.h) :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#ifndef ARRAY_2D_H #define ARRAY_2D_H // Classe pour gérer facilement un tableau à deux dimensions. template<typename T> class Array2D { public: // Constructeur. Array2D(int iWidth = 0, int iHeight = 0) : m_iWidth(iWidth), m_iHeight(iHeight), m_vArray(iWidth*iHeight) { } // Redimensionner. void resize(int iWidth, int iHeight) { m_iWidth = iWidth; m_iHeight = iHeight ; m_vArray.resize(iWidth*iHeight); } inline T& operator() (unsigned int x, unsigned int y) { assert(((y*m_iWidth) + x) < m_vArray.size()); return m_vArray[ (y*m_iWidth) + x ]; } inline T& operator[] (int pos) { return m_vArray[pos]; } inline const T& operator() (unsigned int x, unsigned int y) const { assert(((y*m_iWidth) + x) < m_vArray.size()); return m_vArray[ (y*m_iWidth) + x ]; } inline const T& operator[] (int x) const { return m_vArray[pos]; } inline int getWidth() const { return m_iWidth; } inline int getHeight() const { return m_iHeight; } private: int m_iWidth; // Largeur. int m_iHeight; // Hauteur. std::vector<T> m_vArray; // Le vecteur qui va servir de tableau à deux dimensions. }; #endif |
Voici le fichier d’en-tête MazeGenerator.h
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#ifndef MAZE_GENERATOR_H #define MAZE_GENERATOR_H #include "Array2D.h" class MazeGenerator { public: MazeGenerator(); virtual ~MazeGenerator() {}; void generate(const int iRowCellNumber, const int iColumnCellNumber); void computeNeighbourgsCeils(); void createMazeNode(scene::ISceneManager* pSceneManager, NewtonWrapper::CollisionManager* pCollisionManager); int generateRandomCellNumber() { assert(m_iRowCellNumber && m_iColumnCellNumber); return rand() % m_iCellNumber; } scene::CDynamicMeshBuffer* createMeshBuffer(); private: Array2D<MazeCell*> m_aMaze; int m_iRowCellNumber; int m_iColumnCellNumber; int m_iCellNumber; }; #endif |
Références :
– http://www.mazeworks.com/mazegen/mazetut/


