Hola. Estado intentando sin éxito mover los parámetros del ejemplo en Pilas de “Gravedad” para llegar a un efecto tipo Billar o también conocido como Pool; es decir, que las pelotas se comporten con fricción pero sobre una mesa o superficie plana simulando una vista desde arriba.
Y bueno, de ser posible algo así, ojalá me puedan ayudar con el efecto de lanzamiento donde a mayor fuerza mayor es el movimiento y el golpe. Saludos.
Hola @GDPH!!!, efectivamente vas bien encaminado, poniendo la gravedad del escenario en (0, 0) se puede lograr el efecto de billard o pool como imaginabas.
El único tema un poco complicado es lograr que la bola principal se pueda lanzar en una dirección determinada. Ahí vas a tener que usar funciones trigonométricas como “sin” y “cos” (seno y coseno) para saber imprimirle un impulso a la pelota en la dirección que quieras.
Por ejemplo, si quieres que la dirección del golpe se defina usando el mouse, una opción es pedirle a pilas que cada vez que el jugador haga click en la pantalla la bola blanca se mueva en esa dirección:
Ahora bien, para calcular el ángulo entre el mouse y la bola blanca podrías usar una función como esta:
let angulo = this.pilas.obtener_angulo_entre_puntos(bola.x, bola.y, mouse_x, mouse_y);
que va a almacenar en la variable angulo
un valor en grados como 45
.
Luego, para impulsar la bola a pilas hay que indicarle el desplazamiento x
y y
del movimiento, así que deberías descomponer ese ángulo en dos partes, la magnitud horizontal y vertical. Para eso se pueden usar las funciones Math.sin
y Math.cos
con este código:
angulo = this.pilas.utilidades.convertir_angulo_a_radianes(angulo);
let fuerza = 10;
let dx = Math.cos(angulo) * fuerza;
let dy = Math.sin(angulo) * fuerza;
this.impulsar(dx, dy);
Si quieres conocer más sobre estas funciones te recomiendo mirar este artículo:
http://losersjuegos.com.ar/referencia/articulos/seno_coseno
Ah, y te paso cómo me quedó esta primer prueba, probá haciendo click para lanzar la bola blanca:
https://app.pilas-engine.com.ar/#/proyecto/a5decac9-f07f-464d-864f-f12d0e78335c
Puse algunos comentarios en el código mencionando cómo cambiar la velocidad del lanzamiento y otros ajustes.
Avisanos cualquier cosa, ¡Abrazo!
Hola. Muchas gracias por la respuesta, justo eso buscaba. En cuanto al ejemplo me surgió la duda de qué propiedad tiene las paredes y entre ellas para que reboten al colisionar. No encontré nada en su código o configuración.
¡¡Buenísimo @GDPH!!, con respecto a las colisiones, creo que la propiedad que estás buscando se llama rebote
.
La propiedad rebote
determina cómo van a impulsarse dos actores entre sí cuando se produzca una colisión.
Por ejemplo, si la propiedad rebote
de la bola blanca es 1
y la propiedad rebote
de una de las paredes es 1
el golpe será elástico, es decir, que se conservará la velocidad luego de la colisión.
Si el valor de rebote de los dos objetos es menor a 1
, (por ejemplo la bola blanca tiene rebote=0.1
y la pared rebote=0.1
) el choque “absorberá” la energía del movimiento y parecerá que se frena casi por completo.
Y por último, si el valor rebote
es mayor a 1
, los dos objetos se impulsarán con más fuerza luego de colisionar. Esto es super útil si quieres que la pared funcione como un resorte, que al tocarlo impulsa con mucha fuerza en dirección opuesta. Este tipo de rebotes se ve mucho en los juegos de pinball por ejemplo.
Avisame cualquier cosa si esa es la propiedad que estabas buscando.
¡Abrazo!