LibGdx:鼠标位置与所选图块(世界位置)不匹配

时间:2014-11-20 19:48:30

标签: android map opengl-es libgdx tiles

我已经创建了一个六角形瓷砖地图,我在组合两个功能时遇到了问题: 1)用鼠标/手指拖动滚动地图 2)在鼠标悬停位置上突出显示一个图块

我的世界包含一个地图,它由自定义的Tile()对象组成。每个Tile都保存了x和y坐标。在我的游戏类中,我使用了OrthographicCamera和TileSelector,这是一个获取当前鼠标位置并在这些坐标下方突出显示相应图块的类。 此外,我的render()方法检查鼠标/手指是否向下,如果是,每个图块的位置都会被手指/鼠标按钮向下移动时的距离更新。

以下代码显示了相关部分。只要我不移动地图,突出显示就会起作用。但是一旦我移动了瓷砖,突出显示就会开始关闭(通过移动的距离)。

//initialiting orthographic camera
camera = new OrthographicCamera(800, 480);
camera.setToOrtho(false, 800, 480);

//draw screen black
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

camera.update();
game.batch.setProjectionMatrix(camera.combined);

//drawing to batch
game.batch.begin();

//drawing the tiles, simply getting x,y coords and putting on screen
world.render(game.batch); 

//highlighting tile under the current mouse/finger coords and drawing highlight on screen
selector.select(Gdx.input.getX(), Gdx.graphics.getHeight() - Gdx.input.getY(), game.batch, world);

game.batch.end();

//scrolling routine
if (Gdx.input.isTouched()) {
        Vector3 touchPos = new Vector3();
        touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
        camera.unproject(touchPos);

        deltaX = (float)Gdx.input.getDeltaX();
        deltaY = (float)Gdx.input.getDeltaY();

        //moving each tile by the distance moved
        for(int i = 0; i< world.getMap().getWidth(); i++){
            for(int j = 0; j< world.getMap().getHeight(); j++){
                tile = world.getMap().getTile(i, j);
                tile.x += deltaX;
                tile.y -= deltaY;
                world.getMap().setTile(tile, i, j);
        }
    }
}

查看可视化的屏幕截图:

1)地图未移动,鼠标(红色箭头)在图块上方突出显示 http://i.stack.imgur.com/3d7At.png

2)地图已移动但鼠标位于旧位置,不应突出显示任何图块,但图块会突出显示,就像地图未移动一样 http://i.stack.imgur.com/dSibc.png

现在我明白问题似乎是因为没有正确地映射/更新屏幕和世界坐标。但由于我对LibGdx / OpenGL /投影/翻译缺乏了解,我无法确定我的错误。 那么这个渲染算法可以修复吗?或者我应该从移动我的瓷砖切换到移动我的相机(如何)?如果您需要更多代码,请告诉我们,谢谢。

1 个答案:

答案 0 :(得分:1)

好吧,我能够自己找到一个解决方案,因为问题出在逻辑上而不是LibGdx API中。如果其他人在将来遇到同样的问题,我会在这里提供解决方案。

起初我按照Angel-Angel的提示开始移动相机而不是地图/世界。其次,主要的问题是,我使用鼠标/手指的屏幕坐标来进行瓷砖高亮,而不是世界坐标。

新代码:

    //scrolling routine
    if (Gdx.input.isTouched()) {
        //get mouse/finger position in screen coordinates and save in a Vector3
        touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);

        //get the distance moved by mouse/finger since last frame and translate camera to that position
        //(I have no idea yet why the x-axis is flipped)
        deltaX = (float)Gdx.input.getDeltaX();
        deltaY = (float)Gdx.input.getDeltaY();
        camera.translate(-deltaX, deltaY, 0);

        //this is the solution, the coordinates that you use for tile highlighting
        //are translated to world coordinates
        touchPos = camera.unproject(touchPos);
    }

    //update the camera position and the math that is involved
    camera.update();
    game.batch.setProjectionMatrix(camera.combined);

    game.batch.begin();
    world.render(game.batch);

    //now the highlighting routine is working with world coordinates
    selector.select(touchPos.x, touchPos.y, game.batch, world);
    game.batch.end();

我希望这将有助于将来。如果有人有兴趣我如何获得正确的瓷砖突出显示,我使用此主题中评价最高的答案中描述的方法:

Hexagonal Grids, how do you find which hexagon a point is in?

祝你好运,玩得开心!