【问题标题】:LibGDX Touch Box2D BodyLibGDX Touch Box2D 身体
【发布时间】:2013-09-30 10:34:37
【问题描述】:

我正在使用 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;
}

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

【问题讨论】:

  • 您将 hitbody 指定为空。但是在这里您要删除身体,您还应该编写代码以删除身体您可以在此处编辑的内容是在修饰中使用 world.destroyBody(hitbody)。然后初始化 hitbody = null。此外,如果这给您带来 JNI 错误,那么这意味着在世界的步骤循环中删除了主体。你应该防止这种情况发生。
  • 这里的命中正文是用户点击的正文。所以你可以用那个身体做任何事情。
  • 如果hitbody是body我怎么调用QueryCallback回调方法??
  • 你能编辑我上面的代码,显示我应该如何做吗?
  • 查看我的编辑。你会找到 world.queryAABB(..) 方法,它会在 reportFixture() 中给你一个回调,告诉你触摸了哪个夹具。如果需要,我之前提供的链接还将帮助您使用 mouseJoint 移动身体。

标签: android box2d libgdx


【解决方案1】:

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;
}
.....

【讨论】:

  • 知道了!最后。谢谢大家的帮助!!
  • 你真的帮了我大忙!
【解决方案2】:

要删除主体并确保在步骤循环中不会发生这种情况,请使用列表并将所有要删除的主体添加到其中,然后在步骤循环之后迭代列表中的所有主体并调用 world.destroyBody (身体)。

所以代码应该是这样的:

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

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

【讨论】:

  • 感谢您的回答,但“hitbody”从何而来??
  • 哦,你说“现在我只是不确定如何移除被点击的身体..”我以为你解决了如何检测被触摸的身体的问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多