鉴于我知道等距钻石地图坐标,如何确定点击了哪个瓷砖?

时间:2011-01-07 08:39:43

标签: math drawing tiles isometric

我的磁贴引擎即将推出。它可以绘制正方形,六边形和等距交错的视点。我正在努力的是等距旋转(或钻石)观点。下面是10x10钻石地图和用于绘制它的(简化)代码的图片。瓷砖是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)

我知道这将绘制整个Tiles()的内容,而不仅仅是屏幕上可见的内容,但我试图先了解基础知识。

我无法弄清楚的是将地图上的x,y坐标转换为tile列,行坐标的简单方法。我试图扭转:

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 个答案:

答案 0 :(得分:2)

我不确定我是否可以按照问题的详细说明进行操作,但如果您只想根据x和{{1}来解决ycolumn的公式问题然后

row

获取这些表达式的最简单方法是首先添加column=(x + y - (Origin.X + Origin.Y))/TileWidth row = (x - y - (Origin.X - Origin.Y))/TileHeight x的表达式并求解y,然后减去它们并求解column。< / p>