如何正确检查 libgdx 中平铺实现中平铺的位置

问题描述 投票:0回答:1

我正在使用 libgdx 创建一个超级马里奥克隆,并且我已经在平铺中创建了一个平铺地图。我之前没有使用过 libgdx,所以我不太确定它是如何工作的,但是当我将图块地图添加到屏幕上时,图块地图非常小,所以我缩放了相机。我编写了一个脚本来获取屏幕坐标,并根据图块坐标检查它们,看看我的鼠标是否悬停在图块上,但轮廓图块向右偏移了一堆并且向上偏移太多。我真的不知道如何从这里开始,其他在线资源也没有帮助。任何想法将不胜感激!

    public void create() {
        map = new TmxMapLoader().load("1-1.tmx");

        camera = new OrthographicCamera();
        camera.setToOrtho(false, Gdx.graphics.getWidth() * 2, Gdx.graphics.getHeight() * 2);
        camera.position.set(220, 138, 0);
        camera.zoom = 0.129f;

        renderer = new OrthogonalTiledMapRenderer(map);
    private void debugTileUnderMouse(float worldX, float worldY, int tileX, int tileY, int tileWidth, int tileHeight) {
        ShapeRenderer shapeRenderer = new ShapeRenderer();
        shapeRenderer.setProjectionMatrix(camera.combined);
        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);

        shapeRenderer.setColor(0, 1, 0, 1);
        shapeRenderer.rect(tileX * tileWidth, tileY * tileHeight, tileWidth, tileHeight);

        shapeRenderer.setColor(1, 0, 0, 1);
        shapeRenderer.circle(worldX, worldY, 5);

        shapeRenderer.end();
        shapeRenderer.dispose();
    }

    private void checkTileUnderMouse() {
        Vector3 mousePos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
        Vector3 worldPos = camera.unproject(mousePos);

        int tileWidth = map.getProperties().get("tilewidth", Integer.class);
        int tileHeight = map.getProperties().get("tileheight", Integer.class);


        int tileX = (int) (worldPos.x / tileWidth);
        int tileY = (int) (worldPos.y / tileHeight);

        TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
        TiledMapTileLayer.Cell cell = layer.getCell(tileX, tileY);

        if (cell != null) {
            TiledMapTile tile = cell.getTile();
            if (tile != null) {
                System.out.println("Mouse is over tile at (" + tileX + ", " + tileY + "), Tile ID: " + tile.getId());
            }
        }
        debugTileUnderMouse(worldPos.x, worldPos.y, tileX, tileY, tileWidth, tileHeight);
    }

The tile is offset and 3 to the right

悬停的图块发生偏移且向右 3

如果还有什么我可以提供帮助,请告诉我

java libgdx tiled
1个回答
0
投票

int tileX = (int) (worldPos.x / tileWidth);
一个问题是这种转换会丢失小数信息。如果您的图块宽度为 4,并且未投影的坐标为 6f,则 6f/4 将变为 1 而不是 2(因为 float 1.5 在 int 转换中变为 1)。 所以你需要将tileWidth/2添加到worldPos.x来解决这个问题,即

int tileX = (int) ((worldPos.x+(tileWidth/2)) / tileWidth);

那么与此相关,我想一定存在一些方向问题。就像你的 x=4 一样,但说 x=1 可能是关于 y 轴的。实际上 y=1,但通过上面的修复,y=2,这将是正确的第二个平铺。

© www.soinside.com 2019 - 2024. All rights reserved.