【问题标题】:2d to Isometric formula2d 到等距公式
【发布时间】:2014-10-24 20:42:21
【问题描述】:

tileWidth 是 64,tileHeight 是 32。

这是我的地图数组:

var map:Array=
    [
        [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
        [2,3,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2],
        [2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2],
        [2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2],
        [2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
    ];

这是它们的放置方式:

//place tiles
        for (var i:Number = 0; i < map.length; i++)
        {
            for (var j:Number = 0; j < map[i].length; j++)
            {
                placeTile(map[i][j],i,j);
            }
        }

//place the tile based on coordinates
    private function placeTile(id:uint,i:uint,j:uint)
    {
        var pos:Point=new Point();
        pos.x = i;
        pos.y = j;
        pos = twoDToIso(pos);

        tile = new MovieClip(atlas.getTextures(getTile(id)),20);
        tile.x = pos.x ;
        //tile.y = pos.y + (map.length/2)*tileHeight - tileHeight*4 ;//used to center
        tile.y = pos.y;
        tile.addEventListener(TouchEvent.TOUCH, mapDown);
        mapContainer.addChild(tile);
    }

这是用于将二维点绘制成等距的函数:

//CONVERT POINT TO ISOMETRIC
    private function twoDToIso(pt:Point):Point
    {
        trace(" ");
        trace("twoDtoIso:");
        trace("2d: " + pt);
        var tempPt:Point = new Point(0,0);

        tempPt.x = (pt.x * tileWidth / 2) + (pt.y * tileWidth / 2);
        tempPt.y =  (pt.y * tileHeight / 2) - (pt.x * tileHeight / 2);


        trace("iso: " + tempPt);
        return (tempPt);
    }

我可以使用什么公式将单击图块时收到的坐标恢复为二维/访问地图数组?

【问题讨论】:

  • 更正您的标签。 “iso”与它无关。 “笛卡尔”与“等距”有点相反。您忘记了 (any) 语言标签。最后,你有什么尝试吗?
  • 我尝试了很多。语言不是必需的,因为它只是一个公式。如果我可以从数组索引中检索等轴测坐标,那么我应该能够通过单击访问数组来恢复获得的坐标。 tempPt.x=Math.floor(pt.x/tileHeight); tempPt.y=Math.floor(pt.y/tileHeight);这似乎只在屏幕本身是网格时才有效,而不是等距放置的瓷砖。

标签: actionscript-3 2d isometric cartesian


【解决方案1】:

从屏幕坐标到等轴测坐标的转换是您自己的倒数twoDToIso:对于 x 轴上的每 2 个像素,您从 y 轴上减去 1,因此相反,您对整个屏幕上的像素执行相同的操作y 轴。 (希望和我想的一样清楚。)

但是,计算的符号取决于地图的设置方式:x 轴对角线向上向右,或向下向右(并且,可能对 y 也是如此)。我用对角线向上图进行了测试,y 计数到右下角:

             +x
          ..
       2,0   ..
   1,0   2,1    ..
0,0   1,1   2,2    ..
   0,1   1,2   ..
      0,2   ..
         ..+y

如果您的地图以不同的方式绘制,请交换 x,y 计算的符号(也可能为常数 32)。

鼠标坐标mx,my到等轴坐标tilex,tiley的转换如下:

int tilex = mx - 2*my + 32;
int tiley = mx + 2*my - 32;

tilex /= 64;
tiley /= 64;

drawcursor (tilex, tiley);

对于 128x64 的图块来说是完美的像素:

将鼠标光标向下移动一个像素将选择蓝色所选图块右侧和下方的空白区域。

这里有一个小奇怪:我的图像下半部分的黑色空间是“负 x”,当输入它时,光标需要进一步调整 +1 以用于等距 x 位置。这是因为在 C[*] 中,默认情况下,整数会“朝零”四舍五入。使用浮点数和floor 使它工作;但一般来说,您应该努力使用整数来进行诸如此类的频繁计算。 (另外,我认为负的 x 或 y 位置在常规瓦片地图中无效。)

[*] 我用 C 和 SDL 编写了我的测试程序。

如果您希望能够在每个图块内选择单个像素(例如,如果您想选择图块的某个四分之一),您可以使用tilex 的小数部分和tiley

innerx = tilex & 63;
innery = tiley & 63;

在除以 64 之前。

【讨论】:

  • 看起来很有意义,但我真的无法让这个东西工作,这让我很沮丧。我正在使用带有八哥/闪光的羽毛。出于某种原因,我不能在 scrollContainer 中放置具有负值的对象,所以我给每个 y 值增加了 512(这使 40 瓦长的地图在屏幕上居中)。我假设这就是给我不稳定的价值观的原因。但是我在计算之前调整了512。 [0,0,0] [0,1,0] [0,0,1] 这将按照我的地图绘制方式向下和向右绘制 1 个图块。
  • 嗯 .. 将您的 y 位置调整 512 应该 不会产生影响(在进行计算之前从鼠标 y 位置减去 512)。正如我已经指出的那样,问题可能在于地图的方向。我将我的左右移动以从后向前绘制。
  • 好的,感谢您的详细回复。我会重新做一遍,重新开始,希望能成功。
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多