我正在使用libgdx开发一款2D视频游戏。当我试图把跳跃变成一个身体时,我遇到了一个问题。它在向右移动后并没有像预期的那样跳跃。(我只能向右移动或跳跃)
如果身体在向右移动之前跳跃,一切都会好起来。但是,如果我决定在身体向右移动后进行跳跃。身体不再跳到相同的高度(跳得不那么高)。我不明白为什么。。
我跳体的方法:
if (player.isPlayerOnGround()) {
body.applyForceToCenter(0, 200, true);
}
我的方法移动身体右侧
if (player.isPlayerOnGround()) {
body.setLinearDamping(0f);
body.setLinearVelocity(1f,0f);
isMoving = true;
}
我阻止身体向右移动的方法:
body.setLinearDamping(5f);
isMoving = false;
世界使用-9.81f的重力,物体使用1f的质量。
对不起,我英语不好,这不是我的母语。
谢谢。
第一件事:永远不要用力跳跃。根据力作用的时间长短,力有不同的效果。第二:不要使用linearDamping。它让你的物理变得漂浮而不真实。在跳跃法中,你可以用冲动代替力量(实际上效果不太好)。我正在使用这种方法,它非常适合
public void jump() {
if (jumpDelta >= Constants.PLAYER_JUMP_RATE) {
grounded = level.getContactListener().numFootContacts > 0;
if (grounded) {
body.setLinearVelocity(body.getLinearVelocity().x, 7);
jumpDelta = 0;
}
}
}
当if (jumpDelta >= Constants.PLAYER_JUMP_RATE)
防止跳得太快(比如一次跳两次或两次以上)时,grounded = level.getContactListener().numFootContacts > 0;
会检查玩家是否在平台上,最后body.setLinearVelocity(body.getLinearVelocity().x, 7);
会改变身体的垂直速度。改变速度比施加脉冲效果更好,因为脉冲不会设定速度,它会增加速度。所以,如果玩家以垂直速度-3米/秒向下移动,那么它的速度将变成4,而不是我们想要的7。
p.S.我使用这种方法而不是线性阻尼
public void stopMoving() {
if (grounded) {
if (Math.abs(body.getLinearVelocity().x) <= 0.5f)
body.setLinearVelocity(0, body.getLinearVelocity().y);
else
body.applyLinearImpulse(-direction * 0.5f, 0,
body.getPosition().x, body.getPosition().y, true);
} else if (Math.abs(body.getLinearVelocity().x) <= 0.1f)
body.setLinearVelocity(0, body.getLinearVelocity().y);
else
body.applyLinearImpulse(-direction * 0.1f, 0, body.getPosition().x,
body.getPosition().y, true);
}
这个方法看起来太复杂了,但实际上很简单。第一部分处理身体在地面上的运动,第二部分处理在空中的运动。if语句阻止在停止时更改身体的方向,如果身体向右移动,direction
变量可以为1,如果身体向左移动,则为-1,如果身体不移动,则可以为0。