Navigation

Parte 6 - Cuerpos y Velocidad: Un mundo físico

Phaser es compatible con una variedad de sistemas físicos diferentes, los cuales se pueden usar en cualquier escena. En el momento de escribir este tutorial, Phaser incluye los sistemas Arcade, Impact y Matter.js. Por sencillez usaremos el sistema Arcade para nuestro juego ya que es simple y ligero, perfecto para los navegadores móviles.

Cuando se crea un sprite con físicas se le asigna una propiedad body, que es una referencia a su cuerpo físico en el sistema Arcade de Phaser. El objeto 'body' tiene muchas propiedades y métodos con los que podemos jugar.

Por ejemplo, simular los efectos de la gravedad en un sprite es tan simple como escribir:

player.body.setGravityY(300)

Este es un valor arbitrario pero, lógicamente, cuanto mayor sea el valor más pesado será el objeto y más rápido caerá. Si añade esto a su código o ejecuta part5.html verá que el personaje cae sin detenerse, ignorando completamente el terreno que se ha creado anteriormente:

image

El motivo es que no se está comprobando si se produce una colisión entre el suelo y el personaje.

Anteriormente se indicó a Phaser que el suelo y las plataformas eran cuerpos estáticos. Si no se hubiera hecho eso y se hubieran creado dinámicos, cuando el personaje chocara con ellos se detendría por un momento y luego todo caería. Esto se debe a que, a menos que se indique lo contrario, el sprite del suelo sería un objeto físico en movimiento y, cuando el jugador lo golpease, la fuerza resultante de la colisión se aplicaría al suelo, por lo que los dos cuerpos intercambiarían sus velocidades y el suelo también comienzaría a caer.

Para permitir que el personaje colisione con las plataformas hay que crear un objeto Collider. Este supervisa si dos objetos físicos (que pueden incluir grupos) colisionan o se superponen entre ellos. Si esto ocurre se puede ejecutar una función propia opcionalmente, pero para detectar el simple hecho de que el personaje colisione con las plataformas no es necesario:

this.physics.add.collider(player, platforms);

El Collider es el que realiza la magia. Detecta la colisión o superposición de dos objetos. En este caso se le está indicando que monitorice si hay contacto entre el sprite del personaje (player) y el grupo de plataformas (platforms). Es lo suficientemente inteligente como para detectar una colisión contra cualquier miembro del grupo, por lo que sólo es necesaria esta línea para indicar que el personaje colisiona con el suelo y cualquier plataforma. El resultado es una estructura firme que no se cae:

image