我正在編程一個球類比賽,我希望球不能跳兩下,也不要跳到與地板接觸的地方。libGDX,Box2D,碰撞並禁止在空中跳躍
我使用的方法beginContact()
和ContactListener
endContact()
爲當球被觸摸地板檢測。我實現了一個狀態(FLYING
或LANDED
),並在beginContact()
方法中將球狀態設置爲LANDED
,並在endContact()
方法中將其重置爲FLYING
。我在應用跳躍力之前檢查這個狀態。
問題是在主渲染循環中調用了jump()
方法,並且在調用endContact()
方法之前,box2D有時會花費兩次循環迭代。因此,在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
我不知道爲什麼會發生這種情況,如果這是最好的辦法,我也不知道。
如果在允許再次跳躍之前超時說0.2秒或什麼的話。 – iforce2d
來自ifroce2d的解決方案:https://www.iforce2d.net/b2dtut/jumpability – Pavel