Programación de juegos con componentes

He estado leyendo algunos artículos sobre programación de juegos utilizando componentes y vaya que me he quedado entusiasmado.

Motores de juego como el Unity, TorqueX, Nebula 3 o el Cryengine, permiten crear objetos desde el GUI combinando componentes, lo cual reduce mucho la dependencia a la programación y además se adapta mejor al diseño iterativo de los juegos.

Esto se logra, en vez de utilizando jerarquía de clases, utilizando composición.

En este video se explica con más detalles:



También hay buena explicación en este artículo.
http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

A este tipo de desarrollo se le conoce como data driven, ya que todos los objetos del juego se pueden crear leyendo la información desde archivos.

Por ejemplo, para crear al player:

<Entity name="Player">
<component name="Mesh" file="player.md5"/>
<component name="Position" x="0" y="0" z="0"/>
<component name="Renderer"/>
<component name="PhysicBody"/>
<component name="PlayerController" camera="follow"/>
</Entity>


Luego de ver esto y analizar el código de push button engine se me ocurrió la idea de crear una sencilla libreria para el lenguaje C++ (creanme que la he buscado pero no encuentro ninguna por ahí) que maneje entities. La idea es la siguiente:



Como ven en la imágen anterior, tendríamos las siguientes clases: (pseudocódigo)


class CEntityManager
{
List<CEntity> EntityList;
bool createEntity(char* name);
CEntity getEntityByName(char* name);
}

class CEntity
{
List<CComponent> ComponentList;
bool addComponent(CComponent);
}

class CComponent: public IUpdate
{
//ocurre cuando el componente es agregado al entity
void onAdd()
{
UpdateManager.add(this);
}
void onUpdate(){}
}

class CUpdateManager
{
List<IUpdate> componentList;
void onUpdate()
{
component = componentList.getFirst();
while (component != null)
{
obj.onUpdate();
component = componentList.next();
}
}
}


Estamos hablando de que a esta libraría se le pueden crear componentes de cualquiera de las librerias utilizadas actualmente.

Render3D: Ogre3D / Irrlicht / DirectX / OpenGL
Physic: Physx / Newton GD / Havok / Bullet / etc...
Sound: IrrKlang / FMOD / OpenAL
AI: OpenSteer / FSM
...


Si alguien está interesado en esta libraría o si desea ayudar, puede contactarme a marco_tmp.nospam@hotmail.com. Claro, debes quitarle el .nospam. ;)

Comentarios