Creando bots para tus juegos: lasers y sensores.

Uso básico de lasers y sensores

Pilas engine cuenta con estas dos herramientas cuyo uso permite hacer enemigos inteligentes y mecánicas complejas. Para enseñar a usarlos he diseñado un ejemplo y comentaré brévemente lo que creo es importante a la vez que les dejo un link al proyecto con el código comentado.

¿Qué son? Los lasers, también llamados raycast en otros motores, son "rayos" que permiten que el actor se anticipe a las colisiones o detecte colisiones a la distancia. En versiones anteriores de pilas no existía esto, sino que se usaban los sensores. Los sensores funcionan muy similar a los lasers, pero son como un área y por eso pueden detectar varias colisiones a la vez.

¿Cómo creo un laser o sensor? Es muy simple, ya que los mismos funcionan como variables.Veamos como crear un laser llamado alcance:

  1. Desde las propiedades del actor está la posibilidad de crear un laser y ponerle un nombre, llamamémosle alcance, de largo pongamos 200 y de rotación 0.
  2. A partir de aquí haremos todo desde del código del actor. Creamos una variable llamada alcance y del tipo Laser. (alcance: Laser)
  3. En la función iniciar le vamos a asignar a la variable alcance el laser alcance mediante la siguiente linea:
    this.alcance = this.obtener_laser("alcance");

Los sensores se crean de manera similar: creamos una variable del tipo Sensor, creamos el sensor desde las propiedades del actor y en iniciar() le asignamos  a la variable el sensor correspondiente.

Veamos antes de continuar una breve descripción, hecha por mi, de los métodos que admite una variable del tipo Laser llamada alcance:

  • this.alcance.actor: Es del tipo Actor. Devuelve las características del actor poseedor del Laser.
  •  this.alcance.distancia_al_actor_con_etiqueta("etiqueta"): Del tipo number. Hace lo que su nombre indica. El actor con el que detecta la distancia debe tener la etiqueta que pongamo sentre comillas.
  • this.alcance.distancia_al_actor_mas_cercano(): Similar al anterior.
  • this.alcance.longitud: Del tipo number. Modificable. Devuelve el largo del laser y se le puede asignar un valor para hacer al laser mas o menos largo.
    por ejemplo this.alcance.longitud = 100 haría al laser de 100 (no se en qué medida es) de largo.
  • this.alcance.nombre: Del tipo string. Modificable. Similar al anterior. Devuelve el nombre del mismo laser.
  • this.alcance.rotacion: Del tipo number. Modificable. Similar a los anteriores.
  • this.alcance.obtener_actor_mas_cercano(): Del tipo Actor. Cumple lo que promete.
  • this.alcance.obtener_colisiones(): Del tipo array(eso creo). Devuelve una lista con informaciones del tipo Object de todos los actores que toca el laser. Podemos acceder a ellos mediante los métodos para array como por ejemplo:
    let colisiones = this.alcance.obtener_colisiones();
    colisiones.actor[0]
     //devuelve el primero de los elementos (siempre del tipo Actor) de la lista.
    colisiones.actor[0].eliminar() //eliminaría al primer actor que tocó el laser.
Y para una variable del tipo Sensor que llamaremos vision:
  • this.vision.cantidad_de_colisiones: Del tipo number. Hace lo que su nombre indica.
  • this.vision.cantidad_de_colisiones_con_la_etiqueta("etiqueta"): Del tipo number. Similar al anterior, sólo que ignora a las colisiones cuyo actor no tenga la etiqueta pedida.
  • this.vision.colisiona_con_etiqueta("etiqueta"): Del tipo boolean. Devuelve true si colisiona con un actor que posea la etiqueta pedida.
Los restantes métodos de sensor casi no son utilizados. Estas descripciones fueron hechas por mi a través de la experiencia y me habría ahorrado bastante tiempo si la hubiera tenido yo a mano y por ello la comparto aquí.

Un ejemplo: Disparo automático

Este ejemplo es un uso sencillo que se le puede dar a ambos y es que podemos usar tanto lasers como sensores para esto, aunque es mejor usar lasers.

ejemplo 1 de lasers (mega)

La nave tiene un laser llamado alcance y a través del código:

this.alcance.colisiona_con_un_actor_de_etiqueta("enemigo")

Observamos si el actor al cual el laser toca tiene una etiqueta igual a enemigo, devolviendo true en caso de ser así. Esto será así siempre que tal actor enemigo tenga una figura de colisión, de lo contrario el laser no interactuará. Como el método devuelve true, lo podemos meter dentro de un condicional if. Y decir que si es true, entonces se dispare.

Comentarios

Entradas populares de este blog

Comenzando en Pilas Engine 2

Movimientos en círculos

Creando bots para tus juegos en Pilas engine