如何在LibGDX中使用相机移动输入处理器?

时间:2017-05-14 14:42:46

标签: java android android-studio input libgdx

我最近开始在LibGDX中编写应用程序。有了这个应用程序,人们现在只能按下然后填充蓝色的框。

原则上一切正常。问题是只有当我移动正交相机或开始变焦,然后我的输入处理器仍然保持在同一个地方。 简而言之。由于相机被移动或缩放,输入无法正常工作。

我在这里有两次连接Schreenshots,所以你可以看到我的意思。 红点总是我按下的地方。

关心Timux; D. Here it works correctly

No more

1 个答案:

答案 0 :(得分:0)

移动或缩放相机时没问题,经过测试,您可以查看。 可能是您没有使用unproject()相机方法将屏幕坐标中指定的点转换为世界空间。

public class GdxText extends ApplicationAdapter implements InputProcessor {

    OrthographicCamera cam;
    Texture texture;
    Sprite firstSprite,secondSprite;
    SpriteBatch spriteBatch;
    Vector3 vector3;


    @Override
    public void create() {

        vector3=new Vector3();
        cam=new OrthographicCamera();

        texture=new Texture("badlogic.jpg");

        float w=Gdx.graphics.getWidth();
        float h=Gdx.graphics.getHeight();

        spriteBatch=new SpriteBatch();

        firstSprite=new Sprite(texture);
        firstSprite.setSize(100,100);
        firstSprite.setPosition(w/2-150,h/2-50);

        secondSprite=new Sprite(texture);
        secondSprite.setSize(100,100);
        secondSprite.setPosition(w/2+50,h/2-50);

        Gdx.input.setInputProcessor(this);
    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(1,1,1,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        spriteBatch.setProjectionMatrix(cam.combined);
        spriteBatch.begin();
        firstSprite.draw(spriteBatch);
        secondSprite.draw(spriteBatch);
        spriteBatch.end();
    }

    @Override
    public void resize(int width, int height) {

        cam.setToOrtho(false,width,height);
        cam.update();
    }

    @Override
    public boolean keyDown(int keycode) {

        if(keycode== Input.Keys.UP) {
            cam.zoom -= cam.zoom * .1;
            cam.update();
        }else if(keycode==Input.Keys.DOWN) {
            cam.zoom += cam.zoom * .1;
            cam.update();
        }

        if(keycode== Input.Keys.LEFT) {
           cam.position.add(2f,0,0);

            cam.update();
        }else if(keycode==Input.Keys.RIGHT) {
            cam.position.add(-2f,0,0);
            cam.update();
        }

        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {

        vector3.set(screenX,screenY,0);
        Vector3 ori=cam.unproject(vector3);
        if(firstSprite.getBoundingRectangle().contains(ori.x,ori.y))
            System.out.println("Touch on First Sprite");

        if(secondSprite.getBoundingRectangle().contains(ori.x,ori.y))
            System.out.println("Touch on Second Sprite");

        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
        return false;
    }

    @Override
    public void dispose() {
        spriteBatch.dispose();
        texture.dispose();
    }
}