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.
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).
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.
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.
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:
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.
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:
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.
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:
Hay diversos mecanismos de comunicación entre objetos del juego o con el mundo exterior.
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.
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.