LibGDX:使用触摸移动相机

5
我使用 LibGDX 创建了一个2D的Android游戏,并使用正交摄像机在世界中移动。
为了移动摄像机,玩家需要触摸并拖动屏幕。因此,如果您触摸屏幕并向右拖动,则摄像机应该向左移动。就像在画廊中移动缩放图片的部分一样。希望您能明白我的意思。
以下是代码:
public class CameraTestMain extends ApplicationAdapter {

    SpriteBatch batch;
    Texture img;
    OrthographicCamera camera;

    @Override
    public void create () {
        batch = new SpriteBatch();
        img = new Texture("badlogic.jpg");
        camera = new OrthographicCamera(1280, 720);
        camera.update();
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        handleInput();
        camera.update();

        batch.setProjectionMatrix(camera.combined);

        batch.begin();
        batch.draw(img, 0, 0);
        batch.end();
    }

    public void handleInput() {

        // That is my problem

    }

}

我不知道在handleInput()方法中该写什么。我知道有一个名为InputProcessor的接口,其中包含方法touchDragged(int x, int y, int pointer)可以处理触摸拖动,但我不知道如何使用它。
感谢您的建议和帮助。
2个回答

18

这个问题很老了,但正如Sierox所说,被接受的答案会将相机飞出去,所以这里有另一个解决方案。

Gdx.input.getDeltaX()会返回当前指针位置和X轴上最后一个指针位置之间的差异。

Gdx.input.getDeltaY()会返回当前指针位置和Y轴上最后一个指针位置之间的差异。

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
    float x = Gdx.input.getDeltaX();
    float y = Gdx.input.getDeltaY();

    camera.translate(-x,y);
    return true;
}

2

InputProcessor是一个接口,它允许您定义在执行某些操作(例如触摸屏幕)时要执行的操作。

因此,第一件事是在您的类中实现该接口:

    public class CameraTestMain extends ApplicationAdapter implements InputProcessor

create() 方法中,通过调用以下代码将该类设置为输入处理器:

    //create() method
    Gdx.input.setInputProcessor(this);

第二个方法是实现 touchDragged 方法。请注意,它的 x y 参数只是相对于上一个指针位置,所以要获取指针的实际位置,您应该在 touchDown 方法中将其保存在某个全局变量中。当然,在这里您不需要绝对指针位置,因为您可以只 修改相机位置而不是设置此位置。

    //touchDragged method
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        camera.position.set(camera.position.x + screenX, camera.position.y + screenY);

记得在render()方法的开头调用camera.update()

要获取更多信息,请查看此教程


@erik4thewinners 如果这个答案对你有帮助,请接受它并考虑点赞,因为我认为这是一个好的答案。 - Madmenyo
screenX和screenY参数是绝对值。 - Winter
2
这个答案是错误的,因为 camera.position.set(camera.position.x + screenX, camera.position.y + screenY); 会使相机飞走,因为 screenX 和 screenY 返回鼠标在屏幕上的位置...应该使用某种“X 轴变化”代替 screenX,并对 Y 轴做同样的处理... - Sierox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接