Мне нужно найти координаты для изометрической плитки при ее нажатии. У меня это в основном выяснено. Значения 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()) хранить их х и у значений и типа плитки, а также их ширины и высоты.
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);
}
Является ли смещение расстоянием от стороны зрения до первой плитки? Вы пробовали вычитать смещение от значения x? – Jason
Да, смещение - это расстояние слева (offsetX) и верхнее (offsetY) окна. – bwoogie
Какие значения вы используете для смещений? – Jason