2

我正在使用 LibGDX 创建一个新项目。

我想做的是,我将 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;
}

现在我只是不确定如何删除被点击的身体..

4

2 回答 2

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;
}
.....
于 2013-09-30T11:40:13.487 回答
1

要删除身体并确保在步骤循环中不会发生这种情况,请使用列表并将所有要删除的身体添加到其中,然后在步骤循环之后迭代列表中的所有身体并调用 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);
    }
}

我并没有真正尝试过代码,但它应该可以工作。

于 2013-10-01T07:30:52.983 回答