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) :
#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
#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/

