libGDX,Box2D,碰撞并禁止空中跳跃

时间:2013-06-26 23:10:13

标签: java box2d libgdx collision

我正在编写一个球类游戏,我希望球不能跳两次,或者在没有接触地板的情况下跳球。

我正在使用beginContact()中的endContact()ContactListener方法来检测球触及的时间。我实施了一个州(FLYINGLANDED),我在LANDED方法中将球状态设置为beginContact(),并将其重置为FLYING中的endContact() {1}}方法。我在施加跳跃力之前检查了这个状态。

问题是在主渲染循环中调用jump()方法,而box2D有时在调用endContact()方法之前花费两次循环迭代。因此,{box}之前模拟与地板的联系已经结束,jump()方法被调用两次。

ContactListener的部分代码(这不是libGDX的ContactListener,但方法beginContact()endContact()直接调用这些方法,传递对象碰撞了):​​

@Override
public void beginContact(Contact contact, Object objetB) {
    if(objetB instanceof Floor){
        System.out.println("Begin");
        ball.floorBeginContact(contact);
    }
}

@Override
public void endContact(Contact contact, Object objetB) {
    if(objetB instanceof Floor){
        System.out.println("End");
        ball.floorEndContact(contact);
    }       
}

Actor的部分代码:

public void floorBeginContact(Contact contact){
    state = State.LANDED;
}

public void floorEndContact(Contact contact){
    state = State.FLYING;
}

private void jump(){
    if(state == State.LANDED){
        body.applyForceToCenter(0f, 30f);
        System.out.println(i++ + " - Jump!");
    }
}

public void act(float delta){
    ...

    if(Gdx.input.isKeyPressed(Keys.SPACE)){
        jump();
    }
}

控制台输出是这样的:

Begin
0 - Jump!
1 - Jump!
End
Begin
2 - Jump!
End

我不知道为什么会发生这种情况,如果这是最好的方法,也不知道。

1 个答案:

答案 0 :(得分:2)

public void floorBeginContact(Contact contact){
state = State.LANDED;
 canApplyForce = true;
}

public void floorEndContact(Contact contact){
state = State.FLYING;
}

boolean canApplyForce = true;

private void jump(){
if(state == State.LANDED){
    if(canApplyForce)
    body.applyForceToCenter(0f, 30f);
   canApplyForce = false;
    System.out.println(i++ + " - Jump!");
}
}

public void act(float delta){
...

if(Gdx.input.isKeyPressed(Keys.SPACE)){
    jump();
 }
   }

我认为这可以解决你的问题。