I spent time last night working on the motion of the player body in my game last night. I wanted the effect of moving him around to be that when he is grounded, he moves at a certain speed. If he jumps and is moving, he continues at that speed in the x-direction and if the player tries to move him while airborne, it's possible but the motion is minimal. I also wanted quick left / right motions if the body was on the ground.
To achieve this, I have a sensor fixture in the form of a circle on the bodies lower half. I got this idea from Mario Z.'s physics demo doing something similar. I use the contact listener and a counter to detect when the sensor is touching or not touching something. In other words, when a beginContact event occurs for the sensor, it ratchets up a counter. When an endContact event occurs, it ratchets the counter down. When the counter reaches 0, the body is considered to be airborne. This works out pretty well.
Body motion is checked every iteration and its velocity is adjusted if the user is pressing the left or right button. If the body is airborne, the amount of the velocity is reduced. If the user is not pressing a motion button and the body is grounded, it immediately stops. Else, if it is airborne, no change to the velocity is made. This is working out pretty well.
Oh yeah, the player presses a button to jump. This causes an upward impulse to be applied to the body. If the body is in the air, then the jump button is ignored. Easy peasy.
This is working out really well, but I need to do some adjustment to the friction when the character flies across the screen at a high rate (such as leaping off a high ledge). I'm going to attempt to adjust the amount of friction as a persistence from being grounded -- the first short bit after coming down from being airborne will have a low friction then friction will be increased back to normal levels. I need to play with things to see how that looks and feels.