Conditionally eliminating one of two colliding bodies
IMHO this is perfectly fine.

if (!isPlayer(bodyA) || !isPlayer(bodyB)) {
    return;
}


This is an early return, saving you one indentation level.

    if (save(bodyB)) return;
    markForDestroy(bodyB);


This is not as good. Here, I'd go for

    if (!save(bodyB)) markForDestroy(bodyB);


Note that braces should be used around single statements as well, i.e.,

    if (!save(bodyB)) {
        markForDestroy(bodyB);
    }



  But doing maybe this practice reduces the code readability.


No, used wisely it helps readability. When reading top down, you know that both bodies are players. In an if-block you know this too, but the indentation may get excessive. Moreover, using the early return makes clear that only players are dealt with.



As stated in the comments, processContact would be a much better name. A method called processContactBetweenPlayers could be extracted (not needed now as it's rather short). Such a method should use something like

checkArgument(isPlayer(bodyA) &amp;&amp; isPlayer(bodyB));


in case it's public, otherwise I'd recommend

assert isPlayer(bodyA) &amp;&amp; isPlayer(bodyB);


While asserts are often frowned upon, this is exactly what they're good for.