Sobre colisões de caracteres com uma parede, por exemplo (usarei alguns valores arbitrários como exemplo): se você estiver a 10 unidades (por exemplo, pixels) de uma parede, e um único passo normalmente o moveria 20 unidades nessa direção, o O comportamento correto é que seu personagem mova 10 unidades e pare por aí. Se você cancelou a ação, você permaneceria a 10 unidades da parede, o que não é o que você deseja.
Uma maneira de fazer isso é mover o personagem pela quantidade total, depois detectar a colisão e sua profundidade, ou seja, quanto as caixas delimitadoras do personagem e da parede estão sobrepostas, e mover o personagem de volta nessa mesma quantidade. Se você fizer isso corretamente, você não deve ter nenhum comportamento de "jiggle" do seu personagem, ele simplesmente pressiona a parede e para por aí. Se ele estiver balançando, provavelmente você o está movendo de volta demais (provavelmente você está movendo-o de volta para a posição que ele estava antes da colisão, em vez de prendê-lo contra o limite da parede).
Dito isto, normalmente vejo a gravidade sendo tratada como um caso especial. Na maioria das implementações que vi, o personagem armazena uma onFloor
bandeira e a gravidade é aplicada apenas quando essa bandeira é falsa.
Edit: Eu acho que você poderia expandir esse último conceito e criar sinalizadores adicionais como touchingRightWall
or touchingLeftWall
, mas apenas quando os limites do personagem e da parede corresponderem exatamente . Nesse caso, talvez você possa ignorar completamente o movimento. Porém, se os limites não corresponderem com precisão, você deve permitir que o movimento ocorra e o sistema de detecção de colisão resolva quaisquer interseções.