Godot-StartUP

创建于:2018-07-28

创建人: Justus

44 信息 154 成员
讨论基于Godot以及Unity引擎的游戏开发经验,理论和最佳实践。共享一些通用思路以启发另一种生产工具中的实践。独立开发群QQ: 122017359

6边形网格地图,格子间的距离计算

logoss 2018-11-01

Image title

这样一个6边形网格地图,有没有公式计算两个格子间的距离呢?

比如(0,0)走到(1,1)需要走几步,我们看图可以发现走两步就行了,但是有公式可以计算就更好了。

下面跟群里的小伙伴讨论之后的出的结果。

我们需要借助三维坐标

Image title

像这样的坐标体系,有x,y,z三个维度,x,y,z的和始终是0,我们称之为cube坐标,距离计算公式是

distance=(abs(cubePos1.x-cubePos2.x)+abs(cubePos1.y-cubePos2.y)+abs(cubePos1.z-cubePos2.z))/2

或者

diatance=max(cubePos1.x-cubePos2.x)+abs(cubePos1.y-cubePos2.y)+abs(cubePos1.z-cubePos2.z))

上面两个公式都能算出距离,至于具体原理我就不懂了,反正可以这么用


然后要做的就是把二维坐标转成三维坐标

其实很简单

我们原来的坐标是这样的

0,0 --- 1,0 --- 2,0 --- 3,0
--- 0,1 --- 1,1 --- 2,1 --- 2,2
0,2 --- 1,2 --- 2,2 --- 3,2
--- 0,3 --- 1,3 --- 2,3 --- 3,3

如果调整成这样

0,0 --- 1,0 --- 2,0 --- 3,0
--- 0,1 --- 1,1 --- 2,1 --- 3,1
--- --- 0,2 --- 1,2 --- 2,2 --- 3,2
--- --- --- 0,3 --- 1,3 --- 2,3 --- 3,3

这样二维中的x,y就对应了三维中的x,y。至于三维的z,因为x,y,z的和始终是0,只要z=-x-y就行了

调整过程其实就是x=x-int(y/2)

最终我们得到二维坐标转三维坐标的函数

func getCubePosFromPos(pos):

    var x=pos.x-int(pos.y)/2

    var y=pos.y

    var z=-x-y

    return Vector3(x,y,z)

计算距离的函数

func posDistance(pos1,pos2):
    var cubePos1=getCubePosFromPos(pos1)
    var cubePos2=getCubePosFromPos(pos2)
    var distance=(abs(cubePos1.x-cubePos2.x)+abs(cubePos1.y-cubePos2.y)+abs(cubePos1.z-cubePos2.z))/          2
    return distance

把这个公式放到游戏中试验下

Image title

黑色小圆圈里的数字表示这个格子到主角的距离,计算很准确


顺便说下从三维坐标转回到二维坐标的算法

func getPosFromCubePos(cubePos):
    var y=cubePos.y
    var x=cubePos.x+int(y)/2
    return Vector2(x,y)


参考资料

https://www.redblobgames.com/grids/hexagons/

(转发自:原日志地址

近期喜欢的会员

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册