Autor Tema: [Solucionado] Mejorar movimiento zigzag.

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

19 Junio, 2026, 02:20 pm
Leído 370 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Se crean enemigos con datos como:
Código: [Seleccionar]
Name._x = Math.random()*320;
// Para que haga zigzag:
Name.MinX = Name._x-Math.random()*EnemigosRate;
Name.MaxX = Name._x+Math.random()*EnemigosRate;
Name.SpeedX = Math.random()*MinEnemigoSpeed*(random(2)*2-1);

Luego cuando se mueven hacia abajo se hace:
Código: [Seleccionar]
// Efecto zigzag:
if (Name._x<Name.MinX) {
Name._x = Name.MinX;
Name.SpeedX = Name.SpeedX*-1;
} else if (Name._x>Name.MaxX) {
Name._x = Name.MaxX;
Name.SpeedX = Name.SpeedX*-1;
}

El problema creo es que el último movimiento hacia un lado, antes de empezar a ir al otro, puede ser más corto.

Se me ocurre que MinX y MaxX se definan en base a la posición X inicial y SpeedX, algo como
Código: [Seleccionar]
Name._x = Math.random()*320;
Name.SpeedX = Math.random()*MinEnemigoSpeed*(random(2)*2-1);
// Para que haga zigzag:
Name.MinX = Name._x-Name.SpeedX*random(EnemigosRate);
Name.MaxX = Name._x+Name.SpeedX*random(EnemigosRate);

Pero debido a que la máquina no opera bien cuando hay decimales, no creo que sirva.

Lo de especificar las posiciones en los ifs, es decir cancelar parte del movimiento cuando se pasó de la posición mínima o máxima, me lo dijo una IA. Y sirvió me parece. No le veo mucho sentido, pero supongamos:
El enemigo se va demasiado a la izquierda.
Entonces se moverá a la derecha.
Pero debido a que se suman mal los decimales, incluso luego de moverse sigue demasiado en la izquierda. Así que otra vez la velocidad cambiará.
Para evitar eso, se lo ubica en la posición justa, pero puede causar un movimiento más corto.

Ah, tengo una idea, en vez de ponerle *-1, especificar el valor según el caso.
// Efecto zigzag:
Código: [Seleccionar]
if (Name._x<Name.MinX) {
Name.SpeedX = Math.abs(Name.SpeedX);
} else if (Name._x>Name.MaxX) {
Name.SpeedX = Math.abs(Name.SpeedX)*-1;
}
No es muy eficiente porque puede que una definición se repita hasta 3 veces seguidas, pero por lo visto funciona. Y usar <= o >= no me gusta mucho. MinX y MaxX son valores aproximados, deberé decir.