在Flash中绘制十六进制网格?

时间:2009-11-20 22:01:05

标签: flash actionscript-3 algorithm hexagonal-tiles

在算法上绘制十六进制网格的最简单方法是什么?我该如何在数据中展示它们?

例如,在正方形网格中,我可以保存x-y坐标..

2 个答案:

答案 0 :(得分:7)

对于AS3游戏来说hexagon is a neat library,它有一些六角类可能在你的研究中很方便。 This article有一些关于Flash中六边形瓷砖的非常好的细节。

答案 1 :(得分:6)

有几种方法可以管理十六进制地图坐标,其中大多数都非直观地坚持将它们映射到x-y坐标,这对于渲染非常重要。某种形式的极坐标通常是最好的。我有一个用于管理大多数矢量计算的perl库,这是非常有用的参考点计算,如AI和其他搜索树。

http://en.wikipedia.org/wiki/Polar_coordinate_system

对于便宜的座位,极坐标绘制一个点作为原点(如标准xy笛卡尔图),选择一个矢量作为基线(如笛卡尔坐标),然后将点指定为(幅度,度)。

这真的击中了六角形地图的本垒打,每个纯角度是60度的倍数。如果为每个六边形分配一个面((a,b,d,e,f,g)并将矢量作为幅度和面,则会出现几个有用的属性。

1)每个十六进制可以表示为两个相邻矢量的和(或者第二个矢量是幅度0或单位元素的单个矢量)。例如1a + 1b = 1a1b或1b1a。无论哪种方式,它都是2个十六进制的遍历,大小为2,并指定来自原点(0,0)的唯一十六进制。 2)非相邻向量总是可以简化为应用这些规则的两个相邻向量: 2)否定:1A + 1D = 0,1B + 1E = 0,1C + 1F = 0,例如 3)组合:1A + 1C = 1B,1B + 1D = 1C,1C + 1E = 1D,1D + 1F = 1E,1E + 1A = 1F

牢记这些原则,必须穿越实际空间的导弹需要将矢量保留为较小的遍历的连接或顺序。 1A + 1A + 1C + 1C代表一种导弹,它向外移动两个六角形,然后急剧倾斜(120度)并移动两个六角形,结束它的横向只有2个六角形,但距离它的初始方向偏离60度。

然而,目标计算机或由此产生的爆炸可能只关心范围,因此使用这些规则简化这些向量可能很重要。要弄清楚任意两点之间的最短距离,只需连接矢量并简化它们。

创建十六进制地图并渲染它也很容易 创建一个Hex对象作为具有属性的原点,Magnitude = 0,Vector = NULL,Label(可选)=一些字符串(我喜欢使其成为人类可读的值),Name = 0(Magnitude和Vector的连接),以及退出=数组(您将填充6个节点,禁止虫洞或其他)。 以您选择的像素为中心绘制原点,使其成为地图的中心。 渲染十六进制。 选择地图的半径

Foreach Magnitude, ---用相邻向量的每个组合填充环。有很多方法可以做到这一点,但最简单的方法是选择一个矢量作为基础,然后在适当的方向和60度转弯的轨道上遍历Magnitude六角形。例如对于幅度3,从3E开始,然后转到3A,3B,3C,3D,3E,3F计算每个十六进制,作为最后一个经过的六边形和新的单个十六进制矢量的总和。 ---在每个这些六边形中,应用一些触发来计算中心像素相对于原​​始像素的位置并渲染十六进制

希望有人帮助。 Hex Maps摇滚。渲染它们有点糟糕。