Question: I was curious if someone could explain to me from a programming perspective what makes bunny hopping possible. What techniques, shortcuts or approaches are being used by the physics engine that seem to universally result in bunny hopping being possible in a game unless it is somehow specifically prevented.

Thanks!

Answer: 
Spencer - I'm assuming you're talking about the fact that in many games where when you start bunny hopping, it picks up speed / momentum. I'm assuming that because it's the corner case where I usually hear to it referred to as bunny hopping - not simply jumping over and over.

In the events where bunny hopping picks up speed there can be a few causes and only one is needed for the effect - some physics engines translate the forward+downward angle of the fall when it comes to a sudden stop (because you're back in contact with the surface) in to some additional forward speed - possibly above and beyond that which is normally the max.

In some, the speed doesn't change, but the speed is uncapped during the downward momentum, meaning that if you're bunny hopping down inclines, you can exceed your maximum normal speed and then the game allows you to continue that speed for brief durations thereafter.

Still in others, the thrust force of a jump includes additional forward velocity - effectively the "jump" is more than adding upward direction (lifting you off the ground) but both forward and up.

Or any number of these can be in play.

Finally, for those games which bunny hopping results in faster and faster speed the more you do it, the physics engine recognizes that you're over the speed limit, but instead of placing a hard ceiling, it applies a slowing force to slow you back down to the limit - however, most of those engines do not apply that force while you're in the air - which is why your speed comes to a quick stop if you miss hops, but continues like crazy if you just keep hopping.

Here's hoping this is the descriptive answer you were looking for. Let me know if you wanted something else.
Assuming you speak of a 2D game like Super Mario:

Treat the x and the y axis seperately and use one variable for friction.

```
hop() {
    xSpeed *= friction;
    ySpeed *= -friction;
}

move() {
    x += xSpeed;
    y += ySpeed;
}

```

`hop()` should be called everytime you hit a horizontal wall, `move()` every frame.