加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:29:28 所属栏目:百科 来源:网络整理
导读:我们要做一个45度游戏地图中,那么如何判断鼠标点中了哪一个碎片呢??如图: ? 也许你想到通过解两个直线方程(点斜式): ? 不过这是个笨办法,那么有更简单的办法吗? 开门见山: *********************************** N=int(x/TileW - y/TileH) M=int(x/
我们要做一个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}的展开式:


使用的时候很简单
公式是
  1. N=int(x/TileW - y/TileH)
  2. 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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读