2014-10-07 67 views
0

我需要找到等距瓷磚點擊時的座標。我主要了解它。 Y值正確返回,但顯然我的X公式不正確,我收到了負值。等距瓷磚揀選給出負值

附件A:

的青瓦應該是0,0,但由於某種原因,我得到-5 ... enter image description here

這裏是我的代碼。

在這裏,我們製作地圖(可能與問題無關,但這裏只是爲了展示我如何做事)。 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}, 
     }; 

我們加載地圖通過以上所述陣列循環並把它們添加到一個鏈表(經由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); 
       } 
      } 
     } 
    ... 
    } 

最後我們的瓷磚吸氣劑,其中主要問題在於在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); 
    } 
+0

偏移量是從視圖邊到第一個區塊的距離嗎?你有沒有試過從x值減去偏移量? – Jason 2014-10-07 03:30:31

+0

是的,偏移量是距窗口左側(offsetX)和頂部(offsetY)的距離。 – bwoogie 2014-10-07 03:42:08

+0

你使用什麼值作爲偏移量? – Jason 2014-10-07 03:44:31

回答

0

與Photoshop和Excel進行實驗,並假設你的原點是左上角,您的偏移量X是最左側單元格的左側,而您的偏移量Y是最左側單元格的底部:

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); 
+0

這實際上只打破了在原始代碼中工作正常的Y座標。這裏是我目前的位置(我知道它會發布醜陋的): int htx =(int)(((double)(x - offsetX)/(double)tileW)+((double)(y - offsetY) /(double)tileH) - 0.5); (double)(offsetY-y)/(double)tileH) - ((double)(offsetX-x)/(double)tileW)+0.5); – bwoogie 2014-10-07 04:49:10

+0

這是基於在Excel中測試(並且它在Excel中工作),使用您的圖像作爲座標。我需要知道你的原點(0,0)是否在左上角。另外,offsetX和offsetY的實際值是多少。 – Jason 2014-10-07 04:51:15

+0

圖片中的灰色圖塊是(0,0)。 offsetX和offsetY是任意的。他們從0開始,直到我用鼠標拖動地圖。瓷磚在調整偏移量之前和之後返回相同的值,這意味着更改偏移量不會直接影響瓷磚座標,只會影響屏幕x/y值的字面值。 – bwoogie 2014-10-07 04:58:10

0

問題是我將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);