2013-06-26 29 views
2

我正在編程一個球類比賽,我希望球不能跳兩下,也不要跳到與地板接觸的地方。libGDX,Box2D,碰撞並禁止在空中跳躍

我使用的方法beginContact()ContactListenerendContact()爲當球被觸摸地板檢測。我實現了一個狀態(FLYINGLANDED),並在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

如果在允許再次跳躍之前超時說0.2秒或什麼的話。 – iforce2d

+2

來自ifroce2d的解決方案:https://www.iforce2d.net/b2dtut/jumpability – Pavel

回答

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

我認爲這應該可以解決您的問題。

+0

這樣做的缺點是,如果跳躍嘗試不會將玩家與地面分開(例如,如果重物位於其上),則canApplyForce將不會重置爲true。 – iforce2d

+0

那正是他想要的......跳躍無法啓動。當球接觸地面時他只想跳一次。 只有當他離開地面並再次觸摸它時才能進行下一次跳躍。 –

+0

對。如果頂部有重物,他將永遠不會離開地面並再次觸碰它,所以AppApplyForce不會重置爲真,並且在此之後他將不能再跳。這可能不是他想要的。 – iforce2d