libgdx - 检查身体是否接触

时间:2015-08-01 17:24:53

标签: java android libgdx touch box2d

屏幕周围有一些实体(Ball[] balls),我想在用户触摸它们时删除它们。

另外,我有Image作为正文的用户数据。

我不想为所有Image创建一个函数,因为必须按顺序删除球。

检测身体是否触摸的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

我知道至少有两种方法可以用来实现这一目标。

方法1: 如果您使用的是Box2D。

在touchDown功能中,您可以使用以下内容:

    Vector3 point;
    Body bodyThatWasHit;

    @Override
    public boolean touchDown (int x, int y, int pointer, int newParam) {

        point.set(x, y, 0); // Translate to world coordinates.

        // Ask the world for bodies within the bounding box.
        bodyThatWasHit = null;
        world.QueryAABB(callback, point.x - someOffset, point.y - someOffset, point.x + someOffset, point.y + someOffset);

        if(bodyThatWasHit != null) {
            // Do something with the body
        }

        return false;
    }

QueryAABB函数中的QueryCallback可以像这样重写:

QueryCallback callback = new QueryCallback() {
    @Override
    public boolean reportFixture (Fixture fixture) {
        if (fixture.testPoint(point.x, point.y)) {
            bodyThatWasHit = fixture.getBody();
            return false;
        } else
            return true;
    }
};

因此,总而言之,您使用world对象的函数QueryAABB来检查位置上的夹具。然后我们覆盖回调以从QueryCallback中的reportFixture函数获取正文。

如果您想查看此方法的实现,可以查看以下内容: https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/Box2DTest.java

方法2:

如果您正在使用Scene2D,或者您的对象以某种方式扩展了Actor并且可以使用clickListener。

如果您使用的是Scene2D和Actor类,则可以向Ball对象或图像添加clickListener。

private void addClickListener() {
    this.addListener(new ClickListener() {
        @Override
        public void clicked(InputEvent event, float x, float y) {
            wasTouched(); // Call a function in the Ball/Image object.
        }
    });
}

答案 1 :(得分:0)

我发现这是一个不错的解决方案:

boolean wasTouched = playerBody.getFixtureList().first().testPoint(worldTouchedPoint);
if (wasTouched) {
    //Handle touch
}