2d到等距公式

时间:2014-10-24 20:42:21

标签: actionscript-3 2d isometric cartesian

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);
    }

这是用于绘制等距的2d点的函数:

//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);
    }

我可以使用什么公式来恢复单击图块时收到的坐标,返回2d /访问地图数组?

1 个答案:

答案 0 :(得分:0)

从屏幕坐标向等长方向的转换与您自己的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的图块来说是完美的像素:

isometric cursor movement

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

这里有一个小小的奇怪之处:我的图像下半部分的黑色空间是#34;负x&#34;,当输入时,光标需要进一步调整等距x位置的+1 。这是因为在C [*] 中,默认情况下,整数被舍入&#34;朝向零&#34;。使用浮动和floor使它工作;但一般来说,你应该努力使用整数进行频繁计算,例如这些。 (另外,我不认为负x或y位置在常规瓷砖地图中有效。)

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

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

tiley
<64>在进行64分割之前。