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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  No se capta colisión ¿calculo mal la distancia?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No se capta colisión ¿calculo mal la distancia?  (Leído 581 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.437


Hackentifiko!


Ver Perfil
No se capta colisión ¿calculo mal la distancia?
« en: 27 Noviembre 2024, 08:42 am »

Intento hacer un juego pero hay una colisión que falla en detectarse, así que hice una versión más simple, que también falla xP

Un personaje se mueve hacia la derecha y cuando toca el barril debería empujarlo, pero como el programa falla, hay game over  :-(

El archivo editable:
https://docs.google.com/document/d/1oHcl-CnBQtm79ABWG9JuJDslrA77XZho/edit?usp=sharing&ouid=109273743447273895658&rtpof=true&sd=true
Nota: Donde dice "      // Hay que ver si tocaría un barril, arreglarlo.", creo que está mal, ya lo arreglé, además no es el problema.

El código:
Código
  1. // Indica si el juego continúa o no:
  2. Game = "Ok";
  3. // Por motivos que no recuerdo, las imágenes se ponen...
  4. // en un objeto I.
  5. // Agregar personaje:
  6. I.attachMovie("sMedaMan", "Player", 1);
  7. // X es porque la posición real del personaje no admite...
  8. // tantos valores, los simplifica, se pierde parte;
  9. // de este modo no:
  10. I.Player.X = 0;
  11. I.Player._X = I.Player.X;
  12. I.Player._Y = 584;
  13. I.Player.Action = "Quiet";
  14. I.attachMovie("sBarril", "Barril2", 2);
  15. I.Barril2.X = 80;
  16. I.Barril2._X = I.Barril2.X;
  17. I.Barril2._Y = 584;
  18. LV = 1;
  19. Recorrido = 0;
  20. // /////////////////////////////////////////////
  21. // /////////////////  MedaMan  /////////////////
  22. // /////////////////////////////////////////////
  23. function AumentarRecorrido () {
  24. Recorrido++;
  25. if (Recorrido == 50) {
  26. Recorrido = 0;
  27. LV++;
  28. }
  29. }
  30. function Walk () {
  31. I.Player.Action = "Walking";
  32. I.Player.gotoAndStop(2);
  33. // Indica si debe empujar un barril o no:
  34. I.Player.Empujar = "No";
  35. // Ver si empuja algún barril:
  36. // (tal vez convenga chequear desde el último)
  37. BarrilesChequeados = 1;
  38. BarrilesChequeados++;
  39. BarrilaChequear = "I.Barril"+BarrilesChequeados;
  40. BarrilX = getProperty(BarrilaChequear, _x);
  41. // Si el barril existe:
  42. if (BarrilX != undefined) {
  43. DistanciaPlayerBarril = Math.abs(I.Player.X-BarrilX);
  44. trace("DistanciaPlayerBarril: "+DistanciaPlayerBarril);
  45. // 26 es la mínima distancia conque no se tocan,
  46. // pero se agrega 0.2 por el movimiento de Medaman:
  47. if (DistanciaPlayerBarril < 26.2) {
  48. trace("Empuja");
  49. I.Player.Empujar = "Sí";
  50. }
  51. }
  52. if (I.Player.Empujar == "No") {
  53. // El personaje avanza:
  54. // Hay que ver si tocaría un barril, arreglarlo.
  55. I.Player.X = I.Player.X+0.2;
  56. I.Player._X = I.Player.X;
  57. AumentarRecorrido();
  58. } else {
  59. // Determinar movimientos:
  60. // MaxDist < 14+12+0.2
  61. // MinDist > 0
  62. // Distancia 26.2 -> 0 movimiento
  63. // 0 -> 0.2
  64. MovimientoDelPers = DistanciaPlayerBarril*0.2/26.2;
  65. I.Player.X = I.Player.X+MovimientoDelPers;
  66. I.Player._X = I.Player.X;
  67. // Recorrido debe aumentar acorde a eso, arreglarlo:
  68. AumentarRecorrido();
  69. // Empuja un barril:
  70. // Esto sólo aumenta la velocidad, ojo que si no se mueve puede que quede tocando al personaje:
  71. BarrilSpeed = BarrilaChequear+"Speed";
  72. set (BarrilSpeed, eval(BarrilSpeed)+0.2-MovimientoDelPers);
  73. trace("Speed: "+eval(BarrilSpeed));
  74. }
  75. }
  76. function Quiet () {
  77. I.Player.Action = "Quiet";
  78. I.Player.gotoAndStop(1);
  79. }
  80. // Whens:
  81. function RightWhenQuiet () {
  82. // Ver si toca algún barril:
  83. BarrilesChequeados = 1;
  84. BarrilesChequeados++;
  85. if (I.Player.hitTest(eval("I.Barril"+BarrilesChequeados)) == true) {
  86. trace("Apareció en barril");
  87. // Game over:
  88. Game = "Over";
  89. I.Player.gotoAndStop(2);
  90. }
  91. if (Game == "Ok") {
  92. Walk();
  93. } else {
  94. gotoAndStop (3);
  95. }
  96. }
  97. function RightWhenWalking () {
  98. // AumentarRecorrido();
  99. Walk();
  100. }
  101. function QuietWhenWalking () {
  102. Quiet();
  103. }
  104. // QuietWhenQuiet nada hace.
  105. function ControlPlayer () {
  106. if (Key.isDown(39)) {
  107. // Si se presiona derecha:
  108. eval("RightWhen"+I.Player.Action)();
  109. } else {
  110. // Si nada se presiona:
  111. eval("QuietWhen"+I.Player.Action)();
  112. }
  113. }
  114. // /////////////////////////////////////////////
  115. // ////////////////  Barriles  /////////////////
  116. // /////////////////////////////////////////////
  117. function MoveBarriles () {
  118. Moved = 1;
  119. Moved++;
  120. BarrilaMover = "I.Barril"+Moved;
  121. BarrilSpeed = BarrilaMover+"Speed";
  122. EvaluedBarrilSpeed = eval(BarrilSpeed);
  123. // Aplicar rozamiento:
  124. if (EvaluedBarrilSpeed>0) {
  125. EvaluedBarrilSpeed = EvaluedBarrilSpeed/1.0025;
  126. if (EvaluedBarrilSpeed<0.05) {
  127. EvaluedBarrilSpeed = 0;
  128. }
  129. set (BarrilSpeed, EvaluedBarrilSpeed);
  130. }
  131. PosicionDelBarril = getProperty(BarrilaMover, _x)+EvaluedBarrilSpeed;
  132. // Si ya no está en la pantalla:
  133. if (PosicionDelBarril>850) {
  134. // Quitarlo:
  135. removeMovieClip (BarrilaMover);
  136. } else {
  137. // Actualizar posición y girar su parte:
  138. setProperty (BarrilaMover, _x, PosicionDelBarril);
  139. Res = BarrilaMover+".Part";
  140. setProperty (Res, _rotation, getProperty(Res, _rotation)+EvaluedBarrilSpeed*2);
  141. // Si tocan al personaje y él se está moviendo:
  142. if (I.Player.hitTest(eval(BarrilaMover)) == true && I.Player.Action == "Walking") {
  143. DistanciaPlayerBarril = Math.abs(I.Player.X-PosicionDelBarril);
  144. trace("Golpeado");
  145. trace("DistanciaPlayerBarril: "+DistanciaPlayerBarril);
  146. // Game over:
  147. gotoAndStop (3);
  148. } else {
  149. // Ver si tocó al barril anterior, que está delante:
  150. BarrilAnterior = "I.Barril"+(Moved-1);
  151. if (eval(BarrilaMover).hitTest(eval(BarrilAnterior)) == true) {
  152. // Pasarle la velocidad:
  153. set (BarrilAnterior+"Speed", eval(BarrilAnterior+"Speed")+EvaluedBarrilSpeed);
  154. // Quedar sin velocidad:
  155. set (BarrilSpeed, 0);
  156. }
  157. }
  158. }
  159. }

O sea, que si empuja o no, en vez de chequearlo con hittest calculo la distancia entre el personaje y el barril, porque quiero que el personaje se mueva más o se mueva menos de acuerdo a qué tan cerca estaba el barril antes de tocarlo, y si lo hiciera con hittest tendría que mover al personaje, ver si toca, y en tal caso retrocederlo cierta cantidad, o sea cancelar parte del movimiento. Me pareció mejor de esta otra forma, calculando la distancia.

El juego dice que hay colisión en el chequeo del golpe, cuando la distancia es 27.7999999999998. Ese chequeo tiene que estar, es para ver si el personaje es golpeado desee atrás cuando los barriles se mueven (en esta versión no sucede porque es simplificada). El chequeo que falla es el de empuje, que es lógico que falle porque la distancia debe ser <26.2 según mis cálculos, que deben estar mal o no sé qué pasa.

El personaje mide
.................................+306666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
..3+02222222222222222222222222222222222222222222222222222222222222222222222222222222222220
no, eso fue porque me pareció ver una cucaracha cerca de donde tengo el mouse, me fijé y toqué teclas sin darme cuenta, han habido varias cerca, lo dejo como chiste  :laugh:

28 de ancho y está en el medio de su película.
El barril 24, lo mismo.

La línea roja, la distancia, mide 26:


Tal vez debí poner 25.8, no lo entiendo, si a 26 no se tocan pero el personaje se moverá 0.2... ¿entonces a 26 debo sumarle 0.2 o restarle? No sé, pero teniendo en cuenta que por ese movimiento es más fácil que se toquen, entonces supuse que sería 26.2, porque <26.2 es más fácil de cumplirse que 25.8.

Igual el problema no es ese ¿por qué con hittest se detecta una colisión a distancia 27.7999999999998?

Aunque parte del barril se gira, lo cual podría extender (según el criterio de Flash) el ancho del objeto barril, en esta versión no se gira, pero quito eso del código a ver. Sucedió lo mismo.

Acabo de ver que en el estado Wait, Medaman tiene ancho 30, pruebo quitarlo a ver. Lo mismo. Pensé que quizá aunque su estado e imagen fuese walking, hittest funcionaba con el ancho de la 1er imagen, pero no.


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.437


Hackentifiko!


Ver Perfil
Re: No se capta colisión ¿calculo mal la distancia?
« Respuesta #1 en: 29 Noviembre 2024, 06:21 am »

Lo que pasa es que el personaje cuando camina tiene 2 posibles imágenes y una es más ancha >___<

Visto eso y con una recomendación de GPT solucioné ese problema, además corregí un poco el código:
Código
  1. // Indica si el juego continúa o no:
  2. Game = "Ok";
  3. // Por motivos que no recuerdo, las imágenes se ponen...
  4. // en un objeto I.
  5. // Agregar personaje:
  6. I.attachMovie("sMedaMan", "Player", 1);
  7. // X es porque la posición real del personaje no admite...
  8. // tantos valores, los simplifica, se pierde parte;
  9. // de este modo no:
  10. I.Player.X = 0;
  11. I.Player._X = I.Player.X;
  12. I.Player._Y = 584;
  13. I.Player.Action = "Quiet";
  14. I.attachMovie("sBarril", "Barril2", 2);
  15. I.Barril2.X = 80;
  16. I.Barril2._X = I.Barril2.X;
  17. I.Barril2._Y = 584;
  18. LV = 1;
  19. Recorrido = 0;
  20. // /////////////////////////////////////////////
  21. // /////////////////  MedaMan  /////////////////
  22. // /////////////////////////////////////////////
  23. function AumentarRecorrido () {
  24. Recorrido++;
  25. if (Recorrido == 50) {
  26. Recorrido = 0;
  27. LV++;
  28. }
  29. }
  30. function Walk () {
  31. I.Player.Action = "Walking";
  32. I.Player.gotoAndStop(2);
  33. // Ver si empuja algún barril:
  34. I.Player.Empujar = "No";
  35. // (tal vez convenga chequear desde el último)
  36. BarrilesChequeados = 1;
  37. BarrilesChequeados++;
  38. BarrilaChequear = "I.Barril"+BarrilesChequeados;
  39. BarrilX = eval("I.Barril"+BarrilesChequeados+".X");
  40. // Si el barril existe:
  41. if (BarrilX != undefined) {
  42. DistanciaPlayerBarril = Math.abs(I.Player.X-BarrilX);
  43. trace ("DistanciaPlayerBarril: "+DistanciaPlayerBarril);
  44. // La distancia a la que se tocan depende del...
  45. // dibujo de Medaman, ya que al caminar, uno...
  46. // es más ancho. Además se agregará 0.2 porque...
  47. // es lo que se podría llegar a mover:
  48. MinDistanciaSinChoque = I.Player._width/2+14+0.2;
  49. if (DistanciaPlayerBarril<MinDistanciaSinChoque) {
  50. trace ("Empuja");
  51. I.Player.Empujar = "Sí";
  52. }
  53. }
  54. if (I.Player.Empujar == "No") {
  55. // El personaje avanza:
  56. // Hay que ver si tocaría un barril, arreglarlo.
  57. I.Player.X = I.Player.X+0.2;
  58. I.Player._X = I.Player.X;
  59. AumentarRecorrido();
  60. } else {
  61. // Determinar movimientos:
  62. // MinDistanciaSinChoque -> mov 0.2, empuje 0.
  63. // 0 -> mov 0, empuje 0.2.
  64. MovimientoDelPers = DistanciaPlayerBarril*0.2/MinDistanciaSinChoque;
  65. I.Player.X = I.Player.X+MovimientoDelPers;
  66. I.Player._X = I.Player.X;
  67. // Recorrido debe aumentar acorde a eso, arreglarlo:
  68. AumentarRecorrido();
  69. // Empuja un barril:
  70. // Esto sólo aumenta la velocidad, ojo que si no se mueve puede que quede tocando al personaje:
  71. BarrilSpeed = BarrilaChequear+".Speed";
  72. set (BarrilSpeed, eval(BarrilSpeed)+0.2-MovimientoDelPers);
  73. trace ("BarrilSpeed: "+eval(BarrilSpeed));
  74. // BarrilSpeed = BarrilaMover+"Speed";
  75. // EvaluedBarrilSpeed = eval(BarrilSpeed);
  76. }
  77. }
  78. function Quiet () {
  79. I.Player.Action = "Quiet";
  80. I.Player.gotoAndStop(1);
  81. }
  82. // Whens:
  83. function RightWhenQuiet () {
  84. // Ver si toca algún barril:
  85. BarrilesChequeados = 1;
  86. BarrilesChequeados++;
  87. if (I.Player.hitTest(eval("I.Barril"+BarrilesChequeados)) == true) {
  88. trace ("Apareció en barril");
  89. // Game over:
  90. Game = "Over";
  91. I.Player.gotoAndStop(2);
  92. }
  93. if (Game == "Ok") {
  94. Walk();
  95. } else {
  96. gotoAndStop (3);
  97. }
  98. }
  99. function RightWhenWalking () {
  100. // AumentarRecorrido();
  101. Walk();
  102. }
  103. function QuietWhenWalking () {
  104. Quiet();
  105. }
  106. // QuietWhenQuiet nada hace.
  107. function ControlPlayer () {
  108. if (Key.isDown(39)) {
  109. // Si se presiona derecha:
  110. eval("RightWhen"+I.Player.Action)();
  111. } else {
  112. // Si nada se presiona:
  113. eval("QuietWhen"+I.Player.Action)();
  114. }
  115. }
  116. // /////////////////////////////////////////////
  117. // ////////////////  Barriles  /////////////////
  118. // /////////////////////////////////////////////
  119. function MoveBarriles () {
  120. Moved = 1;
  121. Moved++;
  122. BarrilaMover = "I.Barril"+Moved;
  123. BarrilSpeed = BarrilaMover+".Speed";
  124. EvaluedBarrilSpeed = eval(BarrilSpeed);
  125. // Aplicar rozamiento:
  126. if (EvaluedBarrilSpeed>0) {
  127. EvaluedBarrilSpeed = EvaluedBarrilSpeed/1.0025;
  128. if (EvaluedBarrilSpeed<0.05) {
  129. EvaluedBarrilSpeed = 0;
  130. }
  131. set (BarrilSpeed, EvaluedBarrilSpeed);
  132. }
  133. BarrilX = eval(BarrilaMover+".X")+EvaluedBarrilSpeed;
  134. // Si ya no está en la pantalla:
  135. if (BarrilX>850) {
  136. // Quitarlo:
  137. removeMovieClip (BarrilaMover);
  138. } else {
  139. // Actualizar posición y girar su parte:
  140. setProperty (BarrilaMover, _x, BarrilX);
  141. // Res = BarrilaMover+".Part";
  142. // setProperty (Res, _rotation, getProperty(Res, _rotation)+EvaluedBarrilSpeed*2);
  143. // Si toca al personaje y él se está moviendo:
  144. if (I.Player.hitTest(eval(BarrilaMover)) == true && I.Player.Action == "Walking") {
  145. DistanciaPlayerBarril = Math.abs(I.Player.X-BarrilX);
  146. trace ("Golpeado");
  147. trace ("DistanciaPlayerBarril: "+DistanciaPlayerBarril);
  148. // Game over:
  149. gotoAndStop (3);
  150. } else {
  151. // Ver si tocó al barril anterior, que está delante:
  152. BarrilAnterior = "I.Barril"+(Moved-1);
  153. if (eval(BarrilaMover).hitTest(eval(BarrilAnterior)) == true) {
  154. // Pasarle la velocidad:
  155. set (BarrilAnterior+"Speed", eval(BarrilAnterior+".Speed")+EvaluedBarrilSpeed);
  156. // Quedar sin velocidad:
  157. set (BarrilSpeed, 0);
  158. }
  159. }
  160. }
  161. }
  162.  

Pero aviso que ese código no sirve mucho porque cuando el barril es empujado, puede que sea tan poco (o nada) que el personaje termine tocándolo. Voy a corregirlo, espero no necesitar ayuda >__<


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Colision de 2 image [Solucionado]
Programación Visual Basic
skapunky 8 7,807 Último mensaje 4 Septiembre 2008, 14:52 pm
por cobein
Cálculo real de distancia de routers o equipos conectados al mismo.
Redes
sanganchao 4 10,259 Último mensaje 6 Octubre 2012, 04:17 am
por narciso
conexión inalambrica a distancia a distancia
Hacking Wireless
MAXIMUS33 2 3,101 Último mensaje 22 Agosto 2013, 16:15 pm
por MAXIMUS33
[SFML] Rebote de colisión « 1 2 »
Programación C/C++
DeMoNcRaZy 13 7,798 Último mensaje 3 Julio 2015, 17:40 pm
por Maurice_Lupin
Programa calculo de distancia y pendiente entre dos puntos
Programación C/C++
Davorso 0 2,731 Último mensaje 2 Octubre 2019, 19:52 pm
por Davorso
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines