我知道关于等距地图有很多建议,但我已经阅读了大部分建议并且没有解决我的问题。 为了更简单,我重写了C#代码(此代码将在Android平台上使用) 我需要将屏幕线连接到等长坐标上。
在这里,我使用1:2瓷砖为我64x32,我使用此代码构建钻石地图
private void drawIsoGrid(PaintEventArgs e)
{
for(int y=0;y<20;y++)
for(int x=0;x<20;x++)
{
float rx = (x - y) * (surface.Width) / 2 - globX;
float ry = (x + y) * (surface.Height) / 2 - globY;
e.Graphics.DrawImage(surface,rx,ry);
}
我还使用全局锚点来滚动我的地图 代码在这里
protected override void OnMouseMove(MouseEventArgs e)
{
mouseCoordsX = e.X;
mouseCoordsY = e.Y;
if(e.Button==MouseButtons.Left)
{
globX += prevX - e.X;
globY += prevY - e.Y;
this.Invalidate();
}
prevX = e.X;
prevY = e.Y;
}
主要问题是如何在鼠标下方获取哪个公式对我有用。
答案 0 :(得分:0)
由于这还没有得到解答,而且这是“等距屏幕”的最佳结果之一,我想我会回答这个问题(更不用说我刚完成了这个)。
由于你有一个从iso网格映射到屏幕坐标的函数,并且它是一个带逆的线性变换,我们可以向后移动以获得另一个函数。所以,让我们这样做。
我们希望从:
rx = (x - y) * (surface.Width) / 2 - globX
ry = (x + y) * (surface.Height) / 2 - globY
为:
x = <something>
y = <something>
同时解决这些问题最容易。将全局变量添加到两侧:
rx + globX = (x - y) * (surface.Width) / 2
ry + globY = (x + y) * (surface.Height) / 2
除以(surface.Width) / 2
和(surface.Height) / 2
:
(rx + globX) / (surface.Width / 2) = x - y
(ry + globY) / (surface.Height / 2) = x + y
差不多完成了,让我们将两个方程式加在一起以摆脱y
:
(rx + globX) / (surface.Width / 2) + (ry + globY) / (surface.Height / 2) = 2 * x
现在摆脱x从第二个中减去第一个等式:
(ry + globY) / (surface.Height / 2) - (rx + globX) / (surface.Width / 2) = 2 * y
将两个方程式除以2,我们暂时完成:
x = ((rx + globX) / (surface.Width / 2) + (ry + globY) / (surface.Height / 2)) / 2
y = ((ry + globY) / (surface.Height / 2) - (rx + globX) / (surface.Width / 2)) / 2
很酷,现在你有了屏幕方面的网格坐标。让我们清理一些,因为我们基本上(a / (b / c)) / c
与a / b
相同,我们可以摆脱c
,在这种情况下2
的:
x = (rx + globX) / surface.Width + (ry + globY) / surface.Height
y = (ry + globY) / surface.Height - (rx + globX) / surface.Width
因此,您应该能够编写一个取得屏幕x和y位置并返回x和y网格位置的函数。我对c#并不是很熟悉,所以我不知道它如何处理应该是int的float值,但是因为你在android上运行它,我认为它并不重要。