Autor Tema: Difícil: Trayectoria cada vez menos curvada en Pong.

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

18 Septiembre, 2025, 04:58 am
Leído 4316 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Situación, por ahora olviden lo de la curva:


El meteoro se dirige a la nave naranja.

Cuando la toca, su velocidad en el eje de las Y cambia al azar, pero comienza a ir hacia arriba.

Su velocidad en el eje de las X se ajustará para que se dirija a la mira, el circulo rojo.

Eso ya está, es así:
Código: [Seleccionar]
// Determinar velocidad Y al azar:
MeteorYSpeed = -Math.random()*(2+Dificultad)-1;
// Distancia Y desde el meteoro hasta el punto hacia donde se lo apuntó:
DistanciaY = Meteor._y-ApuntandoY;
// Cuánto tardará el meteoro en recorrerla:
TardanzaY = Math.ceil(DistanciaY/-MeteorYSpeed);
// Distancia X desde el meteoro hasta el punto hacia donde se lo apuntó:
DistanciaX = ApuntandoX+400-Meteor._x;
// Determinar la velocidad X para que el meteoro llegue...
// al punto X apuntado justo cuando llega al punto Y apuntado:
MeteorXSpeed = DistanciaX/TardanzaY;

Quiero agregar que el meteoro pueda rotar como pelota y que como ella su trayectoria se curve, pero cada vez va rotando menos, ergo cada vez se curva menos. Entiendo que en el espacio no hay efecto así creo, es fantasioso.

Cuando el meteoro va rotando hacia la izquierda, su velocidad X disminuirá (porque el eje de las X disminuye a la izquierda), o sea puede volverse negativa o serlo más si ya era.
La rotación no afecta la velocidad Y. Quizá en la realidad girarse sí afectaría, acá no, curvarse no es que cambie de dirección, es que aumenta la velocidad hacia un costado.

El código ahora tendría esto al inicio:
MeteorRotation = Math.random()*(180+Dificultad)*(2*random(2)-1);

Ahora que me doy cuenta, quizá sumar a 180 no tiene sentido, pero eso es otro tema que veré luego, la cosa es que eso resulta un número negativo, 0 o positivo.

Esto pasa cuando el meteoro se mueve, o sea, en cada "tic":
Código: [Seleccionar]
MeteorXSpeed = MeteorXSpeed+MeteorRotation/1000*MeteorYDirection;
MeteorRotation = MeteorRotation/1.01;
Meteor._x = Meteor._x+MeteorXSpeed;
MeteorYDirection es 1 creo, su función no tiene mucho que ver aquí, es para que se rote para un lado u otro según si está moviéndose hacia abajo o hacia arriba.

Entonces, considerando que su trayectoria cambiará, necesito que se ajusten los cálculos de MeteorXSpeed:
DistanciaX/TardanzaY
Si el meteoro se rotará a la izquierda, habrá que restarle, si la mira está a la izquierda del meteoro.

En fin, es difícil. La pérdida de rotación la pueden ignorar en principio, a altas velocidades no se aplicará mucho porque funciona por "tic" no por distancia recorrida.

18 Septiembre, 2025, 08:08 am
Respuesta #1

martiniano

  • Moderador Global
  • Mensajes: 2,327
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Hola.

Si quieres que la velocidad cambie uniformemente lo suyo es que asignes una aceleración al principio del movimiento, proporcional a la rotación por ejemplo, y luego apliques las ecuaciones del MRUA para sacar lo que quieras.

Saludos.

22 Septiembre, 2025, 01:47 pm
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Puse esto:
DistanciaX = ApuntandoX+400-Meteor._x+MeteorRotation/1000*TardanzaY;
pero no sirve.

Ni esto:
DistanciaX = ApuntandoX+400-Meteor._x-MeteorRotation/1000*TardanzaY;

El razonamiento es que como se moverá a un costado debido a su rotación o comba, la distancia que debe recorrer quitando ese movimiento será mayor o menor, no sé, probé ambas cosas, sumar y restar, quizá depende de algo.
/1000 es porque el efecto de la rotación usa el valor MeteorRotation/1000.
*TardanzaY es porque el movimiento se aplicará esa cantidad de veces, aunque como dije el efecto irá disminuyendo al punto que llegado un momento no se aplica, perdió la rotación.

Probablemente no se entiende lo que digo, pero no sé mucho más qué hacer.

Pruebas de casos sencillos supongo. Hasta otra.

29 Septiembre, 2025, 06:18 am
Respuesta #3

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Esto es tosco pero sirvió.


T es target, objetivo.
B es bola.
< y > es cuando la bola tiene rotación hacia ese lado.

Lo que hice fue probar casos cada vez más complejos.

Arriba marco lo que serían puntos en el eje de las X. 1, 2, 3...

Luego en cada caso hice los cálculos.

Si se quiere que la bola vaya a la izquierda y por la rotación se moverá 1 vez hacia allí, debo hacer que la velocidad a calcular resulte un poco más a la derecha, ergo debo sumarle la cantidad de movimiento a la izquierda.

Si la rotación hace que se mueva a la derecha, es al revés, hay que restarle eso.

Finalmente, si en vez de moverse 1 vez se mueve X veces (2 en el ejemplo), a eso que sumo o resto lo debo multiplicar por X.

/2 al final es porque como la cantidad de rotación y el movimiento que eso causa se irá reduciendo, hago que sólo se aplique la mitad, pero claro que no es un cálculo exacto.

Entonces por ahora tengo:
MeteorXSpeed = DistanciaX/TardanzaY-MeteorRotation/1000*TardanzaY/2;

Tengo que probarlo mejor, pero no vi que estuviera tan mal.

Si en (TardanzaY) veces a la rotación se le hace /1.01 entonces ¿qué debo poner en vez de /2?

Tendré que pensar casos de esos también.

05 Octubre, 2025, 05:05 pm
Respuesta #4

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Tenía mal un paso previo.

Lo que debo restar es la cantidad de movimiento que habrá debido a la curva.

Supuestamente es:
Curva*Ejecuciones*(Ejecuciones+1)/2
donde ejecuciones es la cantidad de veces que el código se ejecuta, lo que antes llamé TardanzaY.

Lo que complica es que:
A rotación se le hace /1.01 luego de cada ejecución.
Curva es rotación/1000

Luego de bastante charla con GPT me dijo:
C * (1 − 1/1.01^E) / (1 − 1/1.01)
pero no me funciona bien.

¿Alguien sabe cómo es la fórmula y me puede decir?

Supongamos que:
Rotacion = 100
y no hay reducción

1era ejecución: La curva hará que la bola se mueva 0.1 pixeles a la derecha.
2nda: Se mueve 0.1 extra, por lo que se mueve 0.2, contando todas las ejecuciones se movió 0.3
3era: Se mueve 0.1 extra, por lo que se mueve 0.3, contando todas se movió 0.6
Fórmula para calcular ese total de movimiento: Curva*Ejecuciones*(Ejecuciones+1)/2

Ahora supongamos que hay reducción de /10, en vez de /1.01, para simplificar.
1: se mueve 0.1, rotación baja a 10, curva baja a 0.01
2: se mueve 0.11, total: 0.21, rotación: 1, curva: 0.001
3: se mueve 0.111, total: 0.321, rotación: 0.1, curva: 0.0001
capaz que me confundí en algo, pero ¿cual es la fórmula para calcular el total? Claro que en vez de /10 lo necesito como /1.01.