【问题标题】:libGDX, Box2D, collision and forbid jump in the airlibGDX,Box2D,空中碰撞和禁止跳跃
【发布时间】:2013-06-24 07:03:29
【问题描述】:

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

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

问题在于 jump() 方法在主渲染循环中被调用,而 box2D 有时会在调用 endContact() 方法之前花费两次循环迭代。所以jump()方法在box2D模拟与地板的接触结束之前被调用了两次。

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

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

【问题讨论】:

标签: java box2d libgdx collision


【解决方案1】:
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();
 }
   }

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

【讨论】:

  • 这正是他想要的......无法启动跳跃。当球触地时,他只想跳一次。只有当他离开地面并再次接触地面时才能进行下一次跳跃。
  • 对。而且如果上面有重物,他就再也不会离开地面再碰它,所以canApplyForce不会被重置为true,之后他就不能再跳跃了。这可能不是他想要的。
  • 感谢您的关心,先生,您是对的,但所有这些都取决于他想要的开发人员。在这个问题中,他希望在触地时回调一次,并且只有在再次触地时才能收到下一次回调。如果物体上有重物,他将不会收到任何回调,因为他还没有离开地面接收另一个回调,但这一切都取决于他想要的动力,他必须相应地解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多