El diseño base es el siguiente:

La clase Personaje:
De la forma más genérica, todos los personajes de nuestro juego tendrán un ID, nombre y tendrán una representación gráfica.
package personajes
{
import flash.display.*;
public class Personaje
{
protected var id:uint;
protected var nombre:String;
public var forma:MovieClip;
}
}
La clase PInteractivo:
Un personaje interactivo es una especialización de personaje con la capacidad de interactuar con el personaje principal a petición de este. Todos los personajes interactivos conocerán al personaje principal, por ello existirá una referencia estática al mismo. Además los personajes interactivos pueden estar dispuestos o no a establecer una conversación, lo cual queda reflejado en los distintos estados que puede tomar.
La forma en la que interactúa esta especialización de personaje es la siguiente:
Si el personaje principal está lo suficientemente cerca, al hacer click sobre un personaje interactivo este último comenzará un pequeño protocolo de comunicación.
Este protocolo de comunicación radica en la función recibir cuya descripción de sus parámetros es la siguiente:
origen: El personaje interactivo que invoca el método recibir del otro personaje interactivo.
guion: El guión por el que navegarán los personajes interactivos.
Esta función debe ser implementada por las subclases ya que el guión debe ser descrito por estas últimas para la posibilidad de ejecutar eventos como respuesta a las distintas opciones elegidas durante la presentación del guión.
package personajes
{
public class PInteractivo extends Personaje
{
public static const ESTADO_DIALOGANTE = 0;
public static const ESTADO_NO_DIALOGANTE = 1;
public static var protagonista:PInteractivo;
protected var estado:uint;
protected var guion:Guion;
public function PInteractivo()
{
guion = new Guion();
}
public function recibir(origen:PInteractivo, guion:Guion){}
}
}
La clase Guión:
El guión establece el diálogo que pueden mantener dos personajes interactivos, su estructura es un mansaje de texto y una lista distinta de null siempre, que representan las posibles respuestas a elegir, con sus respectivas consecuencias. Cada respuesta es a su vez un guión con la excepción de que su lista de respuestas es de un solo elemento o una lista null, fin de diálogo. Este elemente es una referencia a la continuación del guión por la que irán navegando los personajes interactivos o a un null
Cuando el personaje principal selecciona una opción null, esta se interpretará como fin del diálogo y se quedará esperando un null de confirmación del otro personaje interactivo.

package personajes
{
public class Guion
{
public var texto:String;
public var respuestas:Array;
public function Guion()
{
texto = "...";
respuestas = null;
}
}
}
La clase Anciano:
Esta clase que extiende de PInteractivo, se encarga de construir su representación gráfica, activar los eventos de ratón, cargar su guión y sobreescribe el método recibir.
Al hacer click sobre él este atenderá al personaje principal:
Crea una caja de texto con un mensaje de texto correspondiente a la primera entrada del guión y transmite esta primera entrada del guión al personaje principal. Este ahora quedará a la espera de una respuesta con la continuación elegida del guión.
package personajes
{
import flash.display.*;
import flash.utils.*;
import flash.ui.*;
import flash.events.*;
public class Anciano extends PInteractivo
{
private var residuo:CajaGuion;
public function Anciano()
{
super();
this.forma = new GAnciano();
construirGuion();
forma.addEventListener(MouseEvent.MOUSE_DOWN, atender);
}
private function atender(evt:MouseEvent)
{
var cg:CajaGuion;
if (this.forma.hitTestObject(protagonista.forma))
{
forma.removeEventListener(MouseEvent.MOUSE_DOWN, atender);
cg = new CajaGuion(guion);
this.residuo = cg;
cg.x -= 50;
this.forma.addChild(cg);
//transmite las opciones de respuesta
protagonista.recibir(this, guion);
}
}
//recibe la rama del guión a seguir
override public function recibir(pi:PInteractivo, guion:Guion)
{
var cg:CajaGuion;
if (residuo != null)
{
this.forma.removeChild(residuo);
}
residuo = null;
if (guion != null)
{
cg = new CajaGuion(guion);
this.residuo = cg;
cg.x -= 50;
this.forma.addChild(cg);
protagonista.recibir(this, guion);
}else
{
protagonista.recibir(this, guion);
forma.addEventListener(MouseEvent.MOUSE_DOWN, atender);
}
}
private function construirGuion()
{
var aux, aux2:Guion;
this.guion.texto = "¿Puede ayudarme?";
this.guion.respuestas = new Array();
aux = new Guion();
aux.texto = "¡Claro que si!";
this.guion.respuestas[0] = aux;
aux = new Guion();
aux.texto = "¡No tengo tiempo!";
this.guion.respuestas[1] = aux;
aux2 = this.guion.respuestas[0];
aux2.respuestas = new Array();
aux = new Guion();
aux.texto = "Necesito agua de la fuente";
aux2.respuestas[0] = aux;
aux2 = aux2.respuestas[0];//rama del guion
aux2.respuestas = new Array();
aux = new Guion();
aux.texto = "ok";
aux2.respuestas[0] = aux;
//aux.respuestas = new Array();
}
}
}
La clase Protagonista:
Representa al protagonista personal y extiende a la clase Pinteractivo. De la misma forma que anciano, esta construye su forma gráfica. Además se puede cambiar su forma de control a través de la variable modo, del tipo Control, una buena técnica para cambiar el control de un personaje de forma dinámica según los objetos que tenga en la mano.
Como personaje que puede interactuar con otros personajes, cuando este recibe un mensaje con un guión este pasa a modo interactivo, el cual no podrá moverse, solamente pudiendo navegar por el guión servido.
Del guión que recibe este, centra su atención sobre las respuestas posibles, que se pasarán al constructor de caja de texto interactiva (CajaGuionI) que creará las distintas opciones sobre las que podrá pulsar el jugador. Cuando elija una opción este transmitirá al origen del mensaje la alternativa del guión que representa la opción. Si esta es null significará el fin del diálogo, y el personaje interactivo transmitirá null al protagonista con lo que volverá a permitir al usuario moverse.
package personajes
{
import flash.display.*;
import flash.utils.*;
import flash.ui.*;
import flash.events.*;
public class Protagonista extends PInteractivo
{
public var modo:Control;
private var residuo:CajaGuionI;
public function Protagonista()
{
super();
this.id = 0;
this.nombre = "Protagonista";
this.forma = new GProtagonista();
this.modo = new ModoMovimiento(this);
}
/*
Recibe las opciones de respuesta. Terminamos conversación transmitiendo
null para luego recibir null.
*/
override public function recibir(origen:PInteractivo, guion:Guion)
{
var cg:CajaGuionI;
if (residuo != null)
{
this.forma.removeChild(residuo);
}
residuo = null;
//solo hay una respuesta -> fin
if (guion == null)
{
modo.activar();
}
else
{
modo.desactivar();
cg = new CajaGuionI(origen, this, guion);
this.residuo = cg;
cg.x += 50;
cg.y -= 50;
this.forma.addChild(cg);
}
}
}
}
No hay comentarios:
Publicar un comentario