Objetos de juego (Game Objects) y componentes

Para entender mejor esta parte que voy a explicar, recomiendo leer el artículo siguiente: http://www.genbetadev.com/programacion-de-videojuegos/diseno-de-videojuegos-orientado-a-entidades-y-componentes

Diagrama nº1

La unidad básica con la que trabajará nuestro motor gráfico de cara al usuario que desarrollará el juego será los objectos que realizarán una abstracción de cualquier cosa, a los que hemos llamado cariñosamente “Game Objects“. Un Game Object, por consiguiente, es la representación de una entidad en el mundo real. Cada objeto debe tener un nombre para referirnos a él (“coche1”, “coche1_rueda1”, etc.) y un identificador (que será usado de cara al sistema). Por ejemplo, un coche sería uno, y las ruedas que lo componen, también.

Ahora bien, si el coche se mueve, se deben mover las ruedas, las luces, los ejes… por lo que diremos que esos objetos están emparentados (apartado 1 en la imagen adjunta). Creando esta jerarquía, conseguimos agrupar de forma lógica los objetos, dándose el caso de que los objetos puedan tener varios hijos (o children) y un único o ningún padre, creando una relación bidireccional entre el padre y sus hijos por medio de una lista de punteros y un único puntero, respectivamente. Evidentemente, no es posible que un padre sea padre de sí mismo, directa o indirectamente.

De todas formas, no todos los objetos son iguales, ¿verdad?. Algunos están definidos con una serie de valores y propiedades distintas a los demás. Por ejemplo, una pelota tiene un modelo de una pelota 3D (una esfera), un material (plástico), una esfera de colisión… mientras que un temporizador sólo posee una parte lógica que determina si ha transcurrido un lapso de tiempo. ¿Cómo distinguimos pues unos objetos de otros? Lo haremos mediante componentes. Cada objeto puede tener, a lo sumo, un componente de cada tipo. Por ejemplo, podemos definir varios componentes:

  • Transformación: Posición, rotación y escala de un objeto en el mundo 3D.
  • Cámara: Define una cámara desde la cual se hará un renderizado de una escena.
  • Texto de interfaz gráfica de usuario (GUI Text).
  • Luz estática: Usada para iluminar el escenario…

Y así, se puede crear una lista muy larga de componentes que nos servirá para personalizar nuestros componentes. En el apartado 2 se pueden ver algunas formas de invocar funciones desde el objeto para obtener o modificar datos de los componentes. Intentaré dedicar un post a ello.

Por si fuera poco, vamos a definir 4 nuevos punteros para personalizar los objetos, que serán punteros a funciones que nos permitirán hacer llamadas a funciones dependiendo de su tipo:

  • start: Se llama al inicio, cuando se crea el objeto y se añade al sistema.
  • behaviour: Se llama en cada iteración, y determina el próximo estado del objeto.
  • event: Se llama cada vez que se ejecute un evento (movimiento del ratón, reescalado de ventana, etc.).
  • keyevent: Se llama cada vez que se pulse una tecla del teclado.

Por ejemplo, se define una función “behaviour” para un objeto de la siguiente forma:

void GO1_movimiento(CGameObject* gameObject)
{
  // Operaciones para el objeto que vaya a usar esta función irán aquí.
}

CGameObject* GO1 = gSystem_GameObject_Manager.AddGameObject("GO1"); // Crear objeto
GO1->SetKeyEventBehaviourFunction(&GO1_movimiento);           // Cargar función behaviour

Que será llamada en cada iteración de la ejecución de nuestra aplicación, pasando como parámetro el puntero del objeto que apunta a sí mismo (this, básicamente). El objeto llamado gSystem_GameObject_Manager será el sistema que se encargará de gestionar nuestros objetos, del que me encargaré de explicar en el próximo post.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s