Учитывая, что я знаю изометрическую координату алмазной карты, как мне определить, какая плитка была нажата? - PullRequest
2 голосов
/ 07 января 2011

Мой движок плиток идет вперед.Он может рисовать квадратные, шестиугольные и изометрические ступенчатые точки обзора.Где я борюсь, так это с изометрической повернутой (или ромбовидной) точкой зрения.Ниже приведено изображение карты 10х10 с бриллиантами и (упрощенный) код, используемый для ее построения.Плитки имеют размер 128x64.

http://garrypettet.com/images/forum_images/5%20col%20x%205%20rows.png

for row = 0 to rowLimit

  for column = 0 to columnLimit

    x = column * (TileWidth/2) + (row * (TileWidth/2)) + Origin.X
    y = (column * (TileHeight/2)) - (row * (TileHeight/2)) + Origin.Y

    // Draw the tile's image
    buffer.Graphics.DrawPicture(Tiles(column, row).Image, x, y)

  next column

next row

// Draw the buffer to the canvas
g.DrawPicture(buffer, 0, 0)

Я знаю, что это будет рисовать содержимое всех плиток (), а не только те, которые видны на экране, но я пытаюсьчтобы сначала получить основы.

То, что я не могу понять, - это простой способ преобразования координат x, y на карте в столбец мозаики, координаты строки.Я попытался повернуть вспять:

x = column * (TileWidth/2) + (row * (TileWidth/2)) + Origin.X
y = (column * (TileHeight/2)) - (row * (TileHeight/2)) + Origin.Y

Чтобы вычислить столбец и строку, заданные x и y, и придумал следующее:

column = ((x/2) - (Origin.X/2) + y + Origin.Y) / TileHeight
row = ((x/2) - (Origin.X/2) - y - Origin.Y) / TileHeight

Но, похоже, это не работает.Кто-нибудь может придумать лучший способ сделать это?Есть ли лучший способ превратить сетку прямоугольников в ромб и обратно (учитывая, что я очень мало знаю о матрицах ....).

Спасибо,

1 Ответ

2 голосов
/ 07 января 2011

Я не уверен, что смогу проследить детали вашей проблемы, но если вы просто хотите решить свои формулы для x и y в терминах column и row, то

column=(x + y - (Origin.X + Origin.Y))/TileWidth
row = (x - y - (Origin.X - Origin.Y))/TileHeight

Самый простой способ получить эти выражения - сначала добавить выражения для x и y и решить для column, затем вычесть их и найти для row.

...