Tengo un problema con la resolución de colisión AABB.
Resuelvo la intersección AABB resolviendo primero el eje X, luego el eje Y. Esto se hace para evitar este error: http://i.stack.imgur.com/NLg4j.png
El método actual funciona bien cuando un objeto se mueve hacia el jugador y el jugador tiene que ser empujado horizontalmente. Como puede ver en el .gif, los picos horizontales empujan al jugador correctamente.
Sin embargo, cuando las puntas verticales se mueven hacia el jugador, el eje X todavía se resuelve primero. Esto hace que "usar los picos como un ascensor" sea imposible.
Cuando el jugador se mueve hacia los picos verticales (afectados por la gravedad, cae dentro de ellos), es empujado en el eje Y, porque para empezar no hubo solapamiento en el eje X.
Algo que probé fue el método descrito en la primera respuesta de este enlace: detección de colisión de objetos rectangulares 2D
Sin embargo, los picos y los objetos en movimiento se mueven al cambiar su posición, no a la velocidad, y no calculo su próxima posición predicha hasta que se llama a su método Update (). No hace falta decir que esta solución tampoco funcionó. :(
Necesito resolver la colisión AABB de una manera que los dos casos descritos anteriormente funcionen según lo previsto.
Este es mi código fuente de colisión actual: http://pastebin.com/MiCi3nA1
Estaría realmente agradecido si alguien pudiera investigar esto, ya que este error ha estado presente en el motor desde el principio, y he estado luchando por encontrar una buena solución, sin ningún éxito. Esto realmente me hace pasar noches mirando el código de colisión y me impide llegar a la "parte divertida" y codificar la lógica del juego :(
Intenté implementar el mismo sistema de colisión que en la demostración de plataformas XNA AppHub (copiando y pegando la mayoría de las cosas). Sin embargo, el error de "salto" ocurre en mi juego, mientras que no ocurre en la demostración de AppHub. [error de salto: http://i.stack.imgur.com/NLg4j.png ]
Para saltar compruebo si el jugador está "en tierra", luego agrego -5 a Velocity.Y.
Dado que Velocity.X del jugador es más alto que Velocity.Y (consulte el cuarto panel en el diagrama), onGround se establece en verdadero cuando no debería ser, y así permite que el jugador salte en el aire.
Creo que esto no sucede en la demostración de AppHub porque el Velocity.X del jugador nunca será más alto que Velocity.Y, pero puedo estar equivocado.
Resolví esto antes resolviendo primero en el eje X, luego en el eje Y. Pero eso arruina la colisión con los picos como dije anteriormente.