Para facilitarme hacer un videojuego de tenis como quiero hice que la velocidad Z de la pelota (cuánto por frame se mueve hacia arriba o abajo; frame es una medida de tiempo) se calcule después de haberse calculado la velocidad X e Y (éstas por ahora se calculan en base a la fuerza del personaje y lugar al que lanza). Pero la forma conque la calculo no previene que la pelota quede en la red, por eso como di a entender en el título preciso calcular la máxima velocidad que cumpla con la condición de pasar por encima de la red, caer en el lugar elegido, y ser menor o igual a la fuerza del personaje.
Creo que es muy complicado, pero por eso pido ayuda... Entenderlo lo pueden muy fácil si prueban el juego o imaginan que hacen un saque plano (sin efecto) muy fuerte y desde no tanta altura: Es imposible que la pelota pase por encima de la red y caiga en la zona de saque, porque debe ir medio alto y no baja suficientemente rápido. Eso no sucede sólo en el saque; en muchos casos los jugadores tendrán que evitar usar más fuerza de la adecuada.
El juego (incompleto):
http://www.megaupload.com/?d=54YYQTF0
Controles:
- Te mueves con las flechas.
- Lanzas/golpeas la pelota con la A. Si al golpear estás presionando derecha o izquierda, se dirigirá hacia esa dirección.
Lo básico:
Para saber si la pelota toca la red o no, lo ideal es captar qué tan alto está cuando pasa por el punto donde está la red. Eso no es siempre posible porque las medidas del juego no son tan altas; si la pelota se mueve por ej a 10 píxeles por frame entonces habrá píxeles en que no se verá en un frame (momento), es como si desapareciera y apareciera 10 píxeles adelante (creo que sucede algo similar en todos los juegos, de hecho). Lo que hago entonces es captar el primer momento en que pasa la red o se encuentra en su mismo punto; si en ese momento está por debajo, considero que la tocó. Los efectos de ese toque no son el tema por ahora, es evitar que haya ese toque. Bueno cuando ocurre ese momento, en este demo, se hace una copia de la pelota y la sombra y quedan en el lugar de su origen; también se hace una copia de la pelota cuando pica pero es otro tema también.
Referencias (pueden entender el problema sin entender esto):
- BallZRed: Marca la altura de la pelota cuando llega a la red o en el primer momento en que la pasa.
- BallZInicial: Marca la altura en que se golpeó la pelota (la máxima es más o menos 67.645).
- BallZSpeedf: Marca la velocidad Z en el inicio del tiro.
- BallYSpeed: Marca la velocidad Y en el inicio del tiro.
- AlexPow: Fuerza del personaje, puedes variar esto.
Bueno ¿cómo hago? Por ahora se me ocurre tomar datos y tratar de entender cómo se relacionan pero son números decimales... y hacer representaciones con números más simples es... complicado. En el siguiente dibujo puede verse:
No es fácil encontrar casos que sirvan, muchas veces con cierta velocidad Z no cae en la cancha pero la mínima reducción hace que no pase la red, además de que con velocidades impares la distancia parece tener que ser par (para que encaje bien) y con pares impar, o sea tampoco es fácil ver la diferencia entre 1. Incluso encontrar casos "exactos" (como "en tal caso la máxima velocidad es...") no sé si sirve porque en los casos reales hay números decimales.... ¿qué datos podría obtener? En el caso que no está tachado, diría "la máxima velocidad es 1", pero en el juego podría servir 1.1 (o 1.01 ya que la mínima variación sería justamente 0.01). "Velocidad 2 no sirve" no creo que ayude mucho. Bueno yo voy a tomar datos del juego y después pongo, pero si se les ocurre algo favor avisen.
Gracias desde ya.
Creo que es muy complicado, pero por eso pido ayuda... Entenderlo lo pueden muy fácil si prueban el juego o imaginan que hacen un saque plano (sin efecto) muy fuerte y desde no tanta altura: Es imposible que la pelota pase por encima de la red y caiga en la zona de saque, porque debe ir medio alto y no baja suficientemente rápido. Eso no sucede sólo en el saque; en muchos casos los jugadores tendrán que evitar usar más fuerza de la adecuada.
El juego (incompleto):
http://www.megaupload.com/?d=54YYQTF0
Controles:
- Te mueves con las flechas.
- Lanzas/golpeas la pelota con la A. Si al golpear estás presionando derecha o izquierda, se dirigirá hacia esa dirección.
Lo básico:
Para saber si la pelota toca la red o no, lo ideal es captar qué tan alto está cuando pasa por el punto donde está la red. Eso no es siempre posible porque las medidas del juego no son tan altas; si la pelota se mueve por ej a 10 píxeles por frame entonces habrá píxeles en que no se verá en un frame (momento), es como si desapareciera y apareciera 10 píxeles adelante (creo que sucede algo similar en todos los juegos, de hecho). Lo que hago entonces es captar el primer momento en que pasa la red o se encuentra en su mismo punto; si en ese momento está por debajo, considero que la tocó. Los efectos de ese toque no son el tema por ahora, es evitar que haya ese toque. Bueno cuando ocurre ese momento, en este demo, se hace una copia de la pelota y la sombra y quedan en el lugar de su origen; también se hace una copia de la pelota cuando pica pero es otro tema también.
Referencias (pueden entender el problema sin entender esto):
- BallZRed: Marca la altura de la pelota cuando llega a la red o en el primer momento en que la pasa.
- BallZInicial: Marca la altura en que se golpeó la pelota (la máxima es más o menos 67.645).
- BallZSpeedf: Marca la velocidad Z en el inicio del tiro.
- BallYSpeed: Marca la velocidad Y en el inicio del tiro.
- AlexPow: Fuerza del personaje, puedes variar esto.
Bueno ¿cómo hago? Por ahora se me ocurre tomar datos y tratar de entender cómo se relacionan pero son números decimales... y hacer representaciones con números más simples es... complicado. En el siguiente dibujo puede verse:
No es fácil encontrar casos que sirvan, muchas veces con cierta velocidad Z no cae en la cancha pero la mínima reducción hace que no pase la red, además de que con velocidades impares la distancia parece tener que ser par (para que encaje bien) y con pares impar, o sea tampoco es fácil ver la diferencia entre 1. Incluso encontrar casos "exactos" (como "en tal caso la máxima velocidad es...") no sé si sirve porque en los casos reales hay números decimales.... ¿qué datos podría obtener? En el caso que no está tachado, diría "la máxima velocidad es 1", pero en el juego podría servir 1.1 (o 1.01 ya que la mínima variación sería justamente 0.01). "Velocidad 2 no sirve" no creo que ayude mucho. Bueno yo voy a tomar datos del juego y después pongo, pero si se les ocurre algo favor avisen.
Gracias desde ya.