2014-10-07 3 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}, 
     }; 

Мы загружаем карту циклическую через массив выше, и при добавлении их к LinkedList (через handler.addObject()) хранить их х и у значений и типа плитки, а также их ширины и высоты.

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

И, наконец, наша плитка 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); 
    } 
+0

Является ли смещение расстоянием от стороны зрения до первой плитки? Вы пробовали вычитать смещение от значения x? – Jason

+0

Да, смещение - это расстояние слева (offsetX) и верхнее (offsetY) окна. – bwoogie

+0

Какие значения вы используете для смещений? – Jason

ответ

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)/(двойной) tileH) - 0,5); int hty = (int) (((double) (offsetY - y)/(double) tileH) - ((double) (offsetX - x)/(double) tileW) + 0.5); – bwoogie

+0

Это было основано на тестировании в Excel (и оно работает в Excel), используя ваш образ для координат. Мне нужно знать, находится ли ваше происхождение (0,0) в верхнем левом углу. Кроме того, каковы фактические значения для offsetX и offsetY. – Jason

+0

Серая плитка на картинке (0, 0). offsetX и offsetY являются произвольными. Они начинаются с 0, пока мы не перетаскиваем карту с помощью мыши. Плитки возвращают те же значения до и после смещения, что означает изменение смещения, не влияет непосредственно на координаты плитки, а только их буквальные на значения x/y экрана. – bwoogie

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); 
Смежные вопросы