【问题标题】:Isometric Tile Picking Giving Negative Values等距瓷砖采摘给出负值
【发布时间】:2014-10-07 02:50:27
【问题描述】:

单击等轴测图块时,我需要找到它的坐标。我已经大致弄清楚了。 Y 值返回正确,但显然我的 X 公式不正确,我收到了负值。

展览 A:

灰色瓷砖应该是 0, 0 但由于某种原因我得到 -5...

这是我的代码。

我们在这里制作地图(可能与问题无关,但这里只是为了展示我的工作方式)。 ObjectID 只是一个存储图块类型的枚举。

ObjectID tile_map[][] = new ObjectID[][] {
                {ObjectID.Ground_Concrete, ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass},
                {ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass},
                {ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass},
                {ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass},
                {ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass, ObjectID.Ground_Grass},
        };

我们通过上面的数组循环加载地图并将它们添加到 LinkedList(通过 handler.addObject())存储它们的 x 和 y 值和图块类型,以及它们的宽度和高度。

private void loadMap(ObjectID map[][]) {
    int x = offsetX, y = offsetY;
    //int tile_width = 128, tile_height = 128;
    for(int i = 0; i < map.length; i++) {
        for(int j = map[i].length-1; j >= 0; j--) {

            handler.addObejct(new objGround(x + (j * map[i][j].getWidth() / 2) + (i * map[i][j].getWidth() / 2), y + (i * map[i][j].getBottomGroundPlane() / 2) - (j * map[i][j].getBottomGroundPlane() / 2), map[i][j]));
        }
    }
}

我们的鼠标监听器

        private class MouseListener extends MouseInputAdapter {
            public void mousePressed(MouseEvent e) {
                if(!dragging) {
                    getTileByXY(e.getX(), e.getY());
                }
            }

public void mouseDragged(MouseEvent e) {
            //System.out.println("mosue pressed");

            if(SwingUtilities.isRightMouseButton(e)) {
                if(e.getX() != mX || e.getY() != mY) {
                    dragging = true;
                    if(e.getX() < mX) {
                        offsetX -= (mX - e.getX());
                    } else {
                        offsetX += (e.getX() - mX);
                    }
                    if(e.getY() < mY) {
                        offsetY -= (mY - e.getY());
                    } else {
                        offsetY += (e.getY() - mY);
                    }

                    mX = e.getX();
                    mY = e.getY();

                    //System.out.println("ox: " + offsetX + " oy: " + offsetY);
                }
            }
        }
    ...
    }

最后是我们的 Tile Getter,主要问题在于 htx:

private void getTileByXY(int x, int y) {
        int tileW = 127;
        int tileH = 63;

        x += (tileW * 2);
        y += (tileH * 2);

        int htx = (int)(((double)(offsetX - x) / (double)tileW) + ((double)(offsetY - y) / (double)tileH) - 0.5);
        int hty = (int)(((double)(offsetY - y) / (double)tileH) - ((double)(offsetX - x) / (double)tileW) + 0.5);

        System.out.println("htx: " + htx + " hty: " + hty);
    }

【问题讨论】:

  • 偏移量是从视图一侧到第一个图块的距离吗?您是否尝试过从 x 值中减去偏移量?
  • 是的,offset是窗口左侧(offsetX)和顶部(offsetY)的距离。
  • 偏移量使用什么值?
  • 然后我会考虑从 x 中减去 offsetX,而不是反过来。我认为这就是你的负面价值观的来源。
  • 啊好吧!这使它现在从 4 开始。至少我们得到了正数……现在要弄清楚为什么它不是从零开始。

标签: java game-engine isometric


【解决方案1】:

使用 Photoshop 和 Excel 进行实验,假设您的原点位于左上角,您的 offsetX 是最左侧单元格的左侧,而您的 offsetY 是最左侧单元格的底部:

int htx = (int)(((double)(x - offsetX) / (double)tileW) - ((double)(offsetY - y) / (double)tileH) + 0.5);
int hty = (int)(((double)(offsetY - y) / (double)tileH) + ((double)(x - offsetX) / (double)tileW) - 0.5);

【讨论】:

  • 这实际上只会破坏在原始代码中正常工作的 Y 坐标。这是我目前所在的位置(我知道它会发布丑陋): int htx = (int)(((double)(x - offsetX) / (double)tileW) + ((double)(y - offsetY) / (双)tileH) - 0.5); int hty = (int)(((double)(offsetY - y) / (double)tileH) - ((double)(offsetX - x) / (double)tileW) + 0.5);
  • 这是基于在 Excel 中的测试(它在 Excel 中工作),使用您的图像作为坐标。我需要知道您的原点 (0,0) 是否在左上角。另外,offsetX 和 offsetY 的实际值是多少。
  • 图片中灰色的瓦片是(0, 0)。 offsetX 和 offsetY 是任意的。它们从 0 开始,直到我用鼠标拖动地图。在调整偏移量之前和之后,图块返回相同的值,这意味着更改偏移量不会直接影响图块坐标,只会影响它们在屏幕 x/y 值上的文字。
  • 您正在尝试在视图坐标(我假设从视图左上角的 0,0 开始)和图块之间进行映射。偏移值不是任意的 - 它们指定视图左侧与 0,0 瓦片左侧之间的距离,以及视图顶部与 0,0 瓦片底部之间的距离。我通过使用图像中的像素值在 Excel 中完成了这项工作。我建议你从这里开始。
  • 我终于搞定了!我在答案中发布了我的发现。感谢您一路上的帮助。
【解决方案2】:

问题是我将 tileW * 2 和 tileH * 2 添加到 x 和 y。那是我最初发现的例子。将它们注释掉可以修复它,现在图块返回正确的值!

//x += (tileW * 2);
//y += (tileH * 2);

int htx = (int)(((double)(x - offsetX) / (double)tileW) + ((double)(y - offsetY) / (double)tileH) - 0.5);
int hty = (int)(((double)(offsetY - y) / (double)tileH) - ((double)(offsetX - x) / (double)tileW) + 0.5);

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 2021-10-22
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多