我正在编写一个球类游戏,希望球不会跳两次或在没有接触地面的情况下跳起来。
我使用了
问题在于,
以下是
我不知道这为什么会发生,也不确定这是否是最好的做法。
我使用了
ContactListener
中的方法beginContact()
和endContact()
来检测球是否碰到地面。我实现了一个状态(FLYING
或LANDED
),并在beginContact()
方法中将球的状态设置为LANDED
,然后在endContact()
方法中将其重置为FLYING
。在施加跳跃力之前,我会检查该状态。问题在于,
jump()
方法在主渲染循环中被调用,而box2D有时会花费两个循环迭代才调用endContact()
方法。因此,在box2D模拟与地面接触结束之前,jump()
方法会被调用两次。以下是
ContactListener
的一部分代码(这不是libGDX的ContactListener
,而是直接调用这些方法,将对象传递给它所碰撞的对象):@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
我不知道这为什么会发生,也不确定这是否是最好的做法。