Los objetos de Phaser

GameObjects en Phaser


En los ejemplos anteriores, hemos visto como crear una imagen. En el universo de Phaser, estas imágenes se denominan objetos del juego (o GameObjects). Existen muchos más y todos se utilizan de forma muy similar, por lo que si sabemos utilizar una, es muy probable que sepamos utilizar el resto.

Por esta razón, en Phaser, una de las primeras cosas que debemos saber, son los tipos de objetos que existen. De esta forma podemos saber cuál es el objeto más apropiado para realizar nuestro objetivo.

Objetos básicos

En nuestras primeras tomas de contacto, trabajaremos sólo con objetos básicos de Phaser, pero poco a poco, iremos aprendiendo más sobre objetos más avanzados que permiten hacer más cosas y se utilizan para casos más específicos.

Los principales serían los siguientes:

ObjetoDescripciónMétodo para añadir
ImageImagen estática (en formato soportado por navegador).this.add.image()
SpriteImagen animada, basada en SpriteSheet (hoja con varias imágenes).this.add.sprite()
TextTexto renderizado a traves de una tipografía.this.add.text()
GraphicsConjunto de formas, trazos o dibujos personalizados.this.add.graphics()

Conviene que nos basemos en estos primeros tipos de objetos y no profundicemos demasiado en nuestros primeros pasos, ya que hay muchos tipos de objetos y nos pueden abrumar la cantidad de posibilidades disponibles.

Objetos multimedia

Dentro de los objetos multimedia, donde predominan distintos tipos de imágenes, tenemos imágenes estáticas, imágenes orientadas para realizar animaciones, imágenes repetibles como mosaicos y que se desplazan de forma animada, imágenes de renderizado eficiente mediante blitting, imágenes ajustables y videos:

MétodoDescripción
this.add.image(x, y, key)Añade una imagen (estática) en x, y.
this.add.sprite(x, y, key)Añade un imagen (animada) en x,y. Puedes crearla con Aseprite.
this.add.tileSprite(x, y, w, h, key)Añade una imagen (mosaico) en x,y de ancho w×h.
this.add.blitter(x, y, key)Añade una imagen (renderización eficiente usando blitting) en x,y.
this.add.nineslice(x, y, key)Añade una imagen ajustable (utilizando la técnica 9-slice) en x,y.
this.add.video(x, y, key)Añade un video en x,y.

La idea en todos estos tipos de objeto es que utilicemos el que mejor se adapte a nuestro caso. Si la imagen que vamos a utilizar es estática y no tiene animación, no tiene ningún sentido que utilicemos sprite, y es preferible que usemos image.

Otros objetos básicos

Al margen de los anteriores, tenemos otros objetos sencillos como text, que nos permiten escribir textos en cualquier parte de la pantalla, utilizando una tipografía personalizada. Existen otros más avanzados como BitmapText o DynamicBitmapText, pero nos centraremos primero en los más sencillos.

MétodoDescripción
this.add.text(x, y, text, options)Añade un texto a la escena.
this.add.grid()Añade una cuadricula o rejilla.

Por otro lado, tenemos grid, que es una forma sencilla de crear una simple cuadricula, rejilla o grid a lo largo de la pantalla.

Animaciones o transiciones

Mediante los tween podemos realizar transiciones o animaciones con cualquier objeto variando alguna de sus propiedades, siempre y cuando sea cuantificable. Por ejemplo, la opacidad de un elemento se gestiona a través una propiedad alpha que va de 0.0 (transparente) a 1.0 (opaco).

Con los tweens podemos gestionar una propiedad como alpha para que vaya desde un valor inicial a uno final en un determinado tiempo. Consiguiendo esa transición o animación. Lo mismo se puede hacer con la posición en horizontal x, la posición en vertical y, la escala o tamaño de la imagen, etc:

MétodoDescripción
this.add.tween()Añade un efecto suave de transición/animación a un elemento.
this.add.tweenchain()Añade una lista de tweens para ejecutar uno detrás de otro.
this.add.timeline()Añade una lista de eventos programados para ocurrir en el futuro.

Luego, disponemos de tweenchain, que no es más que una lista de tweens encadenados, y timeline que es algo un poco más avanzado, para crear una línea de tiempo más avanzada y personalizada.

Objetos avanzados

En esta segunda parte tienes otros tipos de objetos algo más avanzados, que sirven para casos mucho más específicos. Ten en cuenta que hay algunos tipos de objetos que no he incluido en la lista, por ser muy específicos o demasiado avanzados.

Agrupaciones o contenedores

A medida que tu juego vaya creciendo, necesitarás organizar más y más tu código para que no sea difícil de leer y modificar. Para ello, existen unos objetos orientados a la organización de elementos que son muy similares, pero tienen algunos matices y diferencias:

MétodoDescripciónObjetivo
this.add.container(x, y, childs)Añade childs a un contenedor.Realiza acciones sobre todos los elementos.
this.add.group(childs)Añade childs a un grupo.Considerar múltiples objetos como si fueran uno.
this.add.layer(childs)Añade childs a una capa.Controlar orden de renderizado.
this.add.zone(x, y, w, h)Crea una zona invisible.Detectar colisiones o hacer comprobaciones.

Por un lado, los contenedores nos permiten agrupar objetos y realizar transformaciones (mover, escalar, rotar...) como si fueran uno solo. Por otro lado, los grupos están diseñados para gestionar múltiples objetos a la vez, pero las transformaciones no les afectan. Por último, los layers o capas nos permiten controlar el orden de renderizado de los objetos hijos, algo especialmente útil cuando queremos que algo esté por encima de otro (menús, personajes, etc...).

Las zonas es una categoría algo diferente, ya que son zonas invisibles que se utilizan para detectar colisiones o hacer comprobaciones rápidas, pero no permiten incluir objetos en ella.

Formas gráficas

En algunos casos nos puede interesar crear objetos que realizen trazos, formas o simplemente dibujar algo. Para esto, tenemos el objeto graphics, que nos permite hacer prácticamente cualquier operación de dibujo. Luego, tenemos el resto de métodos (arcos, círculos, elipses, líneas, etc...), que son casos muy concretos y especiales, que conviene utilizar antes si encajan con lo que necesitas:

MétodoDescripción
this.add.graphics()Añade un elemento gráfico personalizado.
this.add.arc()Añade un arco.
this.add.circle()Añade un círculo.
this.add.ellipse()Añade una elipse.
this.add.curve()Añade una curva.
this.add.line()Añade una línea.
this.add.star()Añade una estrella.
this.add.polygon()Añade un polígono.
this.add.rectangle()Añade un rectángulo.

Recuerda que graphics es el más potente de todos, pero también el más complejo. El resto son cómodos porque están ya implementados y son rápidos de utilizar.

Perspectiva isométrica

Phaser también tiene algunos métodos para trabajar en [perspectiva isométrica] y crear elementos que ya tienen esa perspectiva y podemos utilizarlos para componer y crear elementos más complejos. De momento tenemos métodos para crear cajas y triángulos:

MétodoDescripción
this.add.isobox()Añade una caja isométrica.
this.add.isotriangle()Añade un triángulo isométrico.

Otros objetos

Además de todos los objetos vistos hasta ahora, tenemos algunos otros que merece la pena mencionar. Objetos para crear y manipular mapas de casillas o «tiles», trabajar con elementos del DOM y métodos más enfocados en operaciones 3D como mesh(), rope() o shader():

MétodoDescripción
this.add.tilemap()Añade un mapa de tiles creado con Tiled.
this.add.dom()Añade un elemento al DOM del HTML.
this.add.mesh()Añade un elemento complejo o 3D usando modelos Wavefront.
this.add.particles()Añade un emisor de partículas 3D.
this.add.pointlight()Añade un punto de luz en la escena.
this.add.rope()Añade un efecto de cuerda con vértices, estirable.
this.add.shader()Añade un shader a la escena.

Pueden ser muy útiles, pero escapan un poco del punto de nivel en el que estamos y habría que tratarlos algo más adelante, cuando ya tengamos soltura con Phaser.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev