java - libGDX、Box2D、碰撞和禁止空中跳跃

标签 java box2d libgdx collision

我正在编写一个球类游戏,我希望球不能跳两次,或者不接触地板就跳。

我正在使用 ContactListener 中的方法 beginContact()endContact() 来检测球何时接触 地板。我实现了一个状态(FLYINGLANDED),并在 beginContact() 中将球状态设置为 LANDED方法,并在 endContact() 方法中将其重置为 FLYING。我在施加跳跃力之前检查此状态。

问题是在主渲染循环中调用了 jump() 方法,而 box2D 有时在调用 endContact() 方法之前花费了两次循环迭代。所以在 box2D 模拟与地板的接触结束之前调用了两次 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

我不知道为什么会这样,也不知道这是否是最好的方法。

最佳答案

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();
 }
   }

我认为这应该可以解决您的问题。

关于java - libGDX、Box2D、碰撞和禁止空中跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331961/

相关文章:

android - 在 AndEngine 中,操纵主体总是返回 NullPointerException

java - LibGDX Box2D 未渲染

android - 如何在 LibGDX 中检查互联网连接

java - 拦截每个被膨胀的 View 元素?

java - Spring Boot 中的继承 : @Autowired fields are null (need autowiring in non spring managed class - multiple instances)

cocos2d-iphone - 如何使用 cocos2d 和 box2d 像在 LIMBO 游戏中那样创造水?

java - 如何阻止玩家在空中跳跃两次?

java - libGdx getWorldHeight 返回错误值

java - 使用java获取System32文件夹位置

具有 *ANY* 标准的 Java SQL 准备语句