现在的位置: 首页 > 综合 > 正文

AS3 RPG游戏引擎开发日志3:地图坐标转换

2013年05月20日 ⁄ 综合 ⁄ 共 1269字 ⁄ 字号 评论关闭

  在这里更改之前说的45度角坐标转换的问题,地图仍然不变,但地图坐标和游戏坐标的关系改变了,它的对应关系如下图:

  其中虚线表示地图的边缘,区块中标的数是数组的索引,即地图坐标。地图的高度用大写的H表示,区块的高度用小写的h表示,区块的宽度等于高度的两倍。

  • 显示坐标转换成地图坐标

  假设一个点(下图中的A点)的显示坐标为(x,y),地图坐标为(i,j),显示坐标转换成地图坐标就是要在已知x和y的情况下求i和j。

  i的值等于AB的长除菱形区块的边长取整,AB=AF+BF,△ADF是一个直角边比为1:2的直角三角形,其中直角边AD=x,因此AF=√5—x2。△FBK是BF=BK等腰三角形,且底边上的高等于底边FK,FK=GE,GE=AE-AG,AG=x/2,因此BF=√52(y-x/2)。最后

i=(AF+BF)/(√5—h2)=[√5—x2+
√52(y-x/2)]/√5—h2=(y+x/2)/h。

  对j的值求解则要分两种情况,即上图中的A点和O点,确定条件分别是x/2<H-h和x/2>=H-h。

  在A点,j等于AC的长除菱形区块的边长取整,AC=AH+HC,HC=HI=AJ,AJ可以通过i的值求出。AH=√5—x2,AJ=菱形区块的边长-(AB-菱形区块的边长×i)=

√5—h2-[√5—x2+ √52(y-x/2)]+√5—hi2

这是可以得出j=(x/2-y)/h+i+1。

  在O点,同上面的道理一样,区别是求PQ,PQ=OS,最后计算的结果是j=(2H+x/2-y)/h-i。

结论:
        i=(y+x/2)/h
        j=(x/2-y)/h+i+1    当x/2<H-h时
        j=(2H+x/2-y)/h-i    当x/2>=H-h时

  • 地图坐标转换成显示坐标

  此时要将上图中的(6,7)转换成Z点到地图左边缘和上边缘的像素值,这里先直接用显示坐标转换成地图坐标中的二元一次方程组求出x和y,同样分条件:

当i<H/h时:
        x=hj-h
        y=h(2i-j+1)/2
当i>=H/h时:
        x=h(2i+j)-2H
        y=H-hj/2

  以上公式是直接求解出来的,当我们用放进去计算的时候x值是正确的,但y值总是比真实值多了h/2。出现这种情况就要从对应关系上去思考,地图坐标系统中的点,比如(6,7),它实际对应于显示坐标系统中的点不是Z点,而是Z点下方h/2位置处的点,把头向左转一点来看上图,可以看到地图坐标中,点(6,7)的左上角(左上角就是坐标点)就是显示坐标中Z点下方h/2位置处,因此更正后得到转换公式:

当i<H/h时:
        x=hj-h
        y=h(2i-j)/2
当i>=H/h时:
        x=h(2i+j)-2H
        y=H-h(j+1)/2

  • 总结

  数学是很有意思的,原本以为这些公式会与地图倾斜的角度有关,但计算后根号5这个值不存在了,不过这样说也不完全对,因为菱形区块的高宽比正好是1比2,这样导致公式最后也简洁很多。

抱歉!评论已关闭.