Anuncios

Bienvenidos sean a este post, hoy veremos uno de los patrones para nuestro juego.

Anuncios

Este es un patron de diseño estructural, este se encarga de ensamblar objetos y clases en estructuras mas grandes y mas flexibles. Ya que nos permite «cachear» objetos compartiendo sus partes comunes.

Anuncios
Anuncios

Yendo a nuestro juego, tenemos muchos objetos con que lidiar mientras se muestran en pantalla, y el numero se incrementa durante el gameplay. Mientras mas dure el jugador, mas unidades y edificios se crean, esto tambien aplica a los enemigos, y cada uno en el juego representa un objeto independiente que contiene informacion. Tomemos el caso de una unidad que toma al menos 16 bytes de memoria (por sus dos miembros de tipo enteros y el puntero de tabla virtual). Pero esto se va a poner peor cuando le agregamos campos para poder mostrarlo en pantalla: la altura, el ancho y el sprite (la imagen que lo representa en pantalla). Mas alla de lo que hemos comentado sobre nuestro juego que posee unidades y edificios, tanto propias como del enemigo, tambien va a tener elementos decorativos y de recursos para dar una mejor experiencia, tales como arboles, piedras, minerales, etc.

Anuncios

En algun punto nos daremos cuenta que tenemos una gran cantidad de objetos que representar en pantalla, los cuales a su vez casi representan el mismo objeto pero con pequeñas diferencias en sus estados. Como mencionamos aqui es donde entra en accion este patron para darnos una mano, porque para cada unidad tenemos los datos de altura, peso y sprite los cuales almacenamos de forma casi identica para todas ellas. Este patron nos sugiere descomponer un objeto pesado en dos:

  • Un objeto inmutable que contiene la misma informacion para cada objeto del mismo tipo
  • Un objeto mutable que se identifica de forma unica con respecto a los demas
Anuncios

Tomemos una unidad como ejemplo y veamos como su clase posee los siguientes elementos:

class Unidad
{
public:
	void mover(Point);
	int get_altura();
	// codigo omitido para facilidad
private:
	int altura_;
	int ancho_;
	Image sprite_;
	Point coords_;
	int poder_;
	int puntos_vida;
};
Anuncios
Anuncios

Esta es una representacion basica, donde en la parte privada tenemos todos los datos que estan relacionados con la unidad. En este tenemos las propiedades que mencionamos en posts anteriores y ahora tenemos los nuevos para poder representarlo en la pantalla, todo en la parte privada. En la parte publica tendremos los metodos para moverlo, asi como tambien los getter y setter corresponidentes. En esta clase tenemos datos que son inmutables porque no se modificaran en ningun momento como son poder_, altura_, ancho_ o sprite_. Pero esta unidad no estara fija en un lugar sino que se movera a otra parte de la pantalla, asi como tambien sufrira daño y por lo tanto tenemos unos datos que no seran inmutables tales como coords o puntos_vida. Por lo tanto, necesitaremos reubicarlo o eliminarlo en algun momento. Para ello, tomaremos lo que comentamos antes de la clase y lo dividiremos de la siguiente manera:

class Unidad
{
public:
	void mover(Point);
	int get_altura();
	// codigo omitido para facilidad
private:
	DatosUnidad* datos_unidad_;
	Point coords_;
	int poder_;
	int puntos_vida;
};

class DatosUnidad
{
public:
	void mover(Point);
	int get_altura();
	// codigo omitido para facilidad

private:
	int altura_;
	int ancho_;
	Image sprite_;
};
Anuncios
Anuncios

En este caso, tomamos los datos que sabemos que no se deben modificar en ninguno momento y estan relacionados a la representacion en pantalla. Y en la clase Unidad eliminamos esos datos y lo reemplazamos con una propiedad de esta nueva clase para poder usarlos. Esto hara que cada unidad tendra esos datos de forma inmutable y podamos modificar al resto a nuestra necesidad, ya sea para moverlo como para disminuir sus puntos de vida, etc. Si vienen de posts anteriores, sabran que Unidad era una interfaz pero que ahora convertimos en una clase abstracta. Si bien no existe gran diferencia entre ambos, este ultimo nos permite tener implementaciones. Tomemos como ejemplo a mover, este es una implementacion predeterminda para todas las unidades. De esta forma las clases herederas de esta solo proveen las conductas necesarias dado que comparten algunas propiedades tales como puntos de vida y poder.

Anuncios

En resumen, hoy hemos visto al patron flyweight, que es, para que sirve, en que puede ayudarnos, algunos temas relacionados con este, asi como lo podemos aplicar a para una de nuestras clases como es la unidad. Espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50