pilas-engine

Cambiar posicion del sensor mediante código

Hola a todos, estoy haciendo un juego para una Game Jam, que es una competencia sobre crear un videjuego en unos dias con un tema particular. Quería saber si se puede cambiar la posición mediante código de un sensor, ya que mediante este es que voy a manejar las colisiones de una espada del personanje. Comparto una captura del juego para que se entienda lo que digo:
image
El sensor a la derecha sería el área en la que la espada pegaría. Sé que puedo usar dos sensores, pero a lo mejor hay alguna manera de cambiar la posición del mismo como sucede con los Lasers que puedes rotarlos mediante código.
Por si a alguien le interesa la game jam la organiza un youtuber en itch io : Tu juego a juicio Jam
El tema es demasiado largo, comenzó ayer y hay dos semanas para hacer el juego. Pienso hacer un juego de plataformas cuyo personaje tiene una espada demasiado larga.

Jaja, yo también quería entrar a la jam de Alva pero estoy muy ocupado en estos días ja. Mucha suerte amigo
Pero: no te olvides de poner el logo de pilas así más gente conocen de su existencia :wink:

1 Like

¡Hola!, los sensores no se pueden rotar al menos por ahora… pero se me ocurrió un “hack” para permitir hacer esa espada con colisiones. ¿Que tal si la espada tuviera 3 sub-actores para representar la colisiones?

2021-08-19 lt37d

Te paso el proyecto por si te sirve la estrategia:

Abrir este proyecto en el editor de pilas

Los sensores no se ven en el modo ejecución, pero si pulsás pausa se van a visualizar. Ah, y los sub-actores tienen una imagen, podés ponerles transparencia = 100 para que no se vean.

Igualmente me quedé pensando que los sensores se deberían poder rotar, voy a investigar a ver si es realizable, calculo que sí, pero voy a tener que mirarlo bien.

Por cierto, ¿un laser no te sirve para este caso?

1 Like

rotar como tal no me hace falta, sino cambiar la posición. Es decir, que de estar a la derecha del personaje pueda pasar a estar a la izquierda.
Mi idea es que cuando pega un espadazo, todos los enemigos que toquen el sensor se eliminen (me costó un poco eso por cierto), pero claro el sensor está a la derecha, si el personaje mira a la izquierda yo queria poder mover el sensor y que esté a la izquierda. ¿Me explico?
Igualmente era sólo para hacerlo elegante, puedo poner dos sensores, uno a cada lado y ya está jaja

Por cierto probé diversas maneras de manejar la espada, incluído algo similar a tu ejemplo, y llegué a la conclusión de que lo mejor era usar sensores que marcaran un área en el cual la espada pega, de esta forma podría pegarle a enemigos voladores por ejemplo.

Ahhh, ok, ahí entendí. Se pueden mover los sensores sin problemas desde el código:

sensor-que-gira

Te paso el proyecto, observa que el código que mueve al sensor está dentro de un
método llamado actualizar_sensores. Ahí vas a ver algo de código interno de pilas, si necesitas ayuda para que te detalle lo que hace el código avisame:

Abrir este proyecto en el editor de pilas

¡Abrazo!

1 Like

Hola @hugoruscitti me niego a rendirme en esta cuestión…
Resulta que esa vez no entendí y terminé poniendo 4 sensores, uno para cada lado y un montón de código jeje… Pero ahora que no tengo apuro prefiero tomarme el tiempo de aprender a cambiarle la posición del sensor y además quería saber cómo podría cambiarle el tamaño.
Te cuento lo que entiendo del código que usaste en el último ejemplo:

    // Esta es la función interna que mueve el sensor.
    Body.setPosition(figura, {
      x: x + distancia_x,
      y: y - figura.distancia_y
    });

Entiendo todo menos la función setPosition(), es decir, entiendo que el x,y serían la posición del Body. No entiendo exactamente cómo funcionan esas posiciones. ¿Respecto de qué está el distancia_x?
Yo quiero lograr que según la rotación del actor, el sensor se mueva para estar en frente. Te paso un ejemplo donde lo configure para que funcione si vas a la derecha, pero para arriba no:
Abrir este proyecto en el editor de pilas

Hola @lukeitor !!!

La función setPosition es un poco rara realmente, porque es una
función interna de matter, el motor de física que usamos dentro del
motor, así que las coordenadas son un poco distintas a las de pilas.

Por ejemplo, para matter, la coordenada 0,0 es en realidad la esquina
superior izquierda del escenario y no el centro de la pantalla. Además, para
matter el eje y está apuntando hacia abajo, osea que una posición como x=0, y=200 se dibujará 200 píxeles hacia abajo respecto de la esquina superior
izquierda del escenario.

Así que para indicarle coordenadas a matter sin complicarnos mucho armé
esa función que se llama convertir_coordenada_de_pilas_a_phaser, sin
embargo, cuando se llama a setPoisition hay que tener en cuenta estos
detalles de todas formas.

Por ejemplo, tomemos este ejemplo de tu código:

let { x, y } = this.pilas.utilidades.convertir_coordenada_de_pilas_a_phaser(this.x, this.y);

Body.setPosition(figura, {
  x: x + distancia_x,
  y: y - figura.distancia_y
});

Las variables x e y tienen almacenada la coordenada del actor
pero convertidas al formato que quiere matter, así que cuando se
llame a setPosition especificando una coordenada como x + distancia_x
esa variable distancia_x va a ser una especie de desplazamiento
hacia la derecha. Claro, si distancia_x tiene un valor como 50 van
a ser 50 píxeles a la derecha respecto de la posición del actor, pero
si vale -50 van a ser 50 píxeles hacia la izquierda del actor.

Con la coordenada y pasaría algo similar, solo que aquí tienes que
tener en cuenta que para matter el eje y es al revés, si le sumás
valores va a “desplazar” el sensor hacia abajo, y si le restas valores
a desplazarse hacia arriba. Al revés de como es en pilas digamos.

Creo que si la nave solo se va a mover en rotaciones específicas, como
0 y 90, tal vez los más sencillo sea que llames directo a la función
setPosition con los valores directos. Algo así:

Otra opción, si la nave llegara a moverse libremente rotando en cualquier
sentido, es que llames a setPosition junto a algunas funciones
trigonométricas para calcular la posición ideal para el sensor.

let angulo = this.pilas.utilidades.convertir_angulo_a_radianes(this.rotacion);

Body.setPosition(figura, {
  x: x + 50 * Math.cos(angulo),
  y: y - 50 * Math.sin(angulo)
});

Esta segunda opción es un poco más compleja, pero tiene como ventaja
que el sensor siempre va a cambiar de posición junto con la rotación
de la nave:

rotacion

Igualmente, como te mencionaba la otra vez, estas funciones internas
de matter son complicadas por todos esos pequeños detalles de coordenadas
y tipos de ángulos. Me gustaría hacer que en una próxima versión de pilas
se puedan mover los sensores sin tener que usar estas funciones
internas de matter. Veré si logro hacerlo en unos días.

Avisame cualquier cosa!!!

1 Like

Muchísimas gracias @hugoruscitti, subí un videito a mi canal para mostrar el resultado:

Supongo que con un poco más de trabajo se podría hacer un simple y pequeño buscador de caminos (pathfinding en inlés).
Se me ocurre que se podrían usar múltiples sensores a modo de “nodos”: Le pides a un sensor que vaya derecho hasta que choque con algo, entonces usas otro sensor para que vaya hacia alguna dirección derecho hasta chocar con algo y así sucesivamente. De esta forma tendrías un nodo por sensor, el peso de los mismos vendría determinado por la distancia al anterior nodo y al comparar estas distancias obtendrías el camino “mas corto”.
A mi con lo que hice ya me bastaría, así que de momento no pienso meterme en esos líos. Pero ahí la dejo por si alguna vez alguien intenta hacer algo por el estilo :joy:

¡Espectacular @lukeitor!, si, estaría buenísimo incorporar esos algoritmos para recorrer caminos, pero como decís vos: a veces se puede hacer de formas más simples y queda perfecto de todas formas.

¡Gracias por compartir el resultado en un videito!, va quedando muy bien!!! saludos.

1 Like