簡體   English   中英

等距平鋪拾取為負值

[英]Isometric Tile Picking Giving Negative Values

單擊時,我需要找到等距圖塊的坐標。 我已經知道了。 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]));
        }
    }
}

我們的MouseListener

        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);
    }

使用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);

問題是我在x和y中添加了tileW * 2和tileH * 2。 那是我最初發現的例子。 評論它們將其修復,現在磁貼將返回正確的值!

//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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM