Autor Tema: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condicio

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

18 Noviembre, 2022, 09:38 am
Leído 167 veces

Tachikomaia

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 228
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
1- Su velocidad de caída aumenta 0.01 por segundo (segundo es un decir, es más bien una centésima de segundo).

2- Sus velocidades hacia los costados (X), adelante (Y, arriba) y arriba (Z, distancia con respecto al suelo) deben ser acordes a la fuerza del jugador que realiza el tiro. La velocidad hacia abajo aumentará, pero me refiero a las velocidades iniciales. Si por ejemplo tiene fuerza 4 y aplicó 3 para que la pelota avance 3 pixeles (es un decir) por segundo entonces no puede ser que la pelota se eleve 2 pixeles por segundo, ya que la fuerza que queda disponible es sólo 1.

3- Cuando llega a la red la Z de la pelota debe ser igual o mayor a cierto valor, es decir, se debe preestablecer un valor que represente la mínima Z con la que la pelota pasa por encima de la red sin tocarla, y cuando llegue a la red debe tener ese valor o uno mayor. En mi caso es 17.5 pero elijan el que gusten.

4- Debe caer en la cancha rival.

5- Las velocidades deben ser tales que la pelota caiga en cierto punto. Por ejemplo:


6- Su velocidad hacia adelante (Y) debe ser la máxima posible.


Es decir, se intenta que se cumpla una condición en tanto eso no cause que no se cumplan las otras.
3- Se quiere que la pelota pase por encima de la red, pero sin que ello implique que haya caído más/menos de lo que debe (condición 1) ni que se le haya aplicado más fuerza de la que se estableció como posible (condición 2). Si el jugador no tiene suficiente fuerza como para que se cumpla esta condición, no se cumple.
4- La oración anterior.
5- Lo mismo. Si para cumplir las condiciones anteriores es necesario que el tiro no vaya tan diagonal como se quiere, entonces no irá tan así, irá más bien verticalmente.
6- En tanto se cumplan las condiciones anteriores... Si la fuerza es 10 la velocidad Y no debe ser mayor que eso. Si queriendo asignar determinada fuerza a Y luego sin importar cuánta se asigne a Z la pelota no pasa la red o no cae en la cancha rival, entonces habrá que reducir la velocidad Y...


Por si los necesitan o quieren, les dejo los datos del caso (pero pueden inventar otros, lo que sí debe tenerse en cuenta es que no necesito simplemente averiguar 3 numeritos basados en otros, sino un método para averiguarlos teniendo en cuenta que los otros pueden variar, por ejemplo se puede elegir hacer un saque hacia al medio o puede que el personaje tenga distinta fuerza):
NOTA: Ignoren lo de "_level0."
  Variable _level0.AlexFuerza = 10
  Variable _level0.BallX = 417
  Variable _level0.BallY = 548
  Variable _level0.BallZ = 43.8
  Variable _level0.DistanciahastaDestinoX = 136.9
  Variable _level0.DistanciahastaDestinoY = 368
  Variable _level0.DistanciahastaRed = 248
  Variable _level0.DistanciahastaMinsafeBallZ = 26.3


Gracias.

Ah: El incremento de Y está invertido, es decir, entre más abajo más valor.
0,0________600,0
0,800______600,800

18 Noviembre, 2022, 12:18 pm
Respuesta #1

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 52,433
  • País: es
  • Karma: +0/-0
Hola

 Si \( v \) es la velocidad inicial (que al final equivale a la fuerza con la que se golpea), \( c=cos(\alpha) \) el coseno del ángulo de lanzamiento, \( d_0 \) la distancia entre el punto inicial y final, \( r \) la distancia de la red al punto de partida, \( b \) la altura sobre el suelo a la que quieres que pase la bola sobre la red, \( a \) la altura a la que está la pelota en el momento inicial y \( g \) la gravedad (lo que tu llamas aumento de la velocidad de caída), se tiene que las ecuaciones que rigen el movimiento de la pelota son:

 \( d(t)=v\cdot t\cdot c \) (distancia al punto de inicio sobre el suelo recorrida por la pelota hasta el instante \( t \))
 \( h(t)=a+v\cdot t\cdot s-\dfrac{g\cdot t^2}{2} \) (altura en el instante t).

 donde \( s \) es el seno del ángulo de lanzamiento, \( s=\sqrt{1-c^2} \).

 Entonces si planteamos las ecuaciones:

\(  d(t_1)=r \)
\(  h(t_1)=b \)

\(  d(t_2)=d_0 \)
\(  h(t_2)=0 \)

 Despejando en cada pareja el tiempo y sustituyendo en la segunda obtenemos (sale una ecuación bicuadrada resoluble a mano; pero con tanto parámetro es un poco infierno así que la he resuelto con un programa de cálculo simbólico).

\( v=\dfrac{\sqrt{g} \sqrt{a^2 \left(d^2-\text{r}^2\right)^2+2 a b d^2 \left(\text{r}^2-d^2\right)+d^2 \left(b^2 d^2+\text{r}^2 (d-\text{r})^2\right)}} {\sqrt{2dr(d-\text{r}) (a (\text{r}-d)+b d)}} \)

\( c=\dfrac{dr(d-r)}{\sqrt{\left(a^2 \left(d^2-\text{r}^2\right)^2+2 a b d^2 \left(\text{r}^2-d^2\right)+d^2 \left(b^2 d^2+\text{r}^2 (d-\text{r})^2\right)\right)\left(a^2+d^2\right) }} \)

Aquí puedes verlo gráficamente:


Puedes modificar los puntos \( M,N \) y los valores de \( a,b,g \).

Ahora si quieres hacer lo mismo uniendo dos puntos del plano que tienen coordenadas \( (x_1,y_1) \) e \( (x_2,y_2) \), la distancia entre ambos es:

\( d_0=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2} \)

Tomarías un vector unitario en la dirección y sentido que los une:

\( u=(p,q)=\dfrac{(x_2,y_2)-(x_1,y_1)}{d} \)

Y entonces la trayectoria de la pelota es:

\( (x,y,z)=(x_1+p*d(t),y_1+q*d(t),h(t)) \)

Saludos.

23 Noviembre, 2022, 06:39 am
Respuesta #2

Tachikomaia

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 228
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
No sé cómo usar tu respuesta.

Quizá no me expliqué bien ¿cómo calculo cuántos "píxeles" por segundo debe moverse la pelota en eje X? ¿y en el Y? ¿y en el Z (inicialmente)?

Con ayuda hace tiempo obtuve esto:
Código: [Seleccionar]
Norma = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY+BallZ*BallZ);

BallXSpeed = DistanciahastaDestinoX/Norma*-AlexFuerzadetiros;

BallYSpeed = DistanciahastaDestinoY/Norma*-AlexFuerzadetiros;

BallZSpeed = BallZ/Norma*-AlexFuerzadetiros;
Te das cuenta de que no cumple todas las condiciones, pero parece un muy buen punto de partida.

¿Tú qué proceso me recomiendas que haga?

Otra cosa, por las dudas:
No sé si mi forma de "simular" la gravedad es igual a la real o a la que usas. Más allá del número que uso. Aquí puedes ver cómo funciona:
https://foro.rinconmatematico.com/index.php?topic=51754.msg205838#msg205838
¿La que usas funciona igual? ¿cómo funciona?

Disculpa que no te haya entendido bien.

23 Noviembre, 2022, 09:06 am
Respuesta #3

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 52,433
  • País: es
  • Karma: +0/-0
Hola

No sé cómo usar tu respuesta.

Quizá no me expliqué bien ¿cómo calculo cuántos "píxeles" por segundo debe moverse la pelota en eje X? ¿y en el Y? ¿y en el Z (inicialmente)?

Yo te he dado directamente las ecuaciones de \( x,y,z \) en función del tiempo.

Tu quieres discretizar el asunto. Eso podría hacer que variase ligeramente el resultado final del lanzamiento; pero no estaría de más probar.

Entonces varias cosas:

- En lugar de usar los incrementos, ¿por que no usas directamente la posición en función del tiempo?. Es decir en lugar de hacer:

\( x=x+v_x \)
\( y=y+v_y \)
\( z=z+v_z \)

 en cada instante, ¿porqué no haces algo del tipo \( x=x_0+v_x\cdot t \) y así con las demás.

 Eso sería aplicar al pie de la letra las fórmulas que te digo.

 No se en que lenguaje programas; pero cualquiera de esas fórmulas puede meterse directamente. En mis tiempos mozos, hace más de 27 años, yo programaba juegos. Había hecho uno de fútbol, donde con una fórmula parecida mi jugador virtual "clavaba" cualquier falta donde yo quería (y además con efecto).

 - Ahora. Si, quieres usar incrementos tendrías que hacer, con los datos que te di antes:

\(  v_x=v\cdot c\cdot \dfrac{x_1-x_0}{d_0} \)
\(  v_y=v\cdot c\cdot \dfrac{y_1-y_0}{d_0} \)
\(  v_z=v\cdot \sqrt{1-c^2} \)

 Los valores de \( v,c,d_0 \) se calculan como te indiqué en el mensaje anterior.

 ¡Sea como sea!¡Experimenta! Seguro que la primera vez que intentes meter estas fórmulas la bola hace lo que quiere. Pero luego vamos depurando.

 ¿En qué lenguaje programas?.

Saludos.

24 Noviembre, 2022, 01:59 am
Respuesta #4

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,472
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Oh Oh!!! me contestó... y ahora qué le digo...
Hola, mas allá de lo que Luis bien te indica, intentar hacer funcionar la física pixel a pixel no es el metodo correcto.


Lo que debes hacer es un modelo matemático que calcule  fielmente lo que la física nos dice debe suceder al lanzar una bola. Luego de  que tienes el dato real o modelizado, entonces lo traduces a pixeles y los representas graficamente.




Hay ciertas imprecisiones cuando explicas lo que quieres lograr, nosotros creo las hemos interpretado como se debe, pero me gustaría aclarartelas para que usemos de aquí en adelante si hicieran falta otras aclaraciones un léxico mas acorde.


1- Su velocidad de caída aumenta 0.01 por segundo (segundo es un decir, es más bien una centésima de segundo).


Acostumbrate a usar unidades, ¿0.01 que? metros/hora , kilometros/segundo? pixeles/segundo acaso?...

2- Sus velocidades hacia los costados (X), adelante (Y, arriba) y arriba (Z, distancia con respecto al suelo) deben ser acordes a la fuerza del jugador que realiza el tiro.


La velocidad sobre la bola resulta de la aplicación de una fuerza no constante  en el tiempo  y aplicada en un tiempo muy breve, no explicaré todo el tema pero lo que aplicas se llama "impulso" no fuerza. Puedes entiendo, mediante alguna acción de mouse o teclado administrar entonces ese implulso a placer dentro de una determinada escala de posibilidades que predefines.


La velocidad hacia abajo aumentará, pero me refiero a las velocidades iniciales. Si por ejemplo tiene fuerza 4 y aplicó 3 para que la pelota avance 3 pixeles (es un decir) por segundo entonces no puede ser que la pelota se eleve 2 pixeles por segundo, ya que la fuerza que queda disponible es sólo 1.


Aqui te haces matetes, te reitero un consejo modeliza el sistema como si la cancha fuese real en tamaño,(no a escala) la velocidad de la bola similar a la que los jugadores de tenís , y la gravedad exactamente \( 9.80665m/s^2 \). Una vez que hayas hecho los calculos de posición en función el tiempo de la cinemática de las perticulas y la aplicación de la dinámica Newtoniana, usas una función que transforme tus coordenadas  3d (x,y,z) del modelo a pixeles (X,Y) y no los confundas ya que \( x\neq X \).


3- Cuando llega a la red la Z de la pelota debe ser igual o mayor a cierto valor, es decir, se debe preestablecer un valor que represente la mínima Z con la que la pelota pasa por encima de la red sin tocarla, y cuando llegue a la red debe tener ese valor o uno mayor. En mi caso es 17.5 pero elijan el que gusten.

La atura de una red profesional en el medio debe ser de 0.91m, por cierto no todos los tiros en la practica pasaran a una única altura z  determinada,  puedes escojer que tipo de tiro hacerle al rival, con efecto, uno recto rapido, un globo, etc. No nos has explicado como escojes el tiro y  la dirección, solo que escojes el impulso.


 
4- Debe caer en la cancha rival.
Bueno , eso es una definición, si todos los jugadores pueden dar un golpe que deje la bola en cancha rival el partido nunca acaba,  a menos que no se alcance a llegar al posición de la bola en posición, tiempo y aplicar el tiro propio.
Reitero como escojes esos parámetros en tiempo e ejecución no nos los has comentado.

5- Las velocidades deben ser tales que la pelota caiga en cierto punto. Por ejemplo:






De nuevo una definición, no habrá bolas que peguen en la red? ni bolas largas,  ni anchas?, tenemos al jugador perfecto devolviendo bolas!!!, solo debe alcanzar la bola que el cpu le mande de vuelta y listo.  No se si le estoy dondo mas complejidad al juego de lo que pretendes.

6- Su velocidad hacia adelante (Y) debe ser la máxima posible.


Esto es a lo que me referia antes, existen infinitas conbinaciones de ángulo  y velocidad  que iran del punto A al B siguiendo una parabola, cada una con un tiempo distinto, pero si la velocidad es máxima, entonces la altura sobre la red es mínima siempre, la realidad no funciona así, la velocidad la escojes , el ángulo lo escojes, el efecto lo escojes(puedes despreciarlo por simplicidad) y  la dirección la escojes, si pegas un drive o un reves, recuerdo juegos que el ángulo entre x,y era definido fijo entre reves y volea, esto escogido por la posicion del jugador en pantalla respecto de la bola.... solo un porcentaje de esas combinaciones de las 4 elecciones resultarán en un tiro que quede en la cancha del contrario, pasando por encima de la red.
Sí así modelizas, las fórmulas te las dio Luis.

Es decir, se intenta que se cumpla una condición en tanto eso no cause que no se cumplan las otras.
3- Se quiere que la pelota pase por encima de la red, pero sin que ello implique que haya caído más/menos de lo que debe (condición 1) ni que se le haya aplicado más fuerza de la que se estableció como posible (condición 2). Si el jugador no tiene suficiente fuerza como para que se cumpla esta condición, no se cumple.
4- La oración anterior.
5- Lo mismo. Si para cumplir las condiciones anteriores es necesario que el tiro no vaya tan diagonal como se quiere, entonces no irá tan así, irá más bien verticalmente.
6- En tanto se cumplan las condiciones anteriores... Si la fuerza es 10 la velocidad Y no debe ser mayor que eso. Si queriendo asignar determinada fuerza a Y luego sin importar cuánta se asigne a Z la pelota no pasa la red o no cae en la cancha rival, entonces habrá que reducir la velocidad Y...



Entiendo de todo eso que lo que pretendes es automatizar la devolución de las bolas siempre dentro de campo rival, pero que sentido tiene que el juego tome la decisión por si solo,  el reto es tomarla uno mismo y aplicarla en tiempo y forma por teclado jostick o el periferico que sea.
O bien   puedo interpretar que lo que estas tratando es que el openente virtual haga todos esos calculos y devuelva la bola, en ese caso solo debes modelizar el tiro en funcion de los siguientes parametros
(xi,yi,zi) posición o punto del golpe
(vx,vy,vz) velocidad y direcccion luego del golpe
relacionado con (xp,yp,0) que sera el punto donde la bola pique
relacionado con (xr,yr,zr)  posicion donde el rival devuelve el golpe(antes del segundo pique).
otros parametros a tener en cuenta,el efecto, perdida de velocidad durante el pique,(coeficiente de restitución de la bola) la perdida de velocidad por rozaminto del aire, las ecuaciones que tranforman las posiciones espaciales en coordenadas de pantalla...


Saludos.



Saludos  \(\mathbb {R}^3\)

25 Noviembre, 2022, 08:28 am
Respuesta #5

Tachikomaia

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 228
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Yo te he dado directamente las ecuaciones de \( x,y,z \) en función del tiempo.
Lo veo en este post, no en el anterior. Bueno, al final pones una ecuación, pero mencionas p y q y no sé a qué te refieres ¿quisiste decir m y n?

Citar
Tu quieres discretizar el asunto.
Vi un video de qué es eso, pero no entendí del todo. Yo simplemente es que, si bien recuerdo, en el libro de programación que leí 1ero había una práctica de mover un pixel por la pantalla que era algo como
Código: [Seleccionar]
x=0
y=10
repetir mientras x<31
  print pixel en x,y
  x=x+1
Y eso lo fui adaptando a otro lenguaje y a mis objetivos...

Citar
Eso podría hacer que variase ligeramente el resultado final del lanzamiento
Tienes razón, tu método es más exacto porque en el mío se pierden algunos números decimales, o hay un poco de imprecisión.

Citar
¿porqué no haces algo del tipo \( x=x_0+v_x\cdot t \) y así con las demás.
Porque no se me había ocurrido, pero si me preguntas, tiene ciertas desventajas:
- Requiere una variable extra (t).
- Requiere variar una variable extra.
- La operación implica una multiplicación extra.
Lo usaré por la ventaja de la precisión y para avanzar más rápido, ya que ya me has dicho cómo hacerlo así (me cuesta entender tus ecuaciones, pero veremos).

Citar
No se en que lenguaje programas; pero cualquiera de esas fórmulas puede meterse directamente.
Actionscript de Macromedia Flash 5. Es muy viejo sí, pero me gusta, no pienso cambiar por ahora.
Si con directamente te refieres a que pueden copiar y pegarse, no en mi caso, de hecho intenté copiar tu post a Word para imprimirlo y leerlo durante un viaje pero las ecuaciones se pierden. Es del año 2013, quizá es por eso.

Citar
En mis tiempos mozos, hace más de 27 años, yo programaba juegos. Había hecho uno de fútbol, donde con una fórmula parecida mi jugador virtual "clavaba" cualquier falta donde yo quería (y además con efecto).
Haha... No tiene mucho que ver pero ¿no crees que en el fútbol más de cierta cantidad de efecto puede ser más perjudicial que beneficioso? Las combas golpean el palo, los liftados el travesaño, y sino, se acercan al medio del arco en un caso y al suelo en el otro.
3:20

Citar
¡Experimenta! Seguro que la primera vez que intentes meter estas fórmulas la bola hace lo que quiere. Pero luego vamos depurando.
Ok.

Citar
¿En qué lenguaje programas?
Actionscript de Macromedia Flash 5.

25 Noviembre, 2022, 10:14 am
Respuesta #6

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 52,433
  • País: es
  • Karma: +0/-0
Hola

Yo te he dado directamente las ecuaciones de \( x,y,z \) en función del tiempo.
Lo veo en este post, no en el anterior. Bueno, al final pones una ecuación, pero mencionas p y q y no sé a qué te refieres ¿quisiste decir m y n?

\( p,q \) las defino antes:

Citar
u=(p,q)=\dfrac{(x_2,y_2)-(x_1,y_1)}{d}

es decir:

\( p=\dfrac{x_2-x_1}{d} \)
\( q=\dfrac{y_2-y_1}{d} \)

recuerda que \( d \) también está definido antes:

\( d=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2} \)

y \( (x_1,y_1) \), \( (x_2,y_2) \) son las coordenadas del los puntos de salida y llegada de la pelota.

También te hará falta calcular la distancia \( r \) a la red; pero para ello hace falta saber en que coordenadas la tienes colocada.

Citar
¿porqué no haces algo del tipo \( x=x_0+v_x\cdot t \) y así con las demás.
Porque no se me había ocurrido, pero si me preguntas, tiene ciertas desventajas:
- Requiere una variable extra (t).
- Requiere variar una variable extra.
- La operación implica una multiplicación extra.
Lo usaré por la ventaja de la precisión y para avanzar más rápido, ya que ya me has dicho cómo hacerlo así (me cuesta entender tus ecuaciones, pero veremos).

A estas altura de rapidez de los procesadores, no creo que una operación más o menos sea dramática.

Citar
Citar
No se en que lenguaje programas; pero cualquiera de esas fórmulas puede meterse directamente.
Actionscript de Macromedia Flash 5. Es muy viejo sí, pero me gusta, no pienso cambiar por ahora.
Si con directamente te refieres a que pueden copiar y pegarse, no en mi caso, de hecho intenté copiar tu post a Word para imprimirlo y leerlo durante un viaje pero las ecuaciones se pierden. Es del año 2013, quizá es por eso.

Pero no tiene porque ser un copy-pega. Las imprimes y las metes a mano; o las copias a mano y las introduces. Lo que quiero decir es que son fácilmente implementables en cualquier lenguaje.

Saludos.

27 Noviembre, 2022, 06:58 am
Respuesta #7

Tachikomaia

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 228
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Acostumbrate a usar unidades, ¿0.01 que? metros/hora , kilometros/segundo? pixeles/segundo acaso?...
No lo había averiguado. Son pixeles. El tema es que pensé que un pixel era el mínimo dibujo posible en Paint, pero aquí se pueden dibujar cosas más pequeñas, por eso no pensé que fueran pixeles.

Citar
La velocidad sobre la bola resulta de la aplicación de una fuerza no constante  en el tiempo  y aplicada en un tiempo muy breve, no explicaré todo el tema pero lo que aplicas se llama "impulso" no fuerza. Puedes entiendo, mediante alguna acción de mouse o teclado administrar entonces ese implulso a placer dentro de una determinada escala de posibilidades que predefines.
Simplemente digo que por ejemplo aquí
en el tiempo 12:50 se puede ver que la velocidad de la bola de los saques de la jugadora es menor que la de los de su rival que hace saques poco después. Considero, que porque la fuerza de su brazo es menor, como se da a entender en este otro juego:
en 3:20, donde dice Serve.
En el otro juego no es posible ver ni modificar ese tipo de cosas del personaje, pero imagino que existen variables similares que pueden ser diferentes en cada personaje. Si bien en mi juego tengo pensado que otros factores influyan en la velocidad de la bola, básicamente es eso, no tenía sentido que especificara más, cosas que además aún no tengo tan bien definidas.
Para mí el impulso es digamos la cantidad de distancia que recorre el brazo antes de dar el golpe, asumiendo que hace un movimiento útil, sino no cuenta. Habrá jugadores que tengan tiros más fuertes por tener una mejor capacidad de tomar impulso, aunque tengan un poco menos fuerza de brazos. Repito que aún no tengo esas cosas tan bien definidas, pero eso es algo que había pensado.
Se jugaría con el teclado. Una vez que el rival hace un tiro, al presionar ciertas teclas tu personaje empieza a preparar su tiro, es como ocurre en el 2ndo video en 4:40
La velocidad de la bola en ese sentido se determina basado en la cantidad de tiempo preparando el tiro (entre más t, más v). Más cosas creo que no tiene mucho sentido que diga, no las tengo tan definidas y/o no vienen mucho al caso.

Citar
te reitero un consejo modeliza el sistema como si la cancha fuese real en tamaño,(no a escala) la velocidad de la bola similar a la que los jugadores de tenís , y la gravedad exactamente \( 9.80665m/s^2 \).
En el futuro puede que haga que la cancha sea más grande que la pantalla, pero por ahora quiero lo simple (no mover la cancha y demás es menos complicado que moverla). También quiero que el jugador pueda estar detrás de la línea de fondo y se vea bien (no ocurre casi en el 2ndo juego que te mostré). Que la pelota pueda ir muy hacia los costados (idem). Y usar el estilo de dibujos del 2ndo juego. Respecto a la resolución no entiendo mucho, le puse (contando los costados y el fondo, no solo la cancha) 800 por 600 pixeles, pensando que era el tamaño de mi monitor, pero recientemente vi que está configurado como 1024 por 768 porque sino dice que algunas cosas no entran en la pantalla; el punto es que podría agrandar la pantalla del juego a ese tamaño, pero no es tan simple como puede que creas: Varias líneas no tienen el tamaño que les puse (120 pixeles) y hay algunas que incluso se dividieron en varias líneas, como si hubiera un espacio vacío en medio. Mira:

Ahí borré algunas líneas pero quedaron esos trozos en el medio, que no deberían existir. También puedes ver que la línea seleccionada (abajo del cartel, tiene puntitos) no mide 120 pixeles como yo le puse. Incluso me ha pasado que algunas se tuercen si las fuerzo a unirse. Por esos motivos no quiero cambiar la resolución, y aunque puedo arreglarlo no quiero perder tiempo en algo que no cambia mucho al juego que digamos, quiero hacer cosas relevantes primero.
Por todo lo dicho, no sé si podría aplicar lo que me recomiendas.
¿No a escala? No entiendo. Wikipedia dice que las canchas miden 10,97 m (contando los corredores de dobles) por 23,77 m. Suponiendo que un pixel fuera 1 mm... ¿me recomiendas que la pantalla sea de 1097000 por 2377000 píxeles? No creo que mi computadora pueda con tanto, además el máximo tamaño que permite el programa que uso es 2880 por 2880.
En cuanto a las proporciones, en cierto punto quise imitar las reales, pero al final me gustó así. Es decir, mi cancha, al dividirse en 8 áreas (sin contar el corredor de dobles) forma 8 cuadrados iguales, mientras que en la real no son cuadrados ni iguales entre sí. El corredor de dobles no sé, el mío mide 30 píxeles, exactamente 4 veces menos que el ancho de un área (120). Mi cancha de singles mide 239.9 por 480 píxeles. Obviamente debería ser 240 por 480, pero ocurren errores como te expliqué. La de dobles es de 299.9 por 480 (debería ser 300 por 480). ¿Por qué esos números? Como te comenté le puse una pantalla de 800 por 600 pixeles. Para que el jugador pueda verse cuando está parado detrás de la línea de fondo, le puse un espacio de 60. Son 2. 600-60*2=480. El largo de la cancha. Luego, por una cuestión de simpleza, hice que el ancho sea la mitad de eso. No hay mucho más que explicar. No le veo mucho sentido a usar números tan poco redondos por más realistas que sean.
No sé cómo quedaría la velocidad real ni qué número de píxeles sería. Ten en cuenta que el juego muestra, en teoría, 120 fotogramas (imágenes) por segundo, así que no sé si poner la velocidad real tiene sentido. Tampoco es que los personajes vayan a ser como los humanos, no sé, lo que me importa que sea real es el tema de las trayectorias como expliqué (aunque no habría rozamiento con el aire ni cosas tan complicadas).
No sé cómo se aplica la gravedad. Puse que la pelota cae 0.01 pixeles por fotograma. ¿Me recomiendas que ponga 0.00980665? A mí me parece que es complicar las cosas en vano, casi no hay diferencia pero uno es un número bastante redondo y el otro no.

Citar
Una vez que hayas hecho los calculos de posición en función el tiempo de la cinemática de las perticulas y la aplicación de la dinámica Newtoniana, usas una función que transforme tus coordenadas  3d (x,y,z) del modelo a pixeles (X,Y) y no los confundas ya que \( x\neq X \).
No sé a qué te refieres en la última parte.

Citar
La atura de una red profesional en el medio debe ser de 0.91m
La que elegí está basada en la altura del personaje.

Con el tamaño que se muestra en la derecha. Es decir, las imagenes adquiridas de un videojuego ROM pueden variar dependiendo de cómo se adquieran. En la derecha la adquirí de un modo que no recuerdo, hace años, y en la izquierda de otro modo, recientemente, pero la red la copié de mi versión antigua. Al personaje de la izquierda, que usaré, le queda un poco alta, no me había fijado, pero como te comenté quiero avanzar en cosas relevantes, esto lo corregiré más adelante.
No sé qué me recomiendas que haga en cuanto a mi personaje, observa la imagen que puse en el 1er post ¿lo hago más alto? Pero se vuelve más ancho y se hace más tedioso usar las imágenes...

Citar
por cierto no todos los tiros en la practica pasaran a una única altura z  determinada
En el caso de los saques, cuando los jugadores tienen las características necesarias la idea es que sí.
Cuando no, no, por ejemplo una puntería no ideal haría que la trayectoria que se calculó cambie, es decir, no digo que cambia la trayectoria mientras se ejecuta, sino que, la que se iba a producir, tras haberla calculado, cambia, y se produce otra, con lo cual puede pasar más arriba de la red o chocar con ella.

Citar
puedes escojer que tipo de tiro hacerle al rival, con efecto, uno recto rapido, un globo, etc. No nos has explicado como escojes el tiro y  la dirección, solo que escojes el impulso.
No lo decidí pero el tipo de tiro probablemente con teclas como A, S, etc, mezclas de dichas teclas (por ejemplo A luego D), y la dirección mediante las flechas izquierda y derecha. No me gusta presionar arriba o abajo para esto, pero veré.

Citar
Bueno , eso es una definición
Según tengo entendido una definición es una descripción de un objeto por la cual dicho objeto se distingue de los otros. Lo que me dijiste que era una definición no no veo que lo sea, sino simplemente una condición. ¿A qué cosas le llamas definición?

Citar
si todos los jugadores pueden dar un golpe que deje la bola en cancha rival el partido nunca acaba,  a menos que no se alcance a llegar al posición de la bola en posición, tiempo y aplicar el tiro propio.
Los jugadores que no tengan suficiente habilidad harán tiros que no caigan en la cancha rival. Ya expliqué que igualmente necesito el cálculo de la trayectoria "perfecta". El partido puede acabar por la vía normal o por ejemplo porque un jugador se quedó sin cuerdas; el juego tendrá mucho de fantasía (tiros que tienen el "efecto" de cansar extra al rival si los devuelve por ejemplo).

Citar
Reitero como escojes esos parámetros en tiempo e ejecución no nos los has comentado.
No entiendo qué me estás recomendando que comente. ¿Que explique por ejemplo cuántos píxeles por fotograma se moverán los jugadores? Parecen cosas demasiado desviadas del tema.

Citar
no habrá bolas que peguen en la red? ni bolas largas,  ni anchas?
Habrá todo eso, pero los jugadores con capacidades suficientemente altas no cometerán esos errores. Mira:
Los errores que comentas, ahí, son más por errores de programación que por otra cosa. Como puedes ver, aún sin errores no es un mal juego. En singles sí, te diría que desde el fondo es imposible hacerle un punto a un jugador rápido, pero en mi juego tengo pensado hacer lo necesario para que sea mejor en ese sentido.

Citar
si la velocidad es máxima, entonces la altura sobre la red es mínima siempre, la realidad no funciona así, la velocidad la escojes , el ángulo lo escojes, el efecto lo escojes(puedes despreciarlo por simplicidad) y  la dirección la escojes, si pegas un drive o un reves, recuerdo juegos que el ángulo entre x,y era definido fijo entre reves y volea, esto escogido por la posicion del jugador en pantalla respecto de la bola.... solo un porcentaje de esas combinaciones de las 4 elecciones resultarán en un tiro que quede en la cancha del contrario, pasando por encima de la red.
La velocidad de los tiros se determina según la fuerza de brazos del personaje, otras cosas de él que no vienen a cuento, el tipo de tiro que se haga, la dirección que se le dé, el tiempo que se haya preparado... No sería un juego sobre tocar botones en momentos exactos y tener que andar con cuidado de no apuntar a la punta cuando estás en esa punta porque estúpidamente el juego no entiende que la quieres tirar en paralelo, o cosas así, sino que es más bien un juego RPG, de estrategia, no es simplemente jugar bien los partidos sino qué entrenas, cómo gastas tu dinero, etc. Aquí tienes un ejemplo de un juego en que casi no elijes la velocidad de tus tiros

Citar
Entiendo de todo eso que lo que pretendes es automatizar la devolución de las bolas siempre dentro de campo rival, pero que sentido tiene que el juego tome la decisión por si solo
Lo que pretendo es básicamente que se averigue cómo sería el tiro perfecto aunque basado en ciertas cosas elegidas por el usuario (dirección por ejemplo), y que si el personaje no tiene suficiente puntería el tiro resultante sea otro, como ya expliqué.
Eso a lo que no le ves sentido ocurre mucho y es muy aceptado en juegos con elementos RPG o estrategia. Ejemplo
19:40
Si quieres baja la velocidad del video porque lo puso rápido, pero lo que sucede es que el jugador elige lanzar una flecha a un enemigo pero la trayectoria se elige sola de modo que, si es posible, pase por encima de los obstáculos. Tampoco elige con qué fuerza la tira es decir cuánto daño hará (la velocidad en pantalla no cambia), eso se determina según las capacidades del personaje, siempre usa su máxima fuerza, speed, o lo que sea que use el juego para determinar el daño. Tampoco se eligen cosas al dar un espadazo, usar una magia, etc, el daño se determina en base a las capacidades del personaje. En algunos juegos la puntería también depende de eso, acá es más bien según la evasión del target. Podría ser que uno pudiera elegir hacer un ataque que sea más débil pero se ejecute más rápido y tenga más posibilidades de acertar, de hecho algo de eso hay, pero es más bien limitado, el juego es más bien de elegir qué ataques hacer no cómo hacerlos. Tu crítica llevada al extremo implicaría criticar que el personaje se mueva simplemente presionando flechas en vez de que uno tenga que presionar varias cosas o en momentos exactos para que mueva bien las piernas. Tu crítica totalmente ignorada llevaría a que los juegos no existieran, que sean películas que uno observa. Bueno, hay juegos que son más automatizados y otros menos...
En videojuegos de tenis "mal hechos" pueden ocurrir cosas como estas
1:50
3:00
3:10
Podría decirse que en esos casos falla porque comienza a hacer el tiro demasiado tarde, pero no le veo mucho sentido a que se castigue así, si eso hace que el tiro sea más velóz y con más ángulo y por lo tanto a veces sí convenga usarlo (ej en 2:00 y 2:30) ¿entonces cuando? ¿qué debes hacer si no puedes reaccionar suficientemente rápido, no apuntar a la punta más cercana? ¿cómo saber de antemano si funcionará o no? No me gusta ese mecanismo.
Pero solo te di un ejemplo, sucede también que al hacer saques paralelos es muy difícil que salgan bien ¿por qué? Entre otras cosas.

Citar
el reto es tomarla uno mismo y aplicarla en tiempo y forma por teclado jostick o el periferico que sea.
No conozco muchos videojuegos de tenis, pero según he visto me gusta así, además no imagino una manera mejor. Bueno, que si no presionas el botón en el momento justo el tiro puede salir mal, pero uh... sí, no había pensado en eso, sólo que determinara la velocidad. Aún así necesito la trayectoria "perfecta" por lo ya explicado.

Citar
otros parametros a tener en cuenta,el efecto
No lo he decidido.
He pensado por ejemplo que 10 puntos de backspin hagan que la pelota caiga a 0.005 pixeles en vez de 0.01, pero los tiros con backspin a veces es como que dejan de avanzar, quizá quiera imitar eso, tengo que informarme.
Los efectos posibles son backspin, topspin, sidespin (izq o der), trickspin (idem, estos no se curvan en el aire sino al botar) y... tengo que informarme pero, he pensado en Xbackspin y Xtopspin, que son lo que dicen pero agregando también de los otros. Menor intensidad de cada uno pero 3 en 1.

Citar
perdida de velocidad durante el pique,(coeficiente de restitución de la bola)
Tengo problemas con eso. No sé mucho de cómo afectan las superficies de la cancha a la bola y demás, pero he puesto:
Código: [Seleccionar]
Fuerzaderebotedepelota = -0.75;
// En ese caso menos es más.
Influenciadelrozamiento = 0.02;

Y en un proceso:
Código: [Seleccionar]
if (BallZ <= 0) {
        // Si la pelota llega al suelo, BallZSpeed se invierte con disminución según la cancha.
        BallZ = 0;
        BallZSpeed = BallZSpeed*Fuerzaderebotedepelota;
        // Si BallZSpeed es menor que 0.01: Queda en 0.
        if (BallZSpeed < 0.01) {
            BallZSpeed = 0;
        }
        // La pelota, al rozarse con el suelo, disminuye sus velocidades.
        BallXSpeed = BallXSpeed+Influenciadelrozamiento;
        if (BallXSpeed > 0) {
            BallXSpeed = 0;
        }
       BallYSpeed = BallYSpeed+Influenciadelrozamiento;
       if (BallYSpeed > 0) {
           BallYSpeed = 0;
       }
    }
Es decir, con ese sistema puede ocurrir que la velocidad hacia el costado disminuya a 0 pero la Y no tanto, por lo que el tiro cambia de dirección, pasa a ir sólo hacia arriba (a cancha rival, no me refiero a la altura).
Ahora se me ocurre calcular un porcentaje, pero no lo he pensado.

Citar
la perdida de velocidad por rozaminto del aire
No creo que incluya eso.

27 Noviembre, 2022, 03:03 pm
Respuesta #8

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,472
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Oh Oh!!! me contestó... y ahora qué le digo...

Hola como va, lo que pretendía es que si tu proyecto requiere de cálculos precisos para la ubicación de la bola en función del tiempo, también esos cálculos sean los más realistas posibles, pero que no sean complejos de modelizar.  He leído tu exposición sobre lo que pretendes, te daré mi punto de vista y consejos no de un desarrollador neto, mas bien de un gamer promedio.

No lo había averiguado. Son pixeles. El tema es que pensé que un pixel era el mínimo dibujo posible en Paint, pero aquí se pueden dibujar cosas más pequeñas, por eso no pensé que fueran pixeles.


Creo que la idea que subyace en tu proyecto la puedes dividir en 3 áreas


1 La física elemental para llegar del punto A al B con un tiempo real y velocidad real en un espacio 3d, junto a las idealizaciones o cosas que no tendras en cuenta a la hora de programar que te permitiran reducir la cantidad de cálculos, ejemplo, rozamiento con el aire , efectos, cambio del módulo de la velocidad luego de un pique, altura luego del pique.


2 El conjunto de ayudas y parámetros que predefinirás para que según la respuesta del teclado, salga un tiro aceptable, con esto me refiero a que jugar al tenis en la práctica requiere de un montón de cálculos mentales para que la bola vaya a donde uno quiere, y ni siquiera los profesionales a veces logran su cometido, por ello , debes modelizar como dar impulso y dirección, por ejemplo, en función de la posición de la pelota y el  jugador al momento del disparo con el impulso acumulado de alguna forma breve instantes antes.


3 Modelizar una función para que los pocos elementos móviles en pantalla (2 jugadores y bola), se adapten a la escala esto es pasar del modelo 3d al 2d de la pantalla. Esta función puede ser cualquiera en función de la perspectiva de presentación que escojas, veo que elejiste una plana superior, donde el efecto de la gravedad es paralelo a la linea de visión y así no tiene porque ser un valor fijo en pixeles ya que su efecto solo altera el tiempo en que la bola toca el piso.



En el otro juego no es posible ver ni modificar ese tipo de cosas del personaje, pero imagino que existen variables similares que pueden ser diferentes en cada personaje. Si bien en mi juego tengo pensado que otros factores influyan en la velocidad de la bola, básicamente es eso, no tenía sentido que especificara más, cosas que además aún no tengo tan bien definidas.
Para mí el impulso es digamos la cantidad de distancia que recorre el brazo antes de dar el golpe, asumiendo que hace un movimiento útil, sino no cuenta. Habrá jugadores que tengan tiros más fuertes por tener una mejor capacidad de tomar impulso, aunque tengan un poco menos fuerza de brazos. Repito que aún no tengo esas cosas tan bien definidas, pero eso es algo que había pensado.
Se jugaría con el teclado. Una vez que el rival hace un tiro, al presionar ciertas teclas tu personaje empieza a preparar su tiro, es como ocurre en el 2ndo video en 4:40
La velocidad de la bola en ese sentido se determina basado en la cantidad de tiempo preparando el tiro (entre más t, más v). Más cosas creo que no tiene mucho sentido que diga, no las tengo tan definidas y/o no vienen mucho al caso.

Ya te digo un tiro tiene estas variables el subindice A es para el jugador que golpea la bola y el B el punto donde has decidido que esta pique luego del golpe (si es que lo entras directamente con el teclado) y C la posicion del jugador numero 2


\( X_A;Y_A\to (x_A,y_A,z_A) \)


\( X_B;Y_B\to (x_B,y_B,0) \)


\( X_C;Y_C\to (x_C,y_C,z_C) \)


donde z representa la altura a la que golpean la bola que no es la altura del piso  ni se devuelve en la posición del pique.


Por un lado tienes que hacer una función que cambie las coordenadas de pantalla al espacio 3 d y también una inversa para poder graficar la posición de la bola y los jugadores.


Si acumulaste cierta cantidad de impulso que modelizada con la variable \( v \)  entre un máximo y cero , tienes además de alguna manera modelizar el tipo de tiro, pues si escoges  un punto cercano a la red no neceariamente resultará bueno que sea mas veloz que uno mas lento. Ejemplo estas cerca de la red y la quieres dormir debes escojer poco impulso, pero siquieres rematar le pondras el maximo, una vez hecha la elecccion  debes decidir si ese tiro sera bueno o malo para el jugador , es decir si queda en cancha , da en la red o se va largo o ancho, traduciendo v el angulo de salida la posicion incial y la dirección.




Respecto a la resolución no entiendo mucho, le puse (contando los costados y el fondo, no solo la cancha) 800 por 600 pixeles


X e Y te quedan en función de tu resolución(puedes escoger la que te plazca, o hacercela escojer por menú al player) pero las x,y y z la puedes escoger de un modelo real donde los tiempo son similares a los de un partido real, solo es una función matematica las que convierta unas coordenadas en otras. Esa función la vas a reutilizar innumerabes veces cada vez que los jugadores o la bola se mueva un pixel.


Por todo lo dicho, no sé si podría aplicar lo que me recomiendas.
¿No a escala? No entiendo. Wikipedia dice que las canchas miden 10,97 m (contando los corredores de dobles) por 23,77 m. Suponiendo que un pixel fuera 1 mm... ¿me recomiendas que la pantalla sea de 1097000 por 2377000 píxeles? No creo que mi computadora pueda con tanto, además el máximo tamaño que permite el programa que uso es 2880 por 2880.
No, no es así , lo que te propuse es que modelices todo el juego como si se tratase de un juego de la vida real con las dimensiones de la cancha, red y gravedad reales , para que luego lo traduscas a pantalla en función de tu resolución de pantalla, La escala la escojes tu 23.77m equivalen a 600 pixeles por ejemplo , escojes el cero en uno de los rincones , dibujas la cancha centrada quie tendra uno de sus laterales de 600 pixeles si es que escogiste esa escala los 10.97 seran \( 10.97\cdot \dfrac{600}{23.77}\cong 277 \) pixeles si las funciones de dibujo  no toman decimales has el corte luego del cálculo y no previo a este.


Te reitero si visualizas el juego desde arriba la gravedad no puede influir en la trayectoria siempre sera una linea recta(de no haber efectos), que haya más o menos gravedad solo influye en el tiempo que la bola tarda en tocar piso desde la altura y velocidad vertical que le fue dada.


No veo como le otorgaras velocidad vertical al tiro para que sea mas largo o mas corto , aunque le hayas dado a los dos el mismo impulso. Si lo haces por la distancia entre la pelota y jugador es cuestion de practica para el jugador adaptarse .  La dirección x,y puedes escogerla ser perpendicular al segmento definido por la pelota y jugador.
Saber si una pelota viene alta o baja , lo puedes hacer variando el diametro del grafico  de esta en funcion de la altura z, mas alto mas grande.

La atura de una red profesional en el medio debe ser de 0.91m
La que elegí está basada en la altura del personaje.
Recuerda que en la persepectiva desde arriba la red es solo una linea, pero a efectos graficos es mas bonito que la dibujes de perfil como tu lo has hecho.
No se si habrás decidido a que altura del personaje estará la bola cuando debe presionar el botón de golpear, pero solo has pedido datos para calcular el pique y no sobre si la bola esta muy baja o alta en z para poder asestar un golpe de devolución. 
El tamaño el personaje trata de que sea mayor o igual que la escala en la vida real, pero no mucho, perderá calidad si es un juego entre gigantes.


En el caso de los saques, cuando los jugadores tienen las características necesarias la idea es que sí.
Cuando no, no, por ejemplo una puntería no ideal haría que la trayectoria que se calculó cambie, es decir, no digo que cambia la trayectoria mientras se ejecuta, sino que, la que se iba a producir, tras haberla calculado, cambia, y se produce otra, con lo cual puede pasar más arriba de la red o chocar con ella.

Entiendo que lo que buscas es tener una trayectoria ideal, obtener los datos de impulso y dirección necesarios, y compararlos con los de teclado para ver si es un tiro que será ganador o no, o bridarle ciertas habilidades extras al player para ayudarle de cierto modo a que su tiro se parezca al ganador, pero me temo que sea más laborioso. 


En ese sentido mi punto de vista un juego debe darle herramientas al jugador para sacar el tiro que desee desde la posición que desee, si la combinación elegida es correcta el tiro quedará en cancha, luego verás como mueves el otro player para que devuelva el tiro o no lo alcance.


Por eso te digo que si el tiro lo se lo impones al jugador para que siempre lo devuelva en cancha ,eso es una definición..." siempre el tiro entra en cancha , nunca se va largo , nunca ancho , nunca en la red, eso es una definición de como tu quieres que las cosas pasen en el juego. Pero dices 

Citar
Los jugadores que no tengan suficiente habilidad harán tiros que no caigan en la cancha rival. Ya expliqué que igualmente necesito el cálculo de la trayectoria "perfecta". El partido puede acabar por la vía normal o por ejemplo porque un jugador se quedó sin cuerdas; el juego tendrá mucho de fantasía (tiros que tienen el "efecto" de cansar extra al rival si los devuelve por ejemplo).



Entonces no es una condición de que el tiro quede en cancha, como pedías,  tu debes dejar que el player tenga opciones y que si escoje la o las correctas el tiro quede en cancha a placer, pero con las equivocadas le saldrá un tipo perdedor.


Luego te darás ya cuenta que el tiro ideal es casi innecesario, que lo que debes siempre es darle las herramientas al player para que logre un tiro, dentro de los cuales esté el ideal o no, dada la posición de la pelota,  traduces sus decisiones a variables , con esta calculas la trayectoria, y puedes luego estudiar si quedará en cancha, en función de lo que sucedería en la vida real.


Citar
Citar
Reitero como escojes esos parámetros en tiempo e ejecución no nos los has comentado.
No entiendo qué me estás recomendando que comente. ¿Que explique por ejemplo cuántos píxeles por fotograma se moverán los jugadores? Parecen cosas demasiado desviadas del tema.

Ahora si has comentado como harás para que los jugadores tomen sus decisiones , acumular impulso, la posicion relativa, etc, eso es lo que no nos habias comentado, nada más, ahora se entiende y es un bonito y divertido desafío el que te has propuesto.


Entiendo que para las devoluciones puedes escoger el nivel de presición del rival , entre uno perfecto, que calculará adonde no puedes llegar si tira con determinada direccion y velocidad, dentro de los parámetros límite que impongas,  y uno pobre donde su actuación puede ser un tanto erraritica o probabilistica.


Citar
Podría decirse que en esos casos falla porque comienza a hacer el tiro demasiado tarde, pero no le veo mucho sentido a que se castigue así, si eso hace que el tiro sea más velóz y con más ángulo y por lo tanto a veces sí convenga usarlo (ej en 2:00 y 2:30) ¿entonces cuando? ¿qué debes hacer si no puedes reaccionar suficientemente rápido, no apuntar a la punta más cercana? ¿cómo saber de antemano si funcionará o no? No me gusta ese mecanismo.
Un jugador en la vida real  no sabe si su tiro será tan bueno como lo imagina antes de darle, si pega anticipado el tiro tiene una dirección y si tira tarde otra porque la posicion de la pelota cambio, no hay castigo , el más preciso tiene disponible más tiros ganadores.


Citar
No conozco muchos videojuegos de tenis, pero según he visto me gusta así, además no imagino una manera mejor. Bueno, que si no presionas el botón en el momento justo el tiro puede salir mal, pero uh... sí, no había pensado en eso, sólo que determinara la velocidad. Aún así necesito la trayectoria "perfecta" por lo ya explicado.


Mi sugerencia ya que todo esto que escribo es eso, es que elegir la potencia o impulso lo puedes hacer mientras la bola se acerca presionando una tecla que sume y otra que reste desde un nivel predeterminado que le des como ayuda y lo visualiza con la barrita verderojo clásica, elegir la dirección  o bien por teclado o  con la posicion del jugador respecto de la bola , la altura o angulo de salida del tiro con la distancia del jugador a la bola, muy lejana erra, lejana un remate, media una devolución y al cuerpo un globo, tanto para reves o drive.

Puedes incorporar efectos, lo que quiero comentarte, es que sí debes buscar la forma mediante desiciones automaticas extraidas de las condiciones del juego o bien por teclado, puedas ofrecercela al jugador para reolver su tiro, que sucedan por simple azar en mi opinión no es atractivo. Un jugador complicado de ganar es el que se posiciona a tiempo calcula el impulso correcto, la altura correcta y da el efecto correcto, así que permitas como se lo permitas tiene que tener la opción  para que tome la decisión y pueda lograrlo con la practica el juego.


Espero te sirva y aliente.


Un saludo

Saludos  \(\mathbb {R}^3\)

28 Noviembre, 2022, 06:25 am
Respuesta #9

Tachikomaia

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 228
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hice que el dibujo de la pelota esté un poco más abajo, más cerca de su sombra

así que ahora la mínima altura para pasar la red es 18.6

Cita de: Luis Fuentes link=topic=122044.msg493163#msg493163 
date=1669367655
También te hará falta calcular la distancia \( r \) a la red; pero para ello hace falta saber en que coordenadas la tienes colocada.
El punto más arriba izquierdo de la pantalla es 0, 0.
La red está en 400, 300.
La pelota al inicio está en BallX, 548, BallZ.
De ese BallX el mínimo es 417 y el máximo 521 (el personaje se puede mover entre los extremos de su lado derecho).
De ese BallZ el mínimo es 37.99 (creo) y el máximo 45.4 (puede golpear la pelota bastante abajo o más arriba).


Bueno, he aplicado tu método excepto en calcular BallZSpeed, eso lo aplicaré más adelante.

Funciona bien excepto por 2 cosas:
1- No aplica la fuerza del personaje. Probablemente no te entendí bien, creo que sé cómo corregirlo, pero mejor te lo cedo.
2- No parece que la BallZSpeed se vaya a calcular en función de la fuerza del personaje.

No sé cuánto del code necesitarás, te dejo 2 versiones, una que tiene solo lo que considero necesario para ti (me puedo equivocar, obviamente) y la completa.

Incompleta:
Código: [Seleccionar]
// La mínima BallZ que no toca la red es 18.6.
AlexFuerzadetiros = 4.5;
// ///////////////////////////////////////////////////////
// ///////////////////////  Alex  ////////////////////////
// ///////////////////////////////////////////////////////
function Alexelevandoball () {
    if (Teclafuesoltada == 1 && Key.isDown(65)) {
        // La tecla fue soltada y vuelta a presionar; Alex saca.
        // Datos para determinar velocidades del tiro.
        DistanciahastaDestinoX = 280.1-BallX;
        DistanciahastaDestinoY = 180-BallY;
        DistanciahastaRed = BallY-300;
        // Eso me dijeron que está mal calculado, eso es la distancia contando sólo Y.
        DistanciahastaMinsafeBallZ = BallZ-18.6;
        BallZwhenstriked = BallZ;
        DistanciahastaDestinoXY = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY);
        // Determinando velocidades del tiro.
        BallXSpeed = DistanciahastaDestinoX/DistanciahastaDestinoXY;
        BallYSpeed = DistanciahastaDestinoY/DistanciahastaDestinoXY;
        BallZSpeed = 0;
        // Eso como dije lo veré más adelante.
        // Datos para determinar posiciones de la pelota.
        Tiempotranscurridodeltiro = 0;
        BallXwhenstriked = BallX;
        BallYwhenstriked = BallY;
    }
}
//
function Ballmoving () {
    Tiempotranscurridodeltiro = Tiempotranscurridodeltiro+1;
    BallX = BallXwhenstriked+BallXSpeed*Tiempotranscurridodeltiro;
    BallY = BallYwhenstriked+BallYSpeed*Tiempotranscurridodeltiro;
    BallZSpeed = BallZSpeed-0.01;
    BallZ = BallZ+BallZSpeed;
    // Eso luego lo aplicaré a tu manera.
}


Completa:
Spoiler
Fotograma 1:
Código: [Seleccionar]
// La mínima BallZ que no toca la red es 18.6.
fscommand ("fullscreen", "true");
Fuerzaderebotedepelota = -0;
// En ese caso menos es más.
Influenciadelrozamiento = 0.02;
AlexFuerzadebrazos = 1000;
Alextimetodownracket = (10-Math.floor(AlexFuerzadebrazos/1000))*2+5;
Alextimetoupracket = Alextimetodownracket*2;
AlexFuerzadepiernas = 10000;
AlexFuerzadetiros = (AlexFuerzadebrazos/1000+AlexFuerzadepiernas/5000)*1.5;
Alexrunspeed = AlexFuerzadepiernas/10000;
Alexrunspeedonserving = AlexFuerzadepiernas/1000;
AlexMinXposonserving = 408+Alexrunspeedonserving;
AlexMaxXposonserving = 512-Alexrunspeedonserving;
// ///////////////////////////////////////////////////////
// ////////////////////  Saca Alex  //////////////////////
// ///////////////////////////////////////////////////////
AlexX = 460;
AlexY = 548;
attachMovie("AlexMovie", "Alex", 100);
setProperty (Alex, _x, AlexX);
setProperty (Alex, _y, AlexY);
MaxBallZwhenstriked = 0;
Teclafuesoltada = 0;
// ///////////////////////////////////////////////////////
// ///////////////////////  Alex  ////////////////////////
// ///////////////////////////////////////////////////////
function Alexmovetoserve () {
    // Se asume que el jugador elevó la pelota y no soltó la tecla, o que quizá empezó el juego con la tecla presionada.
    // Hasta que se capte que la tecla no está presionada no se podrá elevar la pelota.
    // Es para evitar que en caso de mantener la tecla presionada se eleve la pelota a penas vuelva a la mano.
    if (Key.isDown(37)) {
        // Se mueve a la izquierda, si no se sale del límite.
        if (AlexX>AlexMinXposonserving) {
            AlexX = AlexX-Alexrunspeedonserving;
        } else {
            AlexX = AlexMinXposonserving-Alexrunspeedonserving;
        }
        setProperty (Alex, _x, AlexX);
    } else if (Key.isDown(39)) {
        // Se mueve a la derecha, si no se sale del límite.
        if (AlexX<AlexMaxXposonserving) {
            AlexX = AlexX+Alexrunspeedonserving;
        } else {
            AlexX = AlexMaxXposonserving+Alexrunspeedonserving;
        }
        setProperty (Alex, _x, AlexX);
    }
    if (Teclafuesoltada == 0) {
        if (Key.isDown(65)) {
        } else {
            Teclafuesoltada = 1;
            // Ahora al presionar la tecla de nuevo Alex elevará la pelota.
        }
    } else if (Key.isDown(65)) {
        // Tecla A, eleva la pelota.
        Funcencurso = "Alexelevandoball";
        Teclafuesoltada = 0;
        // Qué tan arriba está la pelota y a qué Velocidad sube (todo al revés).
        BallZ = -37.6;
        BallZSpeed = -0.4;
        Alex.gotoAndStop(2);
        gotoAndStop (3);
    }
}
//
function Alexelevandoball () {
    if (Teclafuesoltada == 1 && Key.isDown(65)) {
        // La tecla fue soltada y vuelta a presionar; Alex saca.
        // La pelota y su sombra, que estaban en la movie Alex (para que se pudieran mover simplemente con mover a Alex), ahora son attached al lv0.
        Funcencurso = "Alexserving";
        BallX = AlexX+9;
        BallY = AlexY;
        attachMovie("BallShadowMovie", "BallShadow", 50);
        setProperty (BallShadow, _x, BallX);
        setProperty (BallShadow, _y, BallY);
        BallZ = BallZ*-1;
        BallZoom = 100+BallZ;
        attachMovie("BallMovie", "Ball", 99);
        setProperty (Ball, _x, BallX);
        setProperty (Ball, _y, BallY-BallZ);
        setProperty (Ball, _xscale, BallZoom);
        setProperty (Ball, _yscale, BallZoom);
        Timesincebeginserve = -1;
        Alex.gotoAndStop(3);
        setProperty (Alex.Chispa, _y, BallZ*-1-getProperty("Ball", _height)/2);
        setProperty (Alex.Chispa, _xscale, AlexFuerzadetiros*10);
        setProperty (Alex.Chispa, _yscale, AlexFuerzadetiros*10);
        // Datos para determinar velocidades del tiro.
        DistanciahastaDestinoX = 280.1-BallX;
        DistanciahastaDestinoY = 180-BallY;
        DistanciahastaRed = BallY-300;
        // Eso me dijeron que está mal calculado, eso es la distancia contando sólo Y.
        DistanciahastaMinsafeBallZ = BallZ-18.6;
        BallZwhenstriked = BallZ;
        DistanciahastaDestinoXY = Math.sqrt(DistanciahastaDestinoX*DistanciahastaDestinoX+DistanciahastaDestinoY*DistanciahastaDestinoY);
        // Determinando velocidades del tiro.
        BallXSpeed = DistanciahastaDestinoX/DistanciahastaDestinoXY;
        BallYSpeed = DistanciahastaDestinoY/DistanciahastaDestinoXY;
        BallZSpeed = 0;
        // Eso como dije lo veré más adelante.
        // Datos para determinar posiciones de la pelota.
        Tiempotranscurridodeltiro = 0;
        BallXwhenstriked = BallX;
        BallYwhenstriked = BallY;
        gotoAndStop (4);
    } else {
        if (Teclafuesoltada == 0) {
            // Aún no se soltó la tecla.
            if (Key.isDown(65)) {
            } else {
                Teclafuesoltada = 1;
                // Ahora al presionarla de nuevo Alex saca.
            }
        }
        // Disminuye la velocidad de subida y varía la altura.
        BallZSpeed = BallZSpeed+0.01;
        BallZ = BallZ+BallZSpeed;
        if (BallZ<MaxBallZwhenstriked) {
            MaxBallZwhenstriked = BallZ;
        }
        setProperty (Alex.Ball, _y, BallZ);
        // Varía el tamaño de la pelota.
        BallZoom = 100+BallZ*-1;
        setProperty (Alex.Ball, _xscale, BallZoom);
        setProperty (Alex.Ball, _yscale, BallZoom);
        if (BallZ>=-37.6) {
            // Si queda muy abajo (BallZ muy alto), vuelve a la etapa Alexmovetoserve.
            Teclafuesoltada = 0;
            Funcencurso = "Alexmovetoserve";
            Alex.gotoAndStop(1);
            gotoAndStop (2);
        }
    }
}
//
function Ballmoving () {
    Tiempotranscurridodeltiro = Tiempotranscurridodeltiro+1;
    BallX = BallXwhenstriked+BallXSpeed*Tiempotranscurridodeltiro;
    setProperty (BallShadow, _x, BallX);
    setProperty (Ball, _x, BallX);
    BallY = BallYwhenstriked+BallYSpeed*Tiempotranscurridodeltiro;
    setProperty (BallShadow, _y, BallY);
    BallZSpeed = BallZSpeed-0.01;
    BallZ = BallZ+BallZSpeed;
    // Eso luego lo aplicaré a tu manera.
    if (BallZ<=0) {
        // Si la pelota llega al suelo, BallZSpeed se invierte con disminución según la cancha.
        BallZ = 0;
        BallZSpeed = BallZSpeed*Fuerzaderebotedepelota;
        // Si BallZSpeed es menor que 0.01: Queda en 0.
        if (BallZSpeed<0.01) {
            BallZSpeed = 0;
        }
        // La pelots, al rozarse con el suelo, disminuye sus velocidades.
        // BallXSpeed = BallXSpeed+Influenciadelrozamiento;
        if (BallXSpeed>0) {
            BallXSpeed = 0;
        }
        // BallYSpeed = BallYSpeed+Influenciadelrozamiento;
        if (BallYSpeed>0) {
            BallYSpeed = 0;
        }
    }
    setProperty (Ball, _y, BallY-BallZ);
    BallZoom = 100+BallZ;
    setProperty (Ball, _xscale, BallZoom);
    setProperty (Ball, _yscale, BallZoom);
}
//
function Alexserving () {
    Ballmoving();
    Timesincebeginserve = Timesincebeginserve+1;
    if (Timesincebeginserve == Alextimetodownracket) {
        // Desaparece la chispa y Alex queda con la raqueta abajo.
        Alex.gotoAndStop(5);
    } else if (Timesincebeginserve == 5) {
        // Deaaparece la chispa.
        Alex.gotoAndStop(4);
    } else if (Timesincebeginserve == Alextimetoupracket) {
        // Alex queda listo para moverse, etc.
        Alex.gotoAndStop(6);
        gotoAndStop (5);
        // Funcencurso = ""; hay q ver si el saque toca la red.
    }
}
// falta indicar dirección
// El rozamiento funciona mal, uno se reduce a 0 antes que el otro.
// El tamaño de la chispa debería depender de cuánta fuerza se use, no de la usable.
// Asignar demasiada fuerza hace que la animación no ocurra bien
Funcencurso = "Alexmovetoserve";

Fotograma 2:
stop ();

Hay un objeto con:
onClipEvent (enterFrame) {
    _level0.Alexmovetoserve();
}

Fotograma 3:
Hay un objeto con:
onClipEvent (enterFrame) {
    _level0.Alexelevandoball();
}

Fotograma 4:
Hay un objeto con:
onClipEvent (enterFrame) {
    _level0.Alexserving();
}

Fotograma 5:
Hay un objeto con:
onClipEvent (enterFrame) {
    _level0.Ballmoving();
}

Los fotogramas del objeto Alex simplemente tienen dicho personaje en distintas posiciones, con algunos objetos pero no tiene código. Salvo el fotograma 1:
stop ();
[cerrar]

Resultado ejemplo 1:
  Variable _level0.AlexFuerzadetiros = 4.5
  Variable _level0.DistanciahastaDestinoX = -240.9
  Variable _level0.DistanciahastaDestinoY = -368
  Variable _level0.DistanciahastaRed = 248
  Variable _level0.DistanciahastaMinsafeBallZ = 26.35
  Variable _level0.BallZwhenstriked = 44.95
  Variable _level0.DistanciahastaDestinoXY = 439.837253992883
  Variable _level0.BallXSpeed = -0.547702582746431
  Variable _level0.BallYSpeed = -0.836673102742576
  Variable _level0.BallXwhenstriked = 521
  Variable _level0.BallYwhenstriked = 548

Resultado ejemplo 2:
  Variable _level0.AlexFuerzadetiros = 4.5
  Variable _level0.DistanciahastaDestinoX = -136.9
  Variable _level0.DistanciahastaDestinoY = -368
  Variable _level0.DistanciahastaRed = 248
  Variable _level0.DistanciahastaMinsafeBallZ = 25.44
  Variable _level0.BallZwhenstriked = 44.04
  Variable _level0.DistanciahastaDestinoXY = 392.639287387291
  Variable _level0.BallXSpeed = -0.348666076976053
  Variable _level0.BallYSpeed = -0.937247014807798
  Variable _level0.BallXwhenstriked = 417
  Variable _level0.BallYwhenstriked = 548


Entonces:
1- ¿Qué me falta para que BallXSpeed y BallYSpeed estén basados en AlexFuerzadetiros?
2- ¿Seguro que al calcular BallZSpeed te basas, en parte, en la fuerza del personaje? Porque asumiendo que en lo que apliqué de tu método es 1, habiendo aplicado 0.3 de fuerza para un lado y 0.9 para el otro dudo que quede mucha disponible...