Autor Tema: Efectos de colisión.

0 Usuarios y 1 Visitante están viendo este tema.

25 Abril, 2025, 05:52 pm
Leído 610 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Mejoré un poco esto:

Quisiera que el daño a Mario dependa de la velocidad conque chocan, y que sea empujado según eso y... ¿su masa?

Estoy algo trancado en eso, tengo esto:
Código: [Seleccionar]
Distancia = IA._x-Player._x;
if (Distancia > 0) {
// DK está a la derecha de Mario:
IA._x = IA._x-DKSpeed;
if (IA.hitTest(Player)) {
if (Player.Action2 == "Walking") {
EmpujeaDKMario = DKMarioSpeed*Player.Facing + DKSpeed - DKMarioEdge - DKEdge;
if (EmpujeaDKMario < 0) {

Se calcula la distancia entre Donkey Kong (DK) y Mario.
Les llamo IA y Player cuando me refiero a la posición o variables que pueden representar algo de otro personaje, estas son del que es manejado por la IA y por el jugador.
Mario es llamado DKMario para distinguirlo de otros posibles Marios.

Eso determina hacia dónde se mueve DK, izquierda o derecha, avanza hacia Mario.

Si están colisionando, y Mario está caminando, entonces el empuje que recibe puede aumentar o disminuir según si está caminando hacia DK o alejándose. Eso lo marca la variable Player.Facing (que indica hacia dónde está mirando).
DKMarioSpeed no es la velocidad conque se está moviendo sino con la que se mueve cuando se mueve. Lo que determina si se está moviendo es Player.Action2. Así que siempre es positiva.
DKSpeed lo mismo pero respecto a DK.
Edge viene a ser cuán puntiagudos son los personajes o si tienen espinas o algo, que al clavarse reducen el empuje.
Debo agregar que el peso de Mario reste y el de DK sume ¿así?
EmpujeaDKMario = (DKMarioSpeed*Player.Facing + DKSpeed) * (DKPeso - DKEdge - DKMarioPeso - DKMarioEdge);

¿Es muy importante el peso? Pensaba usar defensa, pero si un personaje es pequeño, aunque tenga mejor defensa que el otro, rebotaría ¿o lo abollaría o algo así? No había pensado en eso.
El tema es que si pongo peso es otro número a tener que elegir para cada personajes y prefiero evitarlo.

Bueno, si el empuje es >0, el personaje debería cambiar de posición, sino no, porque si se aplica un empuje negativo lo haría acercarse ¿no?

Me destranqué un poco creo. Entonces:
Código: [Seleccionar]
Distancia = IA._x-Player._x;
if (Distancia > 0) {
// DK está a la derecha de Mario:
IA._x = IA._x-DKSpeed;
if (IA.hitTest(Player)) {
if (Player.Action2 == "Walking") {
EmpujeaDKMario = (DKMarioSpeed*Player.Facing + DKSpeed) * (DKPeso - DKEdge - DKMarioPeso - DKMarioEdge);
} else {
EmpujeaDKMario = DKSpeed * (DKPeso - DKEdge - DKMarioPeso - DKMarioEdge);
}
if (EmpujeaDKMario > 0) {
// Mover a Mario.
}
Damage =

Agregué que si Mario no se está moviendo entonces su velocidad no se considera en el cálculo. ¿Está bien?

El daño no estoy seguro que sea algo independiente al empuje recibido, diría que es:
Damage = (DKMarioSpeed*Player.Facing + DKSpeed) * (DKEdge + DKDF - DKMarioDF);
Parece que sí ¿está bien? Pero habría que ponerlo en el if correspondiente y quitar la velocidad de Mario si no se mueve.
Entre más rápido se estén moviendo hacia el otro, más daño.
Entre más puntiagudo o espinas, etc, tenga DK, más daño.
Entre más duro sea DK, más daño.
Entre más duro o elástico sea Mario, menos daño.
¿Está bien?

26 Abril, 2025, 05:27 am
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
No entiendo muy bien que eso de las espinas o las puntas

Pero fisicamente en toda colisión donde no se pierde energía (elástica) ocurren 2 cosas

sea $$m$$ la masa de mario 
$$M$$ la masa del mono
$$v$$ la velocidad de Mario
$$V$$ la velocidad del mono

Las velocidades serán positivas cuando los personajes viajan de izquierda a derecha
el subíndice i o inicial son valores previos al choque
el subíndice f o final son valores posteriores al choque

1)se conserva el momento lineal

$$m\cdot v_i+M\cdot V_i=m\cdot v_f+M\cdot V_f$$ EC1

2) se conserva la energía cinética

$$\frac 12m\cdot v_i^2+\frac 12M\cdot V_i^2=\frac 12m\cdot v_f^2+\frac 12M\cdot V_f^2$$ EC2

Este es un sistema de 2 ecuaciones no lineales con dos incógnitas $$v_f$$ y $$V_f$$ resoluble , es decir siempre tiene solución (¿quieres el algoritmo para que te de está solución?)

Puedes despejarlas  y calcular esos valores en función de las condiciones iniciales , puedes llamar a dos funciones  donde le pasas los 4 parámetros y te calcula cada una de esas dos velocidades, luego está en tí si eso que obtienes es lo que realísticamente quieres mostrar en el juego.
Saludos  \(\mathbb {R}^3\)