libgdx - 检查 body 是否被触摸
libgdx - Check if body is touch
屏幕周围有一些物体(Ball[] balls
),我想在用户触摸它们时删除它们。
此外,我有一个 Image
作为主体的用户数据。
我不想给大家做一个功能Image
,因为球要按顺序删除
检测 body 是否触摸的最佳方法是什么?
我知道至少有两种方法可以用来完成此任务。
方法一:
如果您使用的是 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;
}
};
因此,总而言之,您使用世界对象的函数 QueryAABB 来检查某个位置上的夹具。然后我们覆盖回调以从 QueryCallback 中的 reportFixture 函数获取主体。
如果你想看到这个方法的实现,你可以看看这个:
https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/Box2DTest.java
方法二:
如果您正在使用 Scene2D 或者您的对象以某种方式扩展了 Actor 并且可以使用 clickListener。
如果您使用的是 Scene2D 和 Actor,则可以将 clickListener 添加到 Ball 对象或图像 class。
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.
}
});
}
我发现这是一个不错的解决方案:
boolean wasTouched = playerBody.getFixtureList().first().testPoint(worldTouchedPoint);
if (wasTouched) {
//Handle touch
}
屏幕周围有一些物体(Ball[] balls
),我想在用户触摸它们时删除它们。
此外,我有一个 Image
作为主体的用户数据。
我不想给大家做一个功能Image
,因为球要按顺序删除
检测 body 是否触摸的最佳方法是什么?
我知道至少有两种方法可以用来完成此任务。
方法一: 如果您使用的是 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;
}
};
因此,总而言之,您使用世界对象的函数 QueryAABB 来检查某个位置上的夹具。然后我们覆盖回调以从 QueryCallback 中的 reportFixture 函数获取主体。
如果你想看到这个方法的实现,你可以看看这个: https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/Box2DTest.java
方法二:
如果您正在使用 Scene2D 或者您的对象以某种方式扩展了 Actor 并且可以使用 clickListener。
如果您使用的是 Scene2D 和 Actor,则可以将 clickListener 添加到 Ball 对象或图像 class。
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.
}
});
}
我发现这是一个不错的解决方案:
boolean wasTouched = playerBody.getFixtureList().first().testPoint(worldTouchedPoint);
if (wasTouched) {
//Handle touch
}