Hola comunidad, he estado haciendo un programa para poder detectar el angulo de colisión que posee el piso, osea con una pendiente distinta de 0, y se me ocurrió hacerlo con 2 puntos, y que a través de ellos, se puede calcular el angulo de inclinación, la detección me ha salido bien hasta ahora, solo en superficies apartadas de los bordes, pero intenté ahora afectar el movimiento a través de la superficie, ocupando las funciones seno y coseno, pero me ocurre un error que no lo logro entender, cuando el angulo de inclinación cambia constantemente durante el movimiento, el objeto tiende a aumentar su posición Y, qué es lo que me recomendarían ustedes para poder mejorar en el código?

les dejo lo que he estado haciendo.
muchas gracias por leer.
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D

Encuentro que es una buena forma de detectar el angulo, pero ahora como reparar el bug que se forma, al mover el objeto, cuando el angulo cambia, por ejemplo de 0 a 45 grados, y lo muevo con las teclas izuierda y derecha muchas veces, el movimiento vertical se va aumentando poco a poco, no se el por qué, ya que lo que hago es esto:

El movimiento lo realizo con las funciones del seno y del coseno:

x   +=  cos(degtorad(angulo))*vel_x;
y   -=  sin(degtorad(angulo))*vel_x;


cuando presiono la tecla de la derecha, vel_x > 0, y el angulo va desde 0 hasta los 90, y desde los 270 hasta los 360, por lo que el coseno siempre va a ser positivo. y pasa lo contrario si vel_x < 0.

y en el movimiento vertical, pasa algo similar, si vel_x > 0; si el angulo es 45, Y se ira disminuyendo, y si es 315, Y irá aumentando. 
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D

Lo unico que puedo decir es que puedes reemplazar
[gml]
x   +=  cos(degtorad(angulo))*vel_x;
y   -=  sin(degtorad(angulo))*vel_x;
[/gml]
por:
[gml]
lengthdir_x(len,dir) //Returns the horizontal x-component of the vector determined by the indicated length and direction.
lengthdir_y(len,dir) //Returns the vertical y-component of the vector determined by the indicated length and direction.
[/gml]
No entiendo bien cual es el bug
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

Parece que no me he explicado bien, el movimiento en si debería funcionar, pero cuando se produce un cambio de angulo, el movimiento en el eje vertical tiende a afectarse, y no se mueve de la manera mas precisa.

Cuando presiono la tecla izquierda

si el angulo cambia de 45 a 0 grados, el movimiento vertical tiende a aumentar (osea el objeto se va un poco mas abajo).
si el angulo cambia de 315 a 0 grados, el movimiento vertical tiende a disminuir (osea el objeto se va un poco mas arriba).

Cuando presiono la tecla derecha

si el angulo cambia de 45 a 0 grados, el movimiento vertical tiende a disminuir.
si el angulo cambia de 315 a 0 grados, el movimiento vertical tiende a aumentar.

Esos son los bug que se me presentaron, pero desconozco su origen, no se por que se forman.

El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D

#4 Septiembre 10, 2012, 11:29:27 PM Ultima modificación: Septiembre 10, 2012, 11:54:06 PM por Maitreya
Parece ser una mala jugada de las operaciones matematicas en coma flotante del  :GM8:
por lo que veo, se trata de el redondeo involuntario de los valores de esas dos lineas de código:
[gml]
cos(degtorad(angulo))*vel_x;
sin(degtorad(angulo))*vel_x;
[/gml]
Con las funciones lengthdir pasa igual, y es mas que todo por el cambio gradual en el ángulo que se escapan varios decimales.
Si  :GM8: tuviera un debug mas al estilo de Eclipse [java] sería mas fácil verlo.
Soluciones, no se, solo veo que el problema va por ahi.

Ejemplo:
[gml]
cos(degtorad(315))*3 = 2,1213203435596425732025330863145
//una calculadora normal muestra 2,121320344 y el resultado final se puede ver afectado
//todo depende de la precision del  GM con estos numeros.
[/gml]

EDIT:
Por lo que veo,  :GM8: es bastante pobre en este aspecto, aunque en el debug muestra la cifra 2,1213203440, al imprimir con draw_text solo muestra 2.12 que estaría muy lejos del valor real.
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

Pero al analizar, el bug solo se presenta al producirse un cambio de angulo, si se analiza fisicamente el movimiento del objeto, habría alguna variable que no he tomado en cuenta para este movimiento? , porque he visto un juego de sonic hecho en game maker, y su movimiento es muy preciso, tiene como el 0.1% de error del valor original que debiera tener. tal vez no he considerado algo, me parece complicado... por lo del error de las cifras, no creo que eso afecte mucho al valor real con que el game maker trabaje, ya que el draw_text dibuja un string con decimales limitados, creo que hay una forma de como mostrar mas decimales, pero ya ese es otro tema, ademas he visto que la velocidad con que se mueve el objeto afecta mas su precisión.
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D