Qt es un framework que consta de herramientas destinadas a la creación rápida y eficiente de aplicaciones e interfaces de usuario para escritorio, sistemas embebidos y plataformas móviles. Con Qt es posible reutilizar el código de forma eficiente para ser desplegado en diferentes plataformas con un mismo código base. La biblioteca de clases en C++ y las diferentes herramientas permiten al programador crear aplicaciones en una plataforma y compilarla y distribuirlas en otras.
Entre los diferentes módulos de Qt se encuentra Qt Quick el cual es una biblioteca estándar para el desarrollo de aplicaciones con QML. Mientras el módulo QML brinda el motor y la infraestructura del lenguaje, Quick brinda todos los tipos básicos necesarios para la creación de interfaces gráficas. Posee un canvas para mostrar el contenido y diferentes tipos de datos para la creación y animación de componentes visuales, procesamiento de la entrada de teclado y ratón, creación de modelos y vistas de datos y la creación retardada de objetos. El módulo Quick brinda una API QML la cual provee los tipos de datos QML para la creación de interfaces gráficas y una API C++ para extender las aplicaciones QML con código C++.
Qt Quick provee todo lo necesario para crear aplicaciones potentes con una interfaz gráfica dinámica y fluida. Las animaciones y los efectos de transición entre estados son elementos de vital importancia para este módulo. Los efectos visuales pueden ser complementados con componentes especiales como sistemas de partículas y shaders. A continuación se muestran algunas características de Qt Quick que lo convierten en una buena elección para el desarrollo de videojuegos sencillos:
Alto rendimiento con grafo de escena: Qt Quick (versión 2.0) requiere OpenGL 3.0 (u OpenGL 2.x con la extensión framebuffer_object) para renderizar la ventana diseñada en QML. El módulo define un grafo de escena que es luego renderizado. Mediante el uso de la GPU se logra mucho mayor rendimiento que en la versión anterior.
Entradas de usuarios: Qt Quick brinda los siguientes elementos para procesar entradas:
- Táctil: Qt Quick fue diseñado teniendo en mente las pantallas táctiles y por esto cuenta con eventos táctiles soportados por diferentes elementos visuales.
- Ratón: el módulo cuenta con el elemento MouseArea el cual recibe automáticamente eventos de ratón (como clicks y eventos de rueda).
- Teclado: cualquier elemento visual recibe entradas de teclados a través del tipo Key.
- Gestos de movimientos en dispositivos: Qt Quick por si mismo no ofrece soporte de nativo para gestos físicos de dispositivos pero el módulo Qt Sensors provee tipos QML los cuales soportan dichos gestos.
Estados, transiciones y animaciones: un aspecto llamativo de los juegos son las transiciones entre estados y las animaciones que brindan un atractivo visual al usuario, en Qt Quick estos son conceptos de máxima importancia.
· Estados: el estado de un elemento visual es el conjunto de informaciones que describe cómo y dónde se muestran las diferentes partes que conforman el elemento y todos los datos asociados al estado. Qt Quick provee el elemento State que contiene propiedades que definen su semántica y se puede utilizar para desencadenar comportamiento o animaciones.
· Transiciones: cuando un elemento cambia de un estado a otro su apariencia cambia, una transición es lo que separa dos estados. Qt Quick provee el elemento Transition el cual define lo que ocurre cuando se pasa de un estado a otro.
· Animaciones: cuando se pasa de un estado a otro se puede utilizar una animación para suavizar la transición. Cambios abruptos de la interfaz resultan en una mala experiencia visual y deben ser evitados utilizando animaciones.
· Animación de propiedades: las animaciones no solo están relacionadas con estados y transiciones entre estados. A veces es útil animar el cambio de ciertas propiedades de los elementos, por ejemplo la opacidad. Qt Quick provee el elemento PropertyAnimation que se puede utilizar para este fin.
· Animadores: el tipo Animator es un tipo especial de animación el cual sobrepasa el objeto QML y opera directamente en las primitivas del grafo de escena. Entre los animadores se encuentran: XAnimator, YAnimator, ScaleAnimator, RotationAnimator, OpacityAnimator y UniformAnimator.
Datos, Modelos, Vistas y Almacenamiento de datos: la mayoría de los juegos tienen datos guardados que necesitan mostrar al usuario, estos datos pueden venir de la red, ficheros locales o bases de datos.
· Modelos y vistas: a veces es útil mostrar un mismo dato de diferentes maneras, de esta manera surge la idea de tener un modelo que contiene los datos y las vistas las cuales muestran los datos. El paradigma Modelo/Vista está implementado en Qt Quick el cual puede ser utilizado en el juego.
· Almacenamiento y acceso a datos: las bases de datos son utilizados comúnmente para almacenar información en los juegos, como por ejemplo los records de puntos o de tiempo alcanzados por los jugadores en los diferentes niveles. El módulo Qt Quick local storage provee acceso simplificado a bases de datos relacionales.
Partículas y efectos gráficos: los juegos con interfaces gráficas llamativas resultan más interesantes. El módulo Qt Quick provee herramientas para lograr una aplicación visualmente atractiva pero manteniendo la experiencia de usuario.
- Transformación visual: los elementos visuales pueden ser transformados, por ejemplo escalados o rotados.
- Efectos de shader: los efectos de shader permiten utilizar al máximo la capacidad de procesamiento de la tarjeta grafica mediante vextex o fragment shaders.
- Partículas: el sistema de partículas permite crear explosiones, fuegos artificiales, humo, niebla, efectos de viento incluso gravedad y turbulencia.
- Sprites: un sprite es un tipo de imagen animada constituida por frames. Qt Quick provee un tipo de dato visual para visualizar sprites los cuales pueden ser utilizados en juegos.
- Opacidad: los objetos pueden ser opacos o traslucidos, por ejemplo se puede hacer un objeto opaco y otro transparente para centrar la atención del usuario en el opaco.
Tipos de datos convenientes: en un juego muchas veces el programador necesita reaccionar a eventos y desencadenar varias respuestas. QML tiene soporte para estos conceptos a través de enlaces, señales, gestores de señales e inicialización dinámica de objetos.
- Inicialización dinámica de objetos: QML provee varias maneras de crear y gestionar objetos. Se pueden crear dinámicamente mediante Javascript o utilizando los tipos de datos Loader, Repeater, ListView, GridView y PathView.
- Conexión dinámica de señales: QML soporta la conexión dinámica de señales a través del método connect().
- Eventos basados en timers: otro caso común es desencadenar una funcionalidad un periodo de tiempo después de que un evento ocurra. Qt Quick provee el tipo Timer, el cual posee soporte para eventos simples o recurrentes.
Lógica del juego en Javascript: la lógica del juego se puede programar mediante un fichero Javascript. Este es un lenguaje mucho más sencillo que C++ pero que tiene todas las herramientas para desarrollar un juego de calidad. Para llamar a las funciones desde la interfaz solo basta con importar el fichero, y para acceder a los elementos de la interfaz desde el fichero Javascript simplemente hay que utilizar el id de cada elemento. Además el código puede ser depurado mediante Qt Creator solo hay que poner un breakpoint en la función y ejecutar la aplicación con F5. En el modo de depuración se puede ir observando el valor de las variables y así encontrar errores que de otra manera serían difíciles de detectar.
Todas las características de Qt Quick mencionadas anteriormente demuestran que es un módulo muy potente para la creación de juegos. Con relativamente poco código haciendo uso del lenguaje declarativo QML se puede lograr un juego atractivo y tan complejo como se quiera. En la ayuda de Qt se pueden encontrar varios ejemplos de todo lo que se puede lograr con este módulo. Es recomendable utilizarlo en juegos 2D y aplicaciones para pantallas táctiles para sacarle el máximo provecho a todas las características que posee.