Estou com um problema com a resolução de colisão AABB.
Eu resolvo a interseção AABB resolvendo primeiro o eixo X, depois o eixo Y. Isso é feito para evitar esse bug: http://i.stack.imgur.com/NLg4j.png
O método atual funciona bem quando um objeto se move para dentro do player e ele precisa ser empurrado horizontalmente. Como você pode ver no gif, os picos horizontais empurram o player corretamente.
Quando os picos verticais se movem para o player, no entanto, o eixo X ainda é resolvido primeiro. Isso torna impossível "usar os espigões como um elevador".
Quando o jogador se move para os picos verticais (afetados pela gravidade, cai neles), ele é empurrado no eixo Y, porque não havia sobreposição no eixo X para começar.
Algo que tentei foi o método descrito na primeira resposta deste link: detecção de colisão retangular de objetos em 2D
No entanto, os picos e objetos em movimento se movem alterando sua posição, não a velocidade, e eu não calculo sua próxima posição prevista até que o método Update () seja chamado. Escusado será dizer que esta solução também não funcionou. :(
Preciso resolver a colisão da AABB de uma maneira que os dois casos descritos acima funcionem como pretendido.
Este é o meu código-fonte de colisão atual: http://pastebin.com/MiCi3nA1
Ficaria muito grato se alguém pudesse investigar isso, já que esse bug está presente no mecanismo desde o início, e tenho lutado para encontrar uma boa solução, sem nenhum sucesso. Isso está me fazendo passar noites olhando o código de colisão e me impedindo de chegar à "parte divertida" e codificando a lógica do jogo :(
Tentei implementar o mesmo sistema de colisão da demonstração do XNA AppHub para plataformas (copiando e colando a maioria das coisas). No entanto, o erro de "salto" ocorre no meu jogo, enquanto não ocorre na demonstração do AppHub. [bug saltitante: http://i.stack.imgur.com/NLg4j.png ]
Para pular, verifico se o player está "onGround" e adiciono -5 ao Velocity.Y.
Como o Velocity.X do jogador é maior que o Velocity.Y (consulte o quarto painel do diagrama), onGround é definido como true quando não deveria ser e, portanto, permite que o jogador pule no ar.
Acredito que isso não aconteça na demonstração do AppHub porque o Velocity.X do jogador nunca será maior que o Velocity.Y, mas posso estar enganado.
Eu resolvi isso antes, resolvendo primeiro o eixo X, depois o eixo Y. Mas isso estraga a colisão com os espinhos, como afirmei acima.