RayCast o como “proyectar rayos” para comprobar colisiones

candy

El pasado miércoles 11 de septiembre se desarrolló una ponencia de Corona en San Francisco en la que realizaban un juego estilo Candy Crush en muy poco tiempo gracias al motor de Corona.

 

Analizando un poco el código que utiliza hay una función del motor de físicas que me ha resultado interesante analizar para comprobar si hay más de 3 piezas en línea.

Se trata de physics.rayCast

Esta función proyecta una línea imaginaria desde el punto A al punto B y comprueba qué objetos colisionan con esa línea y en qué punto lo hacen.

 

Sintaxis:

local colisiones = physics.rayCast( origen_x, origen_y, fin_x, fin_y, <tipo_rayo> ) 

Los cuatro parámetros iniciales son las coordenadas x e y de los puntos de inicio y de fin que definen la línea que representa el rayo.

Si las coordenadas del punto inicial se encuentran dentro de un objeto ya existente se ignoran las colisiones para dicho objeto.

<tipo_rayo> puede tener cuatro valores:

  • “any” –> Devuelve un resultado solamente pero no necesariamente el más cercano (es el más rápido en ejecutarse)
  • “closest” –> Es el valor por defecto. Devuelve la colisión más cercana al punto de inicio si lo hubiese.
  • “unsorted” –> Devuelve todos los resultados, sin un orden en particular
  • “sorted” –> Devuelve todos los resultados ordenados de más cercano a más lejano. Para el ejemplo de la conferencia utilizan  este último valor para que se vayan contando como válidas los más pegados a la “gema” que sean de ese mismo tipo.

Esta función devuelve una lista de elementos el cual contiene cada uno de ellos las siguientes propiedades:

  • “object” –> El objeto con el que colisiona
  • “position.x” –> El punto en el que se produce la colisión en el eje x
  • “position.y” –> El punto en el que se produce la colisión en el eje y
  • “normal.x” –> La componente normal (perpendicular al objeto) de la superficie del objeto en el eje x
  • “normal.y” –> La componente normal (perpendicular al objeto) de la superficie del objeto en el eje y
  • “fraction” –> La cercanía al origen del rayo en número decimal siendo 0 el mismo origen y 1 el final. Para así determinar qué colisión está más cerca que otra.

El código completo también se puede descargar desde github