如何在mousejoint中禁用此行

时间:2014-12-09 16:13:16

标签: java libgdx mouse box2d

我想检查一个输入事件是否发生在一个体内,在我的情况下,在一个圆圈内。我正在使用的解决方案是使用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;
    }
}

这就是发生的事情:

enter image description here

为什么呢?顺便说一句,这种方法(使用mousejoint)是否能达到我想要的效果?

1 个答案:

答案 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)可能会导致问题。