45度斜角地图菱形坐标转换

    xiaoxiao2021-12-12  4

    我们要做一个45度游戏地图中,那么如何判断鼠标点中了哪一个碎片呢??如图:   也许你想到通过解两个直线方程(点斜式):   不过这是个笨办法,那么有更简单的办法吗? 开门见山: *********************************** N=int(x/TileW - y/TileH) M=int(x/TileW + y/TileH) *********************************** N,M是碎片的索引,从0开始。 TileW,TileH是碎片的长宽。 x,y是鼠标坐标,但是注意坐标系原点。 以上过程如下图演示:   那么,是什么原理呢? 我们建立一个新的坐标系。以花体字的u,v为新的基向量。   然后把鼠标坐标(注意原点!)(x,y)转换成基于新的基集t={u,v}的展开式:   使用的时候很简单 公式是 N=int(x/TileW - y/TileH) M=int(x/TileW + y/TileH) ------------------------------------------------------------------------------------------------------------ 下面说的是45度地图,地图坐标系在顶端的格子计算方法

    关于45度角地图中像素坐标和地图坐标之间的转换,网上有各种方法,其实坐标转换就是计算tite宽和tile高在像素坐标中的偏移值,本方法是针对 tite块原点坐标在菱形的顶点的位置的坐标转换,在45度角地图中,方块形状为菱形,你可以用flash cs工具或其他绘图工具很快的创建出这种菱形方块,按以下3个步骤就可以了: 1、 绘制一个任意大小的正方形; 2、 把这个正方形旋转45度; 3、 把旋转的正方形的高度缩放为原来的50%。 还有一点就是方块尺寸的问题,菱形方块的宽度是高度的2倍,其次方块尺寸比例应该是2:1。例如64像素X 32像素或100像素 X 50像素等,这样的尺寸刚好能使方块在地图铺设的时候很好地排列在屏幕上。 至于坐标间的转换其实大家看图就好理解了:

    图中是一个以红色(0,0)位置为原点,红点每向地图坐标系M轴上移动一个单位,原点相对像素坐标系X中的偏移值为:方块宽度/2 菱形方块宽 var tileW :Number; 菱形方块高 var tileH :Number; 地图的行数 var row :int; 地图的列数 var col :int; 红色原点坐标(像素坐标系) var originP : Point; 那么红色的原点坐标在地图坐标系中的位置为: originP.x = row * tileW /2; originP.y = 0; 原点坐标出来了,那么其它点的坐标呢? 思路是先求出在地图坐标系下(M方向或N方向)每移动一个单位的像素坐标系X轴和像素坐标系Y轴的像素偏移值。 如红色原点移动到黑色点的位置: M在像素坐标系X轴的偏移像素 = tileW /2;(向右偏移) M在像素坐标系Y轴的偏移像素 = tileH /2; (向下偏移) N在像素坐标系X轴的偏移像素 = - tileW /2;(向左偏移) N在像素坐标系Y轴的偏移像素 = tileH /2; (向下偏移) 假如有个地图坐标点(M,N),那么它对应的像素坐标系的点为var p:Point p.x = 原点坐标X + M在像素坐标系X轴的偏移像素 × M + N在像素坐标系X轴的偏移像素 × N = originP.x + tileW /2 × M + (-tileW/2) × N = originP.x + (M – N) × tileW/2; p.y = 原点坐标Y + M在像素坐标系Y轴的偏移像素 × M + N在像素坐标系Y轴的偏移像素 × N = originP.y + tileH/2 × M + tileH/2 × N = originP.y + (M + N) × tileH/2;

    /

    那么如何把直角坐标转X,Y换成菱形格子坐标M,N呢

    M=(p.x-originP.x)/tileW  +  (p.y-originP.y)/tileH  

    N=(p.y-originP.y)/tileH  -  (p.x-originP.x)/tileW

    转载请注明原文地址: https://ju.6miu.com/read-900155.html

    最新回复(0)