elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Por qué el meteoro no va a donde le digo?
Tachikomaia y 5 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Por qué el meteoro no va a donde le digo?  (Leído 119 veces)
Tachikomaia


Conectado Conectado

Mensajes: 1.589


Hackentifiko!


Ver Perfil
¿Por qué el meteoro no va a donde le digo?
« en: Hoy a las 12:13 »

https://youtu.be/TmACx8Du3as

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.

La mira es algo provisorio para mostrar la falla, no habrá mira en el juego.

Creo que el error está acá:
Código
  1. if (Meteor.hitTest(Player) && MeteorYSpeed>0) {
  2. // Determinar velocidad Y al azar:
  3. MeteorYSpeed = -Math.random()*(2+Dificultad)-1;
  4. // Distancia Y desde el meteoro hasta el punto hacia donde se lo apuntó:
  5. DistanciaY = Meteor._y-20.5;
  6. // Cuánto tardará el meteoro en recorrerla:
  7. TardanzaY = Math.ceil(DistanciaY/-MeteorYSpeed);
  8. // Distancia X desde el meteoro hasta el punto hacia donde se lo apuntó:
  9. DistanciaX = Meteor._x-400+Apuntando;
  10. // Determinar la velocidad X para que el meteoro llegue...
  11. // al punto X apuntado justo cuando llega al punto Y apuntado:
  12. MeteorXSpeed = DistanciaX/TardanzaY;

Código completo:
Código
  1. // Algo como esto if (MeteorYSpeed>0) { se está haciendo 2 veces,
  2. // pero evitarlo implicaría unir cosas del jugador y la IA?
  3. //
  4. fscommand ("fullscreen", "true");
  5. // Varía según diferencia de puntajes:
  6. Dificultad = 0;
  7. // Player:
  8. attachMovie("sShip", "Player", 1);
  9. setProperty ("Player", _x, 400);
  10. setProperty ("Player", _y, 579.5);
  11. PlayerSpeed = 3;
  12. PlayerScore = 0;
  13. // IA:
  14. attachMovie("sIA", "IA", 2);
  15. setProperty ("IA", _x, 400);
  16. setProperty ("IA", _y, 20.5);
  17. IASpeed = 3;
  18. IAScore = 0;
  19. // Meteor:
  20. attachMovie("sMeteor", "Meteor", 3);
  21. setProperty ("Meteor", _x, 400);
  22. setProperty ("Meteor", _y, 544.5);
  23. // Se define acá para que luego el programa considere que...
  24. // hubo contacto entre la nave del jugador y el meteoro:
  25. MeteorYSpeed = 1;
  26. // Para que la curvatura dependa de MeteorYSpeed
  27. // (1 es hacia arriba, -1 hacia abajo):
  28. MeteorYDirection = -1;
  29. // Valores del color más brillante del meteoro (F0D9C8):
  30. MaxRojo = 255;
  31. MaxVerde = 217;
  32. MaxAzul = 200;
  33. // /////////////////////////////////////////////
  34. // /////////////////// Ship ////////////////////
  35. // /////////////////////////////////////////////
  36. function ControlShip () {
  37. if (Key.isDown(39)) {
  38. // Derecha.
  39. // Para evitar que se vaya demasiado al extremo derecho:
  40. if (Player._x<722) {
  41. Player._x = Player._x+PlayerSpeed;
  42. } else {
  43. Player._x = 725;
  44. }
  45. } else if (Key.isDown(37)) {
  46. // Izquierda.
  47. // Para evitar que se vaya demasiado al extremo izquierdo:
  48. if (Player._x>78) {
  49. Player._x = Player._x-PlayerSpeed;
  50. } else {
  51. Player._x = 75;
  52. }
  53. }
  54. // Si el meteoro va hacia abajo:
  55. if (MeteorYSpeed>0) {
  56. // Si aún no se eligió hacia dónde rebotarlo:
  57. if (Apuntando == 0) {
  58. if (Key.isDown(65)) {
  59. Apuntando = -1;
  60. attachMovie("sMira", "Mira", 4);
  61. setProperty ("Mira", _x, 399);
  62. setProperty ("Mira", _y, 20.5);
  63. } else if (Key.isDown(83)) {
  64. Apuntando = 1;
  65. attachMovie("sMira", "Mira", 4);
  66. setProperty ("Mira", _x, 401);
  67. setProperty ("Mira", _y, 20.5);
  68. }
  69. } else if (Apuntando < 0) {
  70. Apuntando = Apuntando-3;
  71. if (Apuntando < -400) {
  72. Apuntando = -400;
  73. }
  74. setProperty ("Mira", _x, 400+Apuntando);
  75. } else {
  76. Apuntando = Apuntando+3;
  77. if (Apuntando > 400) {
  78. Apuntando = 400;
  79. }
  80. setProperty ("Mira", _x, 400+Apuntando);
  81. }
  82. }
  83. }
  84. // /////////////////////////////////////////////
  85. // ////////////////////  IA  ///////////////////
  86. // /////////////////////////////////////////////
  87. function IATurn () {
  88. // Si el meteoro va hacia arriba:
  89. if (MeteorYSpeed<0) {
  90. // La IA se moverá hacia él:
  91. Distancia = IA._x-Meteor._x;
  92. } else {
  93. // La IA irá hacia el centro:
  94. Distancia = IA._x-400;
  95. }
  96. if (Distancia < 0) {
  97. IA._x = IA._x+IASpeed;
  98. // Para evitar que se vaya demasiado a la derecha:
  99. if (IA._x > 725) {
  100. IA._x = 725;
  101. }
  102. } else if (Distancia > 0) {
  103. IA._x = IA._x-IASpeed;
  104. // Para evitar que se vaya demasiado a la izquierda:
  105. if (IA._x < 75) {
  106. IA._x = 75;
  107. }
  108. }
  109. }
  110. // /////////////////////////////////////////////
  111. // /////////////////  Meteor  //////////////////
  112. // /////////////////////////////////////////////
  113. function VariarMeteoro () {
  114. Diametro = 44;
  115. Radio = Diametro/2;
  116. // Insertarle imágenes:
  117. Imagen = 0;
  118. do {
  119. Imagen++;
  120. Name = "Imagen"+Imagen;
  121. Meteor.attachMovie("sCirculo", Name, Imagen);
  122. Name = "Meteor."+Name;
  123. // Para los tamaños y rotación:
  124. setProperty (Name, _xscale, 400*Math.random());
  125. setProperty (Name, _yscale, 400*Math.random());
  126. setProperty (Name, _rotation, 360*Math.random());
  127. // Para las posiciones:
  128. X = Math.random()*Diametro - Radio;
  129. setProperty (Name, _x, X);
  130. MaxY = Math.sqrt(Radio*Radio - X*X);
  131. Y = Math.random() * (MaxY*2) - MaxY;
  132. setProperty (Name, _y, Y);
  133. // Para los colores:
  134. ColorDeName = new Color(Name);
  135. Brillo = 0.2 + 0.8 * Math.random();
  136. Rojo = Math.round(MaxRojo * Brillo);
  137. Verde = Math.round(MaxVerde * Brillo);
  138. Azul = Math.round(MaxAzul * Brillo);
  139. ColorElegido = (Rojo << 16) | (Verde << 8) | Azul;
  140. ColorDeName.setRGB(ColorElegido);
  141. } while (Imagen < 1000);
  142. }
  143. VariarMeteoro ();
  144. function MeteorMoves () {
  145. MeteorXSpeed = MeteorXSpeed+MeteorRotation/1000*MeteorYDirection;
  146. MeteorRotation = MeteorRotation/1.01;
  147. Meteor._x = Meteor._x+MeteorXSpeed;
  148. Meteor._y = Meteor._y+MeteorYSpeed;
  149. Meteor._rotation = Meteor._rotation+MeteorRotation;
  150. // Choque con nave derecha:
  151. if (Meteor._x > 752.5) {
  152. MeteorXSpeed = -MeteorXSpeed;
  153. if (MeteorYSpeed > 0) {
  154. // Si va hacia abajo:
  155. MeteorYSpeed = Math.max (MeteorYSpeed, MeteorYSpeed-MeteorRotation/50);
  156. } else if (MeteorYSpeed < 0) {
  157. MeteorYSpeed = Math.min (MeteorYSpeed, MeteorYSpeed+MeteorRotation/50);
  158. }
  159. MeteorRotation = Math.random()*10*(2*random(2)-1);
  160. } else if (Meteor._x < 47.5) {
  161. // Choque con nave izquierda:
  162. MeteorXSpeed = -MeteorXSpeed;
  163. if (MeteorYSpeed > 0) {
  164. // Si va hacia abajo:
  165. MeteorYSpeed = Math.max (MeteorYSpeed, MeteorYSpeed+MeteorRotation/50);
  166. } else if (MeteorYSpeed < 0) {
  167. MeteorYSpeed = Math.min (MeteorYSpeed, MeteorYSpeed-MeteorRotation/50);
  168. }
  169. MeteorRotation = Math.random()*10*(2*random(2)-1);
  170. }
  171. if (Meteor.hitTest(Player) && MeteorYSpeed>0) {
  172. // Determinar velocidad Y al azar:
  173. MeteorYSpeed = -Math.random()*(2+Dificultad)-1;
  174. if (Apuntando < -400) {
  175. Apuntando = -400;
  176. } else if (Apuntando > 400) {
  177. Apuntando = 400;
  178. }
  179. // Distancia Y desde el meteoro hasta el punto hacia donde se lo apuntó:
  180. DistanciaY = Meteor._y-20.5;
  181. // Cuánto tardará el meteoro en recorrerla:
  182. TardanzaY = Math.ceil(DistanciaY/-MeteorYSpeed);
  183. // Distancia X desde el meteoro hasta el punto hacia donde se lo apuntó:
  184. DistanciaX = Meteor._x-400+Apuntando;
  185. // Determinar la velocidad X para que el meteoro llegue...
  186. // al punto X apuntado justo cuando llega al punto Y apuntado:
  187. MeteorXSpeed = DistanciaX/TardanzaY;
  188. MeteorRotation = 0;
  189. // MeteorRotation = Math.random()*(180+Dificultad)*(2*random(2)-1);
  190. MeteorYDirection = 1;
  191. trace("MeteorYSpeed: "+MeteorYSpeed);
  192. trace("Apuntando: "+Apuntando);
  193. trace("DistanciaY: "+DistanciaY);
  194. trace("TardanzaY: "+TardanzaY);
  195. trace("DistanciaX: "+DistanciaX);
  196. trace("MeteorXSpeed: "+MeteorXSpeed);
  197. removeMovieclip("Mira");
  198. } else if (Meteor.hitTest(IA) && MeteorYSpeed<0) {
  199. MeteorYSpeed = Math.random()*(2+Dificultad)+1;
  200. MeteorXSpeed = Math.random()*(3+Dificultad)*(2*random(2)-1);
  201. MeteorRotation = Math.random()*(180+Dificultad)*(2*random(2)-1);
  202. MeteorYDirection = -1;
  203. Apuntando = 0;
  204. } else if (Meteor._y<0) {
  205. setProperty ("Meteor", _x, 400);
  206. setProperty ("Meteor", _y, 55.5);
  207. PlayerScore++;
  208. Dificultad++;
  209. PlayerSpeed = PlayerSpeed+0.1;
  210. IASpeed = IASpeed+0.11;
  211. ShowScore();
  212. } else if (Meteor._y>600) {
  213. setProperty ("Meteor", _x, 400);
  214. setProperty ("Meteor", _y, 544.5);
  215. IAScore++;
  216. Dificultad--;
  217. PlayerSpeed = PlayerSpeed-0.1;
  218. IASpeed = IASpeed-0.11;
  219. ShowScore();
  220. }
  221. }
  222. //
  223. function ShowScore () {
  224. attachMovie("sPuntaje", "Mensaje", 4);
  225. setProperty ("Mensaje", _x, 400);
  226. setProperty ("Mensaje", _y, 300);
  227. setProperty ("Player", _x, 400);
  228. setProperty ("IA", _x, 400);
  229. gotoAndStop (3);
  230. }
  231. // stop ();


En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.404


Turn off the red ligth


Ver Perfil WWW
Re: ¿Por qué el meteoro no va a donde le digo?
« Respuesta #1 en: Hoy a las 15:09 »

El problema a simple vista es que la mira se queda pegada al muro (por ejemplo a la esquina superior izquierda) a pesar de que sigues moviéndote en esa dirección.

Otra forma de explicarlo. Si tienes la plataforma de abajo en la posición exacta que mandará la pelota a la esquina superior izquierda, y sigues moviendo la plataforma hacia la derecha (para pegarle con mas ángulo a la pelota para mandar aún mas hacia la izquierda la pelota) la mira no puede moverse mas allá de la esquina izquierda superior (porque se para en el muro).

Cuando pasa esto, no calcula la posición real de donde golpeará la pelota. (Que en vez de golpear en la esquina superior izquierda (donde está la mira), golpeará por ejemplo en la pared izquierda antes de golpear en el "techo".

Una forma que se me ocurre para que lo puedas solucionar es hacer que la mira se mueva por las paredes hacia abajo al llegar al muro del lado izquierdo (lo mismo para el otro lado).

Esto es necesario ya que tal y como lo tienes ahora mismo, no estás calculando el rebote de la pelota en la pared. Este rebote altera en donde va a golpear la pelota en la parte superior tras el rebote contra la pared horizontal.

Podrías hacer este cálculo invisble para la mira y en su lugar calcular en donde golpeará en la parte superior tras el rebote.

Aquí te hice un ejemplo para que visualices el problema:
https://stringmanolo.github.io/share/js/pong/

La linea verde es teniendo en cuenta el rebote en la pared. La linea roja es lo que tu haces.


« Última modificación: Hoy a las 16:04 por @XSStringManolo » En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Tachikomaia


Conectado Conectado

Mensajes: 1.589


Hackentifiko!


Ver Perfil
Re: ¿Por qué el meteoro no va a donde le digo?
« Respuesta #2 en: Hoy a las 19:52 »

La mira es a donde tiene que ir el meteoro cuando toque la nave de abajo. Cuando queda en una punta es como si estuvieses jugando al tenis y apuntando a la punta, es normal.

No importa aquí qué lugar de la nave de abajo toque el meteoro. Mover la nave no cambia la posición de la mira, es como un "charging", apretás A o S y en vez de que el tiro sea más fuerte debe ir más a la punta.

Una forma que se me ocurre para que lo puedas solucionar es hacer que la mira se mueva por las paredes hacia abajo al llegar al muro del lado izquierdo (lo mismo para el otro lado).
Tengo pensado hacer eso pero no veo que sea la solución al problema... Eso va a ser una 2nda etapa del charging, que vaya justo al centro y rebote, ya que es efectivo contra la IA. Así como está el juego es muy difícil hacerle un punto.

Citar
Esto es necesario ya que tal y como lo tienes ahora mismo, no estás calculando el rebote de la pelota en la pared. Este rebote altera en donde va a golpear la pelota en la parte superior tras el rebote contra la pared horizontal.
Creo que hay confusión, la trayectoria del tiro debe decidirse cuando toca la nave de abajo y por ahora no debe tocar las paredes. Hago un dibujo...

Cuando el meteoro toque la nave de abajo, debe rebotar siguiendo la línea verde, hacia la mira, sin tocar las paredes.
Si va a tardar 100 frames en recorrer la distanciaY, debe tardar 100 frames en recorrer la distanciaX. Ese es el razonamiento que hago y el cálculo que intento hacer, pero no sé qué pasa.


En tu ejemplo a veces choca en la pared, esa no es la idea, lo demás está bien, no sé cómo hiciste el cálculo...

Ignora la pared por ahora, se va a usar más adelante. Supón que es un juego de golf de cuando usas el palo que la pelota no sube, o sea, todo 2d, visto de arriba, y la mira el hoyo, y se quiere que la pelota vaya ahí.
Se determina una velocidad Y al azar:
MeteorYSpeed = -Math.random()*(2+Dificultad)-1;
¿y luego? Capaz que me falla el cálculo porque esa velocidad es negativa, luego veo.
« Última modificación: Hoy a las 19:57 por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Código-Python]Código Ofuscado nº2 JaAViEr|0x5d [Actualizado]
Scripting
0x5d 6 6,370 Último mensaje 7 Mayo 2013, 23:52 pm
por CodeSource
Pasar este código de C a C#
.NET (C#, VB.NET, ASP)
Meta 3 2,675 Último mensaje 26 Octubre 2013, 20:58 pm
por Spiritdead5
Optimizar este código en C++
Programación C/C++
huchoko 3 1,902 Último mensaje 25 Octubre 2018, 20:09 pm
por elgilun
Meteoro explota sobre Japón: liberó energía equivalente a 150 toneladas de TNT
Foro Libre
El_Andaluz 1 2,992 Último mensaje 7 Julio 2020, 22:50 pm
por **Aincrad**
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines