Sobre los interfaces de colaboración
No espereis nada brillante en este post, sólo es una historia que muestra cómo los interfaces de colabroación pueden ayudar en el trabajo diario
Durante los últimos tres meses he estado trabajando en un framework para poder generar juegos con gran rapidez. Estamos llegando a nuestra primera gran entrega, por lo que no tenemos mucho tiempo libre, que digamos
Ayer empecé el desarrollo de un grupo de cinco juegos muy similares entre sí. Los hemos llamado "juegos de disposición" porque se trata de disponer diversos elementos en la pantalla, siguiendo una reglas previas. Hay cinco juegos diferentes ( por ejemplo, uno en el que hay que colocar a unos escolares en un autobús, sin poner juntos a los niños conflictivos, en otro hay que realizar una serie de tareas en un orden correcto, etc )
La arquitectura de los juegos es muy simple. Hay una clase llamada "mundo" que agrega otra llamada "scenario", que contiene la lógica del juego. La clase mundo se encarga de controlar el tiempo de juego, enviar métricas a servidor, cargar los elementos gráficos, etc. Los cinco juegos son tan similares que hemos intentado construirlos con la mayor cantidad de código común posible
Hemos decidido que tendríamos un swf ( dispositionMotor ) donde se inicializa el mundo, y que carga otro swf ( nameOfGame.swf ) que contiene el escenario del juego y las reglas del mismo. Por tanto, habrá sólo un "dispositionMotor" y cinco ( por ahora ) "nameOfGame"
Se nosplanetan dos posibilidades: primero, podemos tener cinco clases mundo distintas, y que cada una de ellas inicialice el escenario que corresponda, o una sola clase mundo genérica y cinco escenarios diferentes ( ésta, ésta!! )
Por tanto, en la clase mundo ( entre otras 400 lineas de código ) encontramos:
var controller: deIScenarioController = mcTimeline.getController( newMCContainer );
controller.initScenario( );
this.theScenario = controller.getInterface( );
Donde mcTimeline es la línea de tiempo de scenario.swf
En el primer frame de scenario.swf, tenemos:
this.getController = function( arg: MovieClip )
{
//Instancia el controlador del escenario, pero devuelve su interfaz de colaboración
var myController: cwScenarioController = new cwScenarioController( arg );
return deIScenarioController( myController );
}
La clase cwScenarioController:
class Code.Ents.cwScenarioController extends ClipController implements deIScenarioController
{
private var theScenario: cwScenario;
private var theClip: MovieClip;
function cwScenarioController( clipParam: MovieClip )
{
super( clipParam );
this.theClip = clipParam.movieClip;
//this.theScenario.initLists( );
}
public function initScenario( param: Object )
{
this.theScenario = new cwScenario( );
this.theScenario.parentClip = this.theClip;
this.theScenario.initLists( param );
}
public function getInterface( ): deIScenario
{
return deIScenario( this.theScenario );
}
}
El interfaz dIScenarioController:
interface Code.Ents.deIScenarioController
{
public function initScenario( param: Object );
public function getInterface( ): deIScenario;
}
Bien, pues temenos una referencia al conjunto de métodos públicos del controlador del escenario, y no al escenario, por lo que no nos importa de qué hace ese controlador, o de cómo lo hace. Dicho de otra forma, tenemos una referencia a un conjunto de métodos como initScenario( ), pero no sabemos cómo están implementados.
Y el método getInterface( ) de la clase cwScenarioController devuelve otro interface, que es el que utiliza el mundo para comunicarse con el escenario ( con todos los escenarios distintos )
Un post largo, pero muuuy relajante, después de 13 horas de trabajo......
Comentarios
Gracias por este post César, ha sido toda una clase , muy ilustrativo y tambien entretenido de mirar.
Si tuvieses un pequeño ejemplo para testear te lo agradecería infinito.
Saludos.
Publicado por: Carlos Rovira | Mayo 21, 2004 08:30 PM
genial el post. Estuve dos años haciendo juegos con flash y, dado q no tengo conocimientos de oop, me pasaba la vida copiando y pegando funciones y haciendo pequeñas modificaciones en el mismo código.
con esto me animas a dar el salto, q ya me va haciendo falta. Muchas gracias.
Publicado por: jesús gollonet | Mayo 22, 2004 09:12 PM
Gracias, me vais a subir los colores...
Y gracias por tu sugerencia, Carlos, en cuanto tenga algo de tiempo ( y se me ocurra un buen ejemplo completo y cerrado ) lo publico.
Publicado por: Cesar Tardaguila | Mayo 23, 2004 09:46 PM
César, me gustaría mucho que te pusieras en contacto conmigo directamente a mi e-mail: empras@terra.es
Coincidimos en apellido.
Publicado por: Silvia Tardaguila | Junio 4, 2004 04:45 AM