Desarrollo de videojuegos 1: arquitectura del motor de videojuegos (2ª edición)

Page 172

[154]

CAPÍTULO 4. PATRONES DE DISEÑO

Implementación Como ejemplo de implementación supongamos que tenemos una escena (Scene) en la que existe una colección de elementos de tipo ObjectScene. Cada elemento tiene atributos como su nombre, peso y posición en la escena, es decir, name, weight y position, respectivamente. Se definen dos tipos visitantes: NameVisitor: mostrará los nombres de los elementos de una escena. BombVisitor: modificará la posición final de todos los elementos de una escena al estallar una bomba. Para calcularla tendrá que tener en cuenta los valores de los atributos de cada objeto de la escena. Se ha simplificado la implementación de Scene y ObjectScene. Únicamente se ha incluido la parte relativa al patrón visitor, es decir, la implementación de los métodos accept(). Nótese que es la escena la que ejecuta accept() sobre todos sus elementos y cada uno de ellos invoca a visitObject(), con una referencia a sí mismos para que el visitante pueda extraer información. Dependiendo del tipo de visitor instanciado, uno simplemente almacenará el nombre del objeto y el otro calculará si el objeto debe moverse a causa de una determinada explosión. Este mecanismo se conoce como despachado doble o double dispatching. El objeto que recibe la invocación del accept() delega la implementación de lo que se debe realizar a un tercero, en este caso, al visitante. Finalmente, la escena también invoca al visitante para que realice las operaciones oportunas una vez finalizado el análisis de cada objeto. Nótese que, en el ejemplo, en el caso de BombVisitor no se realiza ninguna acción en este caso. Listado 4.10: Visitor (ejemplo) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

class ObjectScene { public: void accept(SceneVisitor* v) { v->visitObject(this); }; }; class Scene { private: vector<ObjectScene> _objects; public: void accept(SceneVisitor* v) { for (vector<ObjectScene>::iterator ob = _objects.begin(); ob != _objects.end(); ob++) v->accept(v); v->visitScene(this); }; }; class SceneVisitor { virtual void visitObject(ObjectScene* ob) = 0; virtual void visitScene(Scene* scene) = 0; };


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.