Autor Tema: (Solucionado) Ayuda con cálculos para pong.

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

25 Julio, 2025, 01:47 am
Leído 8892 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Adjunté un rar que tiene el juego, un exe.

Como alternativa dejo una imagen:


Con las flechas izquierda y derecha el jugador mueve la nave naranja, sería su paleta.

Cuando el meteoro (sería la pelota) se está acercando, si se presiona A comienza a apuntarse a la izquierda y si se presiona S a la derecha.

Entonces, si la nave toca al meteoro, rebotará hacia la dirección a la que se haya apuntado, en menor o mayor medida según qué tan antes se presionó la tecla.

La velocidad conque rebota hacia la nave rival, azul, se determinará (se me acaba de ocurrir) según cuánto estuvo quieta la nave del jugador desde que el meteoro comenzó a acercarse.

Con todo eso y como lo tengo hecho, no se puede controlar mucho a dónde se envía el meteoro, porque el rebote hacia el costado no está basado en el rebote hacia la nave azul ni la posición del meteoro, por ahora ese rebote está al azar, pero son 2 velocidades independientes. Entonces, si se presiona A enseguida, el meteoro irá a la izquierda, pero rebotará más abajo de la pared o más arriba según cuánto resulte, por azar, la velocidad hacia la nave azul.

Además puede ir demasiado a un costado, eso supongo que lo puedo arreglar poniendo un límite.

La velocidad hacia la nave azul se determina, no importa cómo. Teniendo en cuenta esa velocidad y la posición del meteoro, necesito una ecuación para que la velocidad hacia el costado del meteoro sea tal que pase por el punto marcado por qué tan rápido el jugador presionó A o S.

La pantalla tiene 800 pixeles de largo.
Supongamos que si el jugador apretó A 1 milisegundo antes de que el meteoro la toque, entonces el meteoro debe pasar por el X 399 cuando llegue a la nave azul, o sea ir un poquitito a la izquierda (400-1, 400 es el pixel central).
Se determina la velocidad conque avanzará hacia la nave, no importa cómo. Supongamos que es 2 pixeles por segundo.
Supongamos que en el momento del impacto el meteoro estaba en el pixel 400, pero abajo.
Entiendo que se puede calcular cuánto tardará el meteoro en llegar a la nave azul (algo como 550/2 segundos, 550 es más o menos la distancia entre las naves, pero claro consideraré la distancia entre el meteoro y la nave azul), y luego puedo hacer distancia X a recorrer / ese tiempo, o sea 1/275, ergo el meteoro se moverá 0.001 no sé cuánto píxeles por segundo, muy poquito.

El problema es que si el botón es presionado muy rápido, quiero que el meteoro se dirija al punto 0 u 800, pero no de arriba, sino del medio, o sea, la distanciaY sería menor.

Bueno, es eso, ahora que escribí el problema ya no me parece tan difícil, pero si me lo pueden solucionar mejor xD

Código: [Seleccionar]
if (Meteor.hitTest(Player) && MeteorYSpeed>0) {
MeteorYSpeed = -Math.random()*(2+Dificultad)-1;
MeteorXSpeed = Math.random()*(3+Apuntando);
Significa:
Cuando el meteoro toca a la nave del jugador, y si el meteoro se estaba moviendo hacia ella (eso para que no rebote muchas veces), entonces:
El meteoro rebota hacia la nave azul. No viene mucho al caso la ecuación, el resultado es un número.
Y acá viene lo que debe modificarse, cuánto rebota hacia un costado.

A diferencia de mi proyecto de videojuego de tenis, acá no hay fuerza a repartir, así que no debería ser tan difícil. Además esto es 2d.

26 Julio, 2025, 07:30 pm
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,041
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Si mal no recuerdo este juego tiene dos cuestiones para dar dirección  una es la posición del impacto del meteoro respecto del centro de la nave, si impacta en el centro sale vertical, si lo hace cerca de un extremo lo hace con un cierto ángulo, mas al extremo mas ángulo, y la otra es con la velocidad, si vas a derecha aumenta el ángulo hacia la derecha respecto de la vertical, y si vas a la izquierda aumenta el ángulo hacia el otro lado, lo bueno es que puedes componer(sumar los dos efectos)  si pega a la derecha del centro mientras te mueve a derecha aumenta el ángulo, si pega a la izquierda del centro y vas a a derecha los ángulos se restan y sale cerca de la vertical.
Para que no haya un exceso de 90 grados puedes limitar cada contribución a 45° o menos y la suma de ángulos sólo llegará a 90 o menos  para ambos lados.
Saludos  \(\mathbb {R}^3\)

27 Julio, 2025, 03:46 am
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Si mal no recuerdo este juego tiene dos cuestiones para dar dirección  una es la posición del impacto del meteoro respecto del centro de la nave, si impacta en el centro sale vertical, si lo hace cerca de un extremo lo hace con un cierto ángulo, mas al extremo mas ángulo
No lo quiero hacer así porque en ese caso los jugadores sabrían a dónde rebotará. Difícil que vaya a ser para 2 personas, pero en esto lo preparé pensando en eso.

27 Julio, 2025, 11:32 am
Respuesta #3

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,041
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
¿Pero la idea no es entonces  controlar el meteoro para que el rival sea una persona  o el cpu no lo alcance y llegue a devolver ?
Saludos  \(\mathbb {R}^3\)

29 Julio, 2025, 12:05 am
Respuesta #4

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Si pero usando la tecla A o S, no haciendo que rebote más en el extremo.

En unos días pongo avances que haga.

29 Julio, 2025, 12:49 am
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,041
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Si pero usando la tecla A o S, no haciendo que rebote más en el extremo.

En unos días pongo avances que haga.
Entonces lo que quieres es controlar el ángulo de salida en función de si tiene apretada o no la tecla A , o si tienes apretada o no la tecla S , o  si las aprietas juntas,  solo necesitas 3 ángulos $$-x,0,x$$ , y $$x$$ será el ángulo que mas te plazca.
Lo divertido era aprender a controlar el ángulo de salida en función de cómo te estés moviendo (con A o S), como en el Arkanoid en el que puedes definir 3 sectores izquierda ,centro y derecha para  aumentar o disminuir el ángulo de salida.   
Saludos  \(\mathbb {R}^3\)

08 Agosto, 2025, 03:01 am
Respuesta #6

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
He estado enfermo, bastante bien ahora, pero el juego no sé qué tiene, el meteoro no rebota como le digo, como si los cálculos estuvieran mal.

Cuando el meteoro toca la nave del jugador
Código: [Seleccionar]
if (Meteor.hitTest(Player) && MeteorYSpeed>0) {
// Determinar velocidad Y al azar:
MeteorYSpeed = -Math.random()*(2+Dificultad)-1;
// Para que no se apunte hacia afuera:
if (Apuntando < -400) {
Apuntando = -400;
} else if (Apuntando > 400) {
Apuntando = 400;
}
// Distancia Y desde el meteoro hasta el punto hacia donde se lo apuntó:
DistanciaY = Meteor._y-20.5;
// 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 = Meteor._x-400+Apuntando;
// Determinar la velocidad X para que el meteoro llegue...
// al punto X apuntado justo cuando llega al punto Y apuntado:
MeteorXSpeed = DistanciaX/TardanzaY;

Siempre apunté a a izquierda, estos fueron algunos resultados:

MeteorYSpeed: -2.81821984137326
Apuntando: -400
DistanciaY: 523.65
TardanzaY: 186
DistanciaX: -340.55
MeteorXSpeed: -1.83091397849462

MeteorYSpeed: -1.67079952856097
Apuntando: -400
DistanciaY: 520.05
TardanzaY: 312
DistanciaX: -606.25
MeteorXSpeed: -1.94310897435897

MeteorYSpeed: -1.327361135896
Apuntando: -400
DistanciaY: 526
TardanzaY: 397
DistanciaX: -392.3
MeteorXSpeed: -0.98816120906801

MeteorYSpeed: -1.19651435417892
Apuntando: -304
DistanciaY: 570.05
TardanzaY: 477
DistanciaX: -636.3
MeteorXSpeed: -1.33396226415094

MeteorYSpeed: -1.34594044291691
Apuntando: -400
DistanciaY: 523.3
TardanzaY: 389
DistanciaX: -725.55
MeteorXSpeed: -1.86516709511568

MeteorYSpeed: -1.5947381144365
Apuntando: -400
DistanciaY: 522.7
TardanzaY: 328
DistanciaX: -279.35
MeteorXSpeed: -0.851676829268293

MeteorYSpeed: -1.66377713236202
Apuntando: -400
DistanciaY: 515.5
TardanzaY: 310
DistanciaX: -517.35
MeteorXSpeed: -1.66887096774194

MeteorYSpeed: -1.26158092462531
Apuntando: -400
DistanciaY: 516.95
TardanzaY: 410
DistanciaX: -457.6
MeteorXSpeed: -1.11609756097561

MeteorYSpeed: -1.52497074218698
Apuntando: -400
DistanciaY: 518.45
TardanzaY: 340
DistanciaX: -42.65
MeteorXSpeed: -0.125441176470588

MeteorYSpeed: -1
Apuntando: -361
DistanciaY: 529.85
TardanzaY: 530
DistanciaX: -361.15
MeteorXSpeed: -0.681415094339623

MeteorYSpeed: -1
Apuntando: -400
DistanciaY: 520.85
TardanzaY: 521
DistanciaX: -321.1
MeteorXSpeed: -0.616314779270633

MeteorYSpeed: -1
Apuntando: -400
DistanciaY: 523.05
TardanzaY: 524
DistanciaX: -166.25
MeteorXSpeed: -0.317270992366412

MeteorYSpeed: -1
Apuntando: -400
DistanciaY: 522.35
TardanzaY: 523
DistanciaX: -153.8
MeteorXSpeed: -0.294072657743786

Supongo que deberé grabar un video para que vean mejor, agregando una mira que muestre hacia dónde se está apuntando, pero ¿alguna idea de qué está mal? A veces el meteoro va muy al medio, otras ha chocado con la pared, es cualquier cosa... Y no es porque haga curvas, las he quitado de momento.

09 Agosto, 2025, 02:52 pm
Respuesta #7

martiniano

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

Para hacer pruebas quizás sea mejor que fijes la velocidad en sentido del eje Y como una constante.

No acabo de entender lo que quieres hacer. Considera un sistema de referencia en que el \[ (0,0) \] es la esquina superior izquierda, el primer número los píxeles que hay hacia la derecha y el segundo hacia abajo. Supón que la pantalla es de 800x600. Si la bola rebota en la barra del jugador, ¿en qué condiciones tiene que pasar por \[ (400,0) \] y en qué condiciones por \[ (400,300) \]?

14 Agosto, 2025, 11:59 am
Respuesta #8

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Acá está con mira:

Cuando el meteoro se está acercando a la nave de abajo, si presiono A o S aparece una mira, que se va moviendo a la izquierda si apreté A y a la derecha si apreté S.
Cuando el meteoro toque la nave de abajo, debe ir hacia donde haya quedado la mira.

Pueden ver que a veces funciona, y a veces no, no sé por qué...

La pantalla es de 800 pixeles de ancho y 600 de largo. Las coordenadas avanzan a la derecha y abajo, así que arriba a la izquierda es 0, 0
y abajo a la derecha es 800, 600
El 1er número corresponde a X, el 2ndo a Y.

Creo que el error está acá:
Código: [Seleccionar]
if (Meteor.hitTest(Player) && MeteorYSpeed>0) {
// 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-20.5;
// 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 = Meteor._x-400+Apuntando;
// Determinar la velocidad X para que el meteoro llegue...
// al punto X apuntado justo cuando llega al punto Y apuntado:
MeteorXSpeed = DistanciaX/TardanzaY;

14 Agosto, 2025, 04:17 pm
Respuesta #9

martiniano

  • Moderador Global
  • Mensajes: 2,327
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Se me hace raro que calcules distanciaY dentro de este condicional. ¿Cuándo se ejecuta esto? ¿Cuando la bola toca al jugador de abajo? Si es así, ¿distanciaY no será siempre la misma?

Saludos.