How to 2D AABB

Hello guys!

I want to discuss the best implementation of collision-handling in a sideviewed platformer. Let us keep on topic of
AABB collisions.

Regarding handling the last step before hitting something…
…you can either calculate where to put the player, or you can calculate how big of a step is needed.
Either way, you end up with pretty much the same result.

Which of the two would you guys prefer? I’m not talking about ease of implementation, but of how well the code solves the problem. I recently implemented the first one, and it doesn’t feel good, even though it behaves the same.

Regarding the procedure of updating…
…What I’ve been doing so far, is to have different, but similar in many ways, methods for each of the different collisions:

  • Right side of character, when walking/jumping right
  • Left side of character, when walking/jumping left
  • Top border of character, when jumping and hitting something in air
  • Bottom border of character, when falling down and hitting the floor

I would have a fallUpdate(), jumpUpdate(), and walkUpdate(direction). The last one can be split into two - it’s just two if-statements judging wether the character is running right or left.

However, looking at Metagun for instance, it seems that the same one method can be used to calculate the steps, for both directions and when jumping.
That one method is also shorter than my three together.

Is there something about this? What would be the best way to handle all four collisions?

Regarding what positions to check…
How does one determine this? I would just check the four corners of a character, but when the character get’s higher than a block, you can jump up and get stuck within them. That’s possible, because you would only be checking the two corners, which aren’t colliding at all. This makes for some pretty weird bugs, and now you’re unable to have thin shapes.

I don’t believe this is the best way to handle this. What do you think? Do you know of any other ways to solve this problem?