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......