Ayuda para hacer que un actor se agache

Quiero hacer que mi actor pueda esquivar enemigos al agacharse, el problema es que si uso sensores , la condición de “colisiones.length > 1” (el >1 dado que ya colisiona con el suelo) no me es suficiente, dado que puede estar colisionando con algo que no sea enemigo (dos suelos, o el suelo y algún item). Y si utilizo, el metodo cuando_comienza_una_colision(), me utiliza la forma física del actor (la cual es la del actor parado).

foro

Hola @Jorge, estuve haciendo pruebas y se me ocurrió una forma de implementar lo que nos comentas:

Primero hice al actor con una figura física dinámica (el rectángulo verde) y luego dos sensores, uno para cuando el actor está parado y otro cuando el actor está agachado:

C7E04A59-7EE9-4638-B7C3-5B56CC8BAE92

Eso sí, me aseguré que los sensores sean un poco mas anchos que la figura del actor, ahora te comento por qué.

Luego, hice que aparezcan unos disparos cada un segundo, para probar las colisiones y edité el código del protagonista para que se pueda agachar con el teclado:

E5A52F22-90CD-4B70-B5FE-D6DD92258BFC

ahora lo interesante está en la función de colisión del protagonista, porque agregué una condición para distinguir dos casos diferentes:

1 - En el primer caso, si el personaje está parado, se va a producir este tipo de colisión:

B3EC19D7-F092-46F9-BB15-373EAE2324D9

El disparo va a colisionar con la figura, pero al mismo tiempo va a colisión con el sensor del personaje parado. Esta es la razón por la que hice que el sensor sea un poco más ancho que la figura de colisión, me interesa detectar las dos colisiones juntas.

En código de este caso es más o menos así (lo simplifiqué un poco):


if (parado) {
  if (this.sensor_parado.colisiona_con_etiqueta("laser")) {
    laser.eliminar();
  }
}

Es decir, no solo veo que exista una colisión, sino que también la colisión sea con el sensor del actor parado y que el actor que colisiona tenga la etiqueta “laser”.

2 - El otro caso, es cuando el actor está agachado:

FA72EFA5-5DE9-4243-A491-3C61743D11C0

Ahí en lugar de consultar por la colisión con el sensor parado utilicé una consulta al sensor del personaje agachado. Muy similar a lo anterior, pero cambiando el sensor:

if (agachado) {
  if (this.sensor_agachado.colisiona_con_etiqueta("laser")) {
    laser.eliminar();
  }
} 

El resultado quedó así:

original

Te paso el código completo:

ah por cierto, usé estos gráficos por si te sirven a vos o a quien lea esta respuesta Animated Pixel Adventurer by rvros

Avisame si te sirve esta estrategia, sino buscamos otra forma!

Buenisimo , ya lo pude implementar en mi juego. Gracias ! No sabia que los sensores tenían ese método, :sweat_smile: , solo conozco los que salen en el manual.

Que interesante es esto @hugoruscitti,añadelo a la documentacion,que si no se pierde esta informacion entre tantos mensajes del foro.