2013-09-30 76 views
2

我正在使用LibGDX創建一個新項目。LibGDX Touch Box2D Body

我想要做的是,我從一個tmx文件加載到正常工作的水平的身體。身體也有他們的精靈。

問題是,我想讓用戶觸摸場景中的某些物體。當他們觸摸身體時,他們將能夠從場景中刪除或刪除它。

我不熟悉在libgdx中做這樣的事情。雖然我確定它並不那麼複雜。

無論如何,我可以在LibGDX中做到這一點?

編輯:

這是我到目前爲止。

QueryCallback callback = new QueryCallback() { 


    @Override 
    public boolean reportFixture(Fixture fixture) { 
     // if the hit fixture's body is the ground body 
     // we ignore it 

     // if the hit point is inside the fixture of the body 
     // we report it 

     hitBody = fixture.getBody(); 

     return true; 
    } 
}; 

@Override 
public boolean touchUp(int screenX, int screenY, int pointer, int button) { 
    // TODO Auto-generated method stub 
    hitBody = null; 


    return false; 
} 

現在,我只是不知道我怎麼刪除被點擊的身體..

+0

你正在分配hitbody爲空。但在這裏你要刪除身體,你還應該編寫代碼來刪除身體,你可以在這裏編輯是touchup使用world.destroyBody(hitbody)。然後初始化hitbody = null。如果這給你JNI錯誤,那麼它意味着身體在世界的步驟週期中被移除。你應該防止這種情況。 –

+0

此外,點擊身體是用戶點擊的身體。所以你可以用這個機構做任何事情。 –

+0

所以,如果如果如果身體是如何調用QueryCallback回調方法? –

回答

5

https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/Box2DTest.java 使用此鏈接使用queryAABB選擇與接觸點的對象。此代碼還提供瞭如何使用鼠標連接移動對象。如果你想刪除對象,確保你在世界的步驟循環後刪除它們。

編輯:

.... 
public boolean touchDown (int x, int y, int pointer, int newParam) { 
     testPoint.set(x, y, 0); 
     camera.unproject(testPoint); 
     hitBody = null; 
     world.QueryAABB(callback, testPoint.x - 0.1f, testPoint.y - 0.1f, testPoint.x + 0.1f, testPoint.y + 0.1f); 

     return false; 
} 
..... 
+0

看看我的編輯! –

+0

明白了!最後。感謝球員的所有幫助! –

+0

你真的幫我出去了! – Markus

1

能清除體內,並確保這不會在步驟cyrcle發生使用列表和添加到它所有你要刪除的身體和你的步伐cyrcle後itterate所有的列表中的實體並調用world.destroyBody(body)。

因此,代碼應該是這樣的:

Array<Body> bodies=new Array<Body>(); 
Vector3 temp=new Vector3();; 
List<Body> bodiesToRemove=new ArrayList<Body>(); 
@Override 
public boolean touchUp(int screenX, int screenY, int pointer, int button) { 
    world.getBox2dWorld().getBodies(bodies); 
    temp.set(screenX, screenY, 0); 
    camera.unproject(temp); 
    for(Body body:bodies){ 
     if(temp.dst(Vector.vector.set(body.getPosition().x, body.getPosition().y)</*width or height of the body*/){ 
      bodiesToRemove.add(body); 
     } 
    } 
    return false; 
} 

public void update(){ 
    //The world.step(..) code here 

    for(Body body:bodiesToRemove){ 
     world.destroyBody(body); 
    } 
} 

我並沒有真正嘗試過的代碼,但它應該工作。

+0

感謝您的回答,但「hitbody」來自哪裏? –

+0

哦,你說「現在我只是不知道我是如何刪除被點擊的身體..」,我想你解決了如何檢測已被觸摸的身體的問題... – SteveL

+0

@ coder_For_Life22,檢查我的編輯 – SteveL