我想检查一个输入事件是否发生在一个体内,在我的情况下,在一个圆圈内。我正在使用的解决方案是使用mousejoint,我的代码是:
public class GameScreen extends AbstractScreen implements InputProcessor {
private OrthographicCamera camera;
private World world;
private Box2DDebugRenderer debugRenderer;
private FPSLogger fps_log;
private MouseJointDef mjd;
private MouseJoint joint;
public GameScreen() {
super();
Gdx.input.setInputProcessor(this);
camera = new OrthographicCamera(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
camera.position.set(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,0f);
camera.update();
debugRenderer = new Box2DDebugRenderer();
fps_log = new FPSLogger();
world = new World(new Vector2(0,0), false);
for(int i = 0 ; i < 20 ; i++){
Ball ball= new Ball(world);
ball.start();
ball.setTouchable(Touchable.enabled);
}
Wall wall = new Wall(world);
wall.start();
mjd = new MouseJointDef();
mjd.bodyA = world.createBody(new BodyDef());
}
@Override
public void render(float delta) {
super.render(delta);
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
fps_log.log();
debugRenderer.render(world, camera.combined);
world.step(BOX_STEP, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS);
}
private Vector3 tmp = new Vector3();
private QueryCallback query = new QueryCallback() {
@Override
public boolean reportFixture(Fixture fixture) {
if(fixture.testPoint(tmp.x,tmp.y))
mjd.bodyB = fixture.getBody();
joint = (MouseJoint) world.createJoint(mjd);
return false;
}
};
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
camera.unproject(tmp.set(screenX,screenY,0));
world.QueryAABB(query, tmp.x, tmp.y, tmp.x, tmp.y);
return false;
}
}
这就是发生的事情:
为什么呢?顺便说一句,这种方法(使用mousejoint)是否能达到我想要的效果?
答案 0 :(得分:0)
我目前无法检查代码,但AFAIK您需要将camera.unproject()
的结果分配给某个变量然后查询。目前,您正在将tmp
设置为屏幕坐标,然后将未经改变的矢量用作世界坐标。
解决方案可能是:
Vector3 worldCoords = camera.unproject(tmp.set(...));
world.QueryAABB(query, worldCoords.x, worldCoords.y, worldCoords.x, worldCoords.y);
其他一些提示:
检查相机是否正确将鼠标/屏幕坐标转换为视口坐标。如果缩放视口并且您没有考虑到这一点,那么您可能会在开始时获得错误的坐标。
我对Box2D没有经验,但总的来说,我不做AABB碰撞,而是进行光线投射(至少在3D中 - 在2D中使用正交投影,它会检查单个点)。在某些情况下,点大小的AABB(宽度和高度为0)可能会导致问题。