| Tabla de contenidos |

Componentes fundamentales

Pantallas

Un juego se ve, desde el punto de vista del jugador, como una sucesión de pantallas: la pantalla del menu, la de la acción, la de los resultados, etc.

En Xitai Editor cada pantalla es un objeto de la clase Widget (o derivada), cuyos hijos son, a su vez, widgets.

Los widgets son áreas rectangulares en los que se pueden representar, dinámicamente, una gran variedad de contenidos. Generalmente el rectángulo ocupado por un widget está contenido en el rectángulo del padre. Aunque no siempre es así.

Hay clases específicas de widgets que sirven para diversos propósitos: botones, conmutadores, textos simples o complejos, imágenes, listas, tablas, composiciones complejas a partir de modelos, etc. Cuando queremos que un widget tenga algún comportamiento peculiar, podemos asociarle una máquina de estados (clase Machine).

A los widgets se les puede dar una apariencia gráfica arbitraria mediante los objetos de clase Style y derivadas.

Las transiciones de una pantalla a otra están gobernadas por una máquina de estados de la clase Machine. Dicha máquina utiliza la información de estado del juego o señales enviadas por diversos objetos activos para decidir cuándo cambiar de pantalla. También puede ser responsable de la inicialización de algunas variables, gestión de la música, adaptación de la visibilidad de widgets, y otras tareas generales.

Textos

Algunas clases de objetos tienen atributos de tipo texto. Algunos de estos textos son dependientes del idioma establecido como actual en el juego. Se pueden definir todos los idiomas que se desee y se puede cambiar de idioma en cualquier momento. Todos los textos visibles se mostrarán automáticamente en ese idioma.

Se pueden insertar valores derivados en los textos con ayuda de un sencillo lenguaje de plantillas que permite, además, generación de listas e inserción condicional (clase MicroTemplate).

Para el despliegue de contenidos con múltiples tipografías, colores, recuadros, formato de párrafos flexibles, imágenes o animaciones incrustadas, etc. existe un modo de codificación del texto que es soportado en el widget RichTextWidget.

Para facilitar esta tarea se pueden definir diferentes estilos de texto y párrafo y asignarlos a etiquetas de xml con los que definimos así diferentes traductores de estilo para diferentes usos (clase XMLStyleParser).

Imágenes

Media

Mundos

Un mundo es un objeto de clase derivada de World, que contiene el armazón visual y los elementos activos (actores) que constituyen la acción del juego. pueden tener asociada una máquina de estados (clase Machine).

Hay una clase de widget muy importante que es WorldWidget. Es aquí donde se representa la acción. Cada WorldWidget representa un mundo.

Puede haber varios WorldWidget que representen el mismo o diferentes mundos. Cada WorldWidget puede tener sus opciones de representación distintas y su propia cámara (gestor del punto de vista). La cámara puede estar asociada a un actor y cambiar el punto de vista dependiendo del movimiento de dicho actor.

Escenarios

Cada objeto World puede tener asociado un escenario (objeto de clase Stage), que puede usarse para desarrollar la parte interactiva del juego, o como decoración.

Los escenarios definen el estado inicial del mundo donde se desarrolla la acción, a partir del cual evoluciona mediante la creación, destrucción y actividad de los actores.

Están constituidos por un número indeterminado de capas de distintas clases (derivadas de Layer), que describen el aspecto visual, las propiedades físicas, los actores iniciales, y otros elementos auxiliares, como nodos y caminos.

Actores

Cada actor es una instancia de un modelo: el personaje (clase Character). Los actores pueden desaparecer o crear otros actores durante la acción. Cada actor puede tener un dueño (master), que es por defecto el actor que lo creó. Con el master pueden establecerse algunas ligaduras importantes.

Los actores suelen tener asociada una máquina de estados que define su comportamiento (clase Machine).

Hay diferentes tipos genéricos de personajes, por ejemplo: sin física, con física, composiciones, sistemas de partículas, indicadores, etc. La representación gráfica de los actores puede variar:

Escenas

Los niveles del juego se implementan en Xitai Editor mediante objetos de clase Scene. La escena es un concepto muy general, se puede cambiar de escena en cualquier momento mediante las máquinas de estados.

Cada escena puede tener asociada una máquina de estados (clase Machine).

Usando clases derivadas de Scene y mediante Expresiones la escena puede personalizar flexiblemente los escenarios que se usarán y las capas opcionales activas de cada escenario. Se pueden representar distintas escenas con los mismos escenarios o modificar la dificultad.

Las escenas se pueden agrupar para delimitar mundos o superniveles (clase SceneGroup). Los hijos de las escenas son los portales, (clase Portal) que definen los lugares de comunicación, o teletransporte de los actores entre escenas.

Los personajes declarados singulares pueden moverse entre escenas conservando su estado general.

Variables de estado

Algunos atributos de los objetos pueden hacer referencia, mediante Expresiones, a otros atributos del mismo objeto o de otros. Es una manera de reutilizar valores y, mediante acciones de máquina de estados, manipular los valores de algunos atributos. Estos atributos son lo que se conocen, generalmente, como variables de estado.

Hay tres clases esenciales para el manejo de estos datos:

Data
Es una clase de objeto cuya única intención es la de ser extendida con atributos nuevos. Puede tener como hijos otros objetos de clases Data, Collection o HandleSet.
Collection
Maneja una lista de objetos con un valor para cada uno. Hay acciones y condiciones de las máquinas de estados para manipular dicha lista. Es muy útil para mantener inventarios o aplicar diversas técnicas de inteligencia artificial.
HandleSet
Son listas de handles. Los handles son identificadores de actores o nodos de un escenario. Un HandleSet puede almacenar resultados de la creación de actores, búsqueda de caminos o selección de áreas del escenario.

Interacción

La interactividad se realiza mediante el teclado, ratón, controlador de juego o pantalla táctil.

Objetos de clase GamePadButton nos permiten definir hasta 32 entradas discretas, que pueden representar teclas, pulsadores de un controlador de juego, botones del ratón o áreas sensibles de la pantalla.

Para entradas de valores dentro de un rango, como los joysticks, existe la clase GamePadAxis, que puede ser configurada para obtener su valor de joysticks del mando de juego o sintetizado a partir de toques de pantalla.

También son accesibles en todo momento las coordenadas del último toque en pantalla táctil o de la posición del cursor del ratón en el atributo touch_position de World2D.

Existe una variedad de métodos de utilización de estas fuentes de información en condiciones de máquinas de estados.

Sincronización

En algunas ocasiones hay acciones del juego que dependen de que algunas máquinas estén o no en determinados estados. Por ejemplo: un juego por turnos no puede dar la posiblidad de cambiar de turno hasta que todos los jugadores hayan completado sus opciones.

Hay tres clases de objetos que ayudan a mantener esta sincronización:

Counter
Cada estado de la máquina de estados puede hacer referencia a un objeto de este tipo. Cuando se entra en el estado se incrementa el contador y cuando se sale se decrementa. Esto puede servir para saber cuántas máquinas entán en un estado concreto o relacionado.
Lock
Bloqueo. Este objeto está adquirido por una máquina o libre para ser adquirido. Sólo una máquina puede adquirir el bloqueo al mismo tiempo.
Meeting
Reunión. En este objeto una máquina primero se registra con una acción. Luego puede entrar o salir durante un estado especial. Mediante una condición se puede saber si la reunión está completa.

Comunicaciones

Hay diversos mecanismos de comunicación entre objetos del juego o con el mundo exterior.

Mensajes
Se pueden envíar mensajes a actores concretos o a sus dependientes (slaves). Estos mensajes constan de un valor simbólico (Messages definidos en el Symbol Browser), un número y un objeto de clase Data opcional.
Señales
Las señales son emisiones sin destinatario predeterminado. Son objetos de clase Signal y pueden recibirlas todos los objetos interesados en ellas. Cada señal puede contener un número y una referencia a un objeto de cualquier clase.
Canales
Un canal es un objeto, derivado de Channel que sirve para enviar o recibir datos simples y otros objetos, con hijos incluidos. Los tipos de objeto enviados están limitados a la clase Data y derivadas. Estos, a su vez pueden contener referencias a imágenes. El objeto es recibido como copia temporal del original enviado.
El canal de tipo DataPipe envía y recibe objetos dentro del juego. El de tipo HttpRequest puede usarse para comunicarse con un servidor web externo mediante Internet.
TcpChannel y UdpChannel pueden comunicar dos o más intancias de un juego o algún servicio que soporte el protocolo. Tienen la posibilidad de descubrimiento automático en la red local.
El conector del servidor de juegos GameServices), es también un canal que puede usarse para intercambiar objetos con otros jugadores.
Partidas multijugador
La clase MatchStatus permite la creación y gestión de partidas de varios jugadores. esta clase contiene, como hijos, a los participantes (Participant).

Persistencia

En la rama Persistence del sistema de objetos residen aquellos que pueden conservar el valor de sus atributos variables entre ejecuciones del juego.

Estos datos se respaldan en el sistema de archivos local o en un servidor de juegos accesible por Internet.

Se recuerdan automáticamente:

En objetos de clase Slot puede guardarse, mediante acciones de máquina de estados, el estado general actual del juego, incluido el estado del escenario actual y los actores marcados como persistentes.

Paquetes

Cuando desarrollamos un juego es habitual que mantengamos varias versiones al mismo tiempo. Pueden ser, por ejemplo, adaptaciones a distintas plataformas, demos, premium, distribuciones por entregas, etc.

En Xitai Editor lo gestionamos mediante el objeto de clase Package. Podemos definir todos los que queramos, pero sólo uno se incluye en cada distribución final concreta.

Estos objetos contienen atributos que especifican la resolución preferida de la ventana, una referencia a la máquina de estado global y una etiqueta del tipo de paquete que sirve para filtrar las entradas de datos o las escenas permitidas en la distribución. (Sólo se exporta al paquete final el contenido que se use).

Las diferentes máquinas de estados de la aplicación pueden consultar los atributos del Package actual para adaptarse a sus particularidades.

Es obligatorio que el proyecto contenga al menos un objeto de esta clase, para poder construir una distribución del juego que se pueda publicar y ejecutar fuera del editor.

 
Expresiones   Facilidades de depuración


(C) Paco Suárez (pacosu@xitai,es). 2020.
XITAI