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


      在这里更改之前说的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,这样导致公式最后也简洁很多。

  • 相关阅读:
    【牛客】找出单向链表中的一个节点,该节点到尾指针的距离为K
    【牛客】牛妹的礼物 (动态规划)
    【问题解决】Anaconda连不上服务器,"服务器正在启动,请稍等",报错信息:ImportError: cannot import name 'create_prompt_application'
    将一个数组的各元素插入到链表中,并以升序排列
    链式队列的相关操作
    循环队列的基本操作
    栈的相关操作
    双链表的基本操作
    单链表的相关操作
    顺序表的相关操作
  • 原文地址:https://www.cnblogs.com/pains/p/1541753.html
Copyright © 2020-2023  润新知