Interesante noticia publicada hace poco en barrapunto que trata de una propuesta de Jenova Chen (diseñador y programador de videojuegos) para ajustar dinámicamente la dificultad de los juegos en función del nivel del jugador y no de los actuales ajustes pasivos. El objetivo: un juego más divertido y manejable.
Tesis (En inglés)
martes, 27 de enero de 2009
Géneros de videojuegos
Buenas, aquí os dejo la presentación que hice sobre géneros de videojuegos. En ella hago un ámplio repaso de los principales géneros de videojuegos, resaltando sus características, sus juegos más característicos y dando un pequeño repaso histórico a cada uno de ellos. Echadle un viztazo sobre todo a los enlaces del final que hay algunos muy interesantes.
Saludos!
Géneros de videojuegos
Saludos!
Géneros de videojuegos
View more presentations or upload your own.
Etiquetas:
arcade,
aventuras,
beat'm up,
carreras,
deportes,
generos,
gta,
historia,
lucha,
plataformas,
shoot'm up,
shooters,
street fighter,
Videojuegos
domingo, 25 de enero de 2009
Dispositivos móviles para el juego
Hola, por fin he sido capaz de subir el archivo de la presentación a la página ^^
En ella podemos ver una breve historia de los dispositivos que se han creado durante la historia, y cuales son las nuevas herramientas que se utilizan actualmente.
Un saludo
En ella podemos ver una breve historia de los dispositivos que se han creado durante la historia, y cuales son las nuevas herramientas que se utilizan actualmente.
Un saludo
viernes, 23 de enero de 2009
Evolución de los motores gráficos en los videojuegos
Como objeto de este análisis me centraré principalmente en los motores gráficos de los FPS, más específicamente en aquellos que presentan entornos tridimensionales. Elegí este género de juegos principalmente porque son los punteros en cuanto a desarrollo gráfico, no así en otros aspectos, pero estos escapan al eje central de este estudio. Existen dos tipos de entornos tridimensionales en el mundo de los videojuegos: los simulados y los “computacionalmente” reales. Los primeros basan sus motores en llevar gráficos 2D a 3D y los segundos son netamente mundos en 3D y evidentemente la evolución de los primeros; más adelante veremos las diferencias.
Primera etapa: 1973-1990 FPS tempranos.
En esta primera etapa es cuando comienzan a surgir los primeros intentos de recreación de mundos tridimensionales. Se empiezan a ver las primeras cámaras que permiten un movimiento de 360º (aunque no todas en esta época las implementan). Los escenarios de estos juegos primigenios eran muy sencillos comparados con los actuales, pero en su época fueron un hito y muy posiblemente sin ellos no existiría la calidad actual que disfrutamos en los juegos. Se basaban principalmente en polígonos sencillos como cuadrados o triángulos sin texturar, solo rellenados por un color, en el mejor de los casos, o blanco y negro. La totalidad de estas implementaciones eran tan costosas computacionalmente que el hardware de la época se rendía ante ellos. Tanto era así que en algunos casos no superaban los 2 frames por segundo. A continuación los juegos más significativos de la época.
1973 – Maze War
1980 – Battlezone
1987 – Driller (Freescape Engine)
1987 – Midi Maze
Segunda etapa: 1990-1995 La aparición de las texturas.
Quizás uno de los hitos más grandes en la historia de los videojuegos es la introducción de la tercera coordenada en el mundo virtual que nos presentan, pero si esto se hubiera detenido ahí hoy podíamos estar hablando de los mismos juegos que hace 30 o más años con millones de polígonos más, quién sabe; sin embargo el sector estaba en auge y la cantidad de compañías de diversa índole, no solo centradas en los juegos, comenzaron a interesarse por el género y a desarrollar aplicaciones más complejas que con el paso del tiempo se convertirían en verdaderas obras de arte.
Recopilando, hasta aquí, los juegos, en el mejor de los casos, nos ofrecían un mundo en pseudo-3D con entornos sólidos de colores que se asemejaban muy poco, por no decir nada a la realidad, aunque este último punto, el realismo, no era crítico en estos años, los polígonos violetas o amarillos o los escenarios alámbricos dejaban mucho que desear…fue entonces cuando surgieron las primeras texturas, para muchos el mayor hito en la historia de los videojuegos, y es que sin texturas un juego no es más que eso, un simple juego. Gracias a la genialidad de la dupla de oro de Id Software (John Carmack – John Romero), los FPS, amén de otros géneros, se convirtieron en el género por excelencia gracias a juegos como Doom y Wolfenstein3D. Pero no solo las texturas hicieron su aparición en esta época, la implementación de iluminación y sombreado surgió también para enriquecer aún más si cabía la inmersión del jugador dentro del juego, así como el uso de sprites. Los escenarios seguían siendo mundos planos en pseudo-3D implementados por software, es decir, para poder mover con fluidez cualquier título hacía falta una dupla procesador-memoria únicamente.
1990 – Hovertank3D
1991 – Catacomb3D
1992 – Wolfenstein3D
1993 – Doom (Id Tech1)
1994 – Doom2
1996 – Duke Nukem 3D (Build Engine)
Tercera etapa: 1996-1999 El auge de los modelos 3D y el hardware gráfico.
Los sprites fueron, son y serán un invento muy útil a la hora de generar animaciones por ordenador, tanto es así que la mayoría de juegos hasta el momento los usaban para dar vida no sólo a los personajes, si no a cualquier tipo de forma que necesitara un movimiento. Sin duda los sprites marcaron una época, pero a la hora de dar realismo en entornos que ya evolucionaron totalmente hacia las verdaderas 3D los simples sprites se quedaban cortos debido a su naturaleza bidimensional. Entonces es cuando se decide cambiar hacia los modelos tridimensionales actuales, evidentemente con un menor nivel de detalle, pero que son las bases de lo que hoy posee cualquier juego que se precie de estas características. El modelado en 3D trae consigo también el texturado, por lo tanto no solo hace falta añadirle texturas al mundo (paredes y techo) si no que también a los modelos (meshes), lo cual dificulta bastante esta faceta del desarrollo.
Los escenarios, como se mencionó antes, ya son totalmente en 3D y con una geometría arbitraria, lo que da a los diseñadores un abanico mucho más amplio a la hora de plasmar en el PC sus ideas; ahora se permiten paredes oblicuas, curvas y demás, pero sin duda uno de los avances más importantes es la posibilidad de crear mapas en los que puedan haber salas superponiéndose en los tres ejes de coordenadas, a saber, ningún juego hasta la fecha tenía una habitación encima de otra porque era imposible de controlar debido a la naturaleza 2D del mundo, mas allá de que luego se intentara conseguir un pseudo-3D.
Junto con el tamaño y la calidad de los escenarios también aumento el uso y la calidad tanto de las luces como de las sombras, lo cual requería aún más capacidad de cálculo de las CPUs de la época, ya que hasta este momento todo se hacia mediante renders implementados a nivel de software. Pero esto era prácticamente insostenible, el avance de las técnicas de visualización iba mucho más rápido que el incremento en la potencia de las CPUs y la cantidad de memoria de los equipos, debido a esto, entre mediados y finales de los 90’ surgen las primeras aceleradoras gráficas de la mano de 3dfx, ATI y nVidia (Voodoo, Rage y Riva TNT eran sus modelos respectivamente) que darán soporte exclusivo a la renderización de gráficos en los PCs.
1996 – Quake (Quake Engine)
1997 – Quake II (Id Tech2)
1998 – Unreal (UnrealEngine)
1998 – Half-Life (GoldSrc o GoldSource)
Cuarta etapa: 1999-2003 El hardware T&L y el incremento del detalle.
Juegos como Quake II o Half-Life implementaban ya entornos 3D reales con objetos también en 3D en lugar de sprites, texturas, luces y sombras, lo que incremento los requisitos mínimos hasta el punto de necesitar o bien un procesador extremadamente potente para llevar a cabo vía software todos los cálculos necesarios, o bien una tarjeta aceleradora 3D que liberara a la CPU de la carga de dichos cálculos mediante hardware. Evidentemente la primera opción con el paso del tiempo se volvió inviable como ya se dijo por el incremento en la complejidad de los juegos que culminó con la integración vía hardware del famoso T&L (transforming and lighting), lo que acabó definitivamente con las implementaciones software de los renders (y con compañias como 3dfx que nunca optaron por implementar T&L, o lo hicieron tarde). Gracias a la potencia que ofrecían las flamantes tarjetas de la época, los títulos ganaron en detalle:
- Los escenarios cuentan ahora con muchos más polígonos y vértices que antes y aparecen por primera vez mezclados entornos “indoor” y “outdoor” reales, estos últimos comienzan a tener efectos climatológicos tales como lluvia, viento, nieve…
- Las texturas son más y más grandes gracias a que ahora e guardan en la VRAM (memoria de video) dedicada de la tarjeta gráfica, lo que hace que sea mas rápido su acceso y no ocupe memoria del sistema.
- Se empiezan a implementar sistemas de partículas complejos para dar soporte a fluidos, humos, niebla, etc. Aunque en la mayoría de los casos no son más que puntos y pequeñas aristas, la cantidad de estos es tan grande que hacia imposible usarlos anteriormente.
- Se estandariza la profundidad de color en 32 Bits.
- Comienzan a aparecer luces de colores que dotan de más realismo si cabe los diferentes escenarios.
- Aparecen reflejos en algunos juegos, por ejemplo en el agua, así como también mejoran las sombras.
- Gracias a la liberación de la CPU de muchas tareas, esta está libre más tiempo para otras tareas que llevan a cabo los juegos como la física, la IA, el sonido; todo esto mejora globalmente.
El hardware medio necesario en esta época era una GeForce 2 o una ATI Radeon 7200, dejando para los más exigentes las flamantes GeForce 3 y Radeon 8500, indispensables poco tiempo después debido a la incorporación de los famosos Píxel y Vertex Shaders necesarios para la generación de efectos y animaciones de una manera mas sencilla y rápida para el ordenador, sin embargo en esta época aun no son usados en gran medida.
1999 – Quake III Arena (Id Tech3)
2001 – Max Payne (RemedyMax FX)
2001 – GTA 3 (RenderWare Engine)
2001 – Halo (Halo Engine)
2002 – Battlefield 1942 (Refractor 2)
2002 – Unreal Tournament 2003 (Unreal Engine 2)
2002 – Tron 2.0 (Lithtech Jupiter)
2003 – Max Payne 2 (RemedyMax FX)
2003 – Rainbow Six 3: Raven Shield (Unreal Engine 2)
2003 – Call of Duty (Id Tech3)
Quinta etapa: 2003-2006: Pixel y Vertex Shading
Las tarjetas gráficas ya están totalmente asentadas en el mundo de los videojuegos gracias a la increíble mejora que otorga un hardware dedicado especialmente a la generación de gráficos en 3D. El hardware T&L se hace totalmente necesario y los Píxel y Vertex Shaders (posteriormente unificados) se convierten en un estándar de facto en los juegos ya que proporcionan más herramientas que otorgan a los juegos calidades hasta entonces imposibles de conseguir. Las animaciones empiezan a hacer uso del Vertex Shader mientras que las texturas implementan técnicas como Bump-Mapping o Parallax-Mapping gracias a los Píxel Shader.
Sin embargo lo que caracteriza a esta etapa tiene sin duda nombre y se llama ATI Radeon 9700. Si bien en un principio 3dfx con sus tarjetas Voodoo tenia acaparado el mercado y luego nVidia siempre estaba un paso por delante de ATI, DirectX 9.0 supuso un salto de calidad en los juegos que en un principio solo supo conseguir la serie 9700 de ATI; pero no sólo esto, la tarjeta de ATI hizo posible la incorporación definitiva de dos de las técnicas más importantes de mejoramiento de la calidad de las imágenes: el FSAA (Full Screen AntiAliasing – antidentado a pantalla completa y Anisotropic Filtering – filtrado anisotropico de texturas).
Los motores gráficos de la época entonces comenzaron a contar con todos estos avances hechos durante este periodo de tiempo. Además del ya típico aumento de calidad en forma de cantidad de polígonos, resolución de texturas, vértices… se unen las luces y sombras dinámicas unificadas, los efectos climatológicos ya son un estándar y por primera vez se ven simulaciones de agua totalmente realistas. Los juegos intentan acercarse lo más posible a la realidad, más allá de si la temática que tratan sea o no realista y objetiva, algunos hasta generan las cinemáticas con el propio motor grafico y un lenguaje de script en lugar de usar películas como se hacia hasta este momento.
2004 – Painkiller (PAIN Engine)
2004 – Far Cry (CryEngine)
2004 – Doom 3 (Id Tech4)
2004 – Half-Life 2 (Source Engine)
2005 – F.E.A.R. (lithtech Júpiter EX)
2005 – Call of Duty 2
2005 – Quake 4 (Id Tech4)
2005 – Battlefield 2
2006 – S.T.A.L.K.E.R. Shadow of Chernobyl
Sexta etapa: 2006-Presente Foto realismo y elementos cinematográficos
Con la aceptación masiva del hardware T&L y sus Shaders se provoco que la mejora de los efectos visuales llegaran a cotas insospechadas. Hoy en día se trabaja tanto con Shader Model 3.0 (DirectX 9.0c) como con Shader Model 4.0 y 4.1 (DirectX 10 y 10.1, solo en Windows Vista) que están diseñados específicamente para proporcionar una calidad casi foto realista en los gráficos por ordenador.
Los juegos de esta época cuentan con las técnicas más avanzadas disponibles entre las que se encuentran:
- Utilización de focos de luces HDR (High Dynamic Range). Estas luces de gran rango dinámico permiten simular con gran fidelidad focos tales como el sol que debido a su naturaleza no debería ser representado como una luz normal.
- Además de la unificación ya mencionada de luces y sombras se añaden ahora las sombras suaves, que no es ni más ni menos que la aplicación de un AntiAliasing solo a las sombras para que parezcan más realistas. Esto es posible ahora debido a la potencia del hardware gráfico, ya que es complejo calcular el AA.
- El tamaño de las texturas se dispara en esta época debido a la cantidad de VRAM actual de las tarjetas que es realmente grande, llegando hasta 2Gb inclusive.
- Se estandarizan el uso de técnicas propias de la industria cinematográfica como el Motion Blur y el Depth of Field. El primero de ellos se usa mucho actualmente y se implementa sobre el buffer de acumulación de las tarjetas gráficas, consiste en que al movernos rápidamente por la escena las imágenes perduren unos milisegundos antes de ser tapadas por las siguientes. El Depth of Field o profundidad de campo no es más que el enfoque, es decir si estamos enfocando algo en un primer plano, todo lo que este por detrás se ve difuminado y viceversa.
- La cantidad de polígonos y vértices aumenta considerablemente como siempre.
- En la mayoría de juegos comienzan a verse los ciclos día-noche, mezclado con las técnicas de iluminación actuales hacen que sea totalmente realista.
- Los entornos empiezan a ser totalmente destructibles.
El hardware necesario hoy en día para poder jugar a una calidad media es de un procesador potente (a poder ser de doble núcleo) y una tarjeta grafica que soporte Shader Model 3.0 como mínimo.
Motores gráficos actuales:
Unreal Engine 3
-Gears of Wars
-Unreal 3
CryEngine 2
-Crysis
-Crysis Warhead
Id Tech5
-Rage
-Doom 4
Euphoria
-GTA IV
Source
-Half-Life: Episode 3
Dunia
Far Cry 2
jueves, 22 de enero de 2009
Desarrollo De Videojuegos Con Javascript
Hola a todos. Yá está disponible la presentación de Desarrollo de videojuegos en javascript mediante la librería game lib.
Para los interesados, los próximos días esplicaré pequeños ejemplos de uso de la librería.
Para los interesados, los próximos días esplicaré pequeños ejemplos de uso de la librería.
jueves, 15 de enero de 2009
Herencia aplicada a la animación de personajes
En este caso vamos a programar partiendo de un diseño inicial la parte de un juego que consiste en la interacción con los personajes de un juego.
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);
}
}
}
}
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);
}
}
}
}
Suscribirse a:
Entradas (Atom)