【问题标题】:Isometric screen to map issue等距屏幕映射问题
【发布时间】:2012-02-27 18:55:30
【问题描述】:

我知道关于等轴测地图的很多建议,但我已经阅读了大部分建议,但并没有解决我的问题。 为了更简单,我为 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;            
}

主要问题是如何在鼠标下获得瓷砖哪个公式对我有用。

【问题讨论】:

    标签: c# tiles isometric


    【解决方案1】:

    由于这个问题尚未得到解答,而且它是此处“等距屏幕”的最佳结果之一,我想我会回答这个问题(更不用说我刚刚完成了这个问题)。

    由于您有一个从 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 的浮点值,但既然你是在 android 上运行它,我想这并不重要。

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多