【问题标题】:Drawing a hex grid in Flash?在 Flash 中绘制十六进制网格?
【发布时间】:2009-11-20 22:01:05
【问题描述】:

用算法绘制六角网格的最简单方法是什么?我应该如何在数据中呈现它们?

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

【问题讨论】:

  • 十六进制坐标,当然! :P

标签: flash actionscript-3 algorithm hexagonal-tiles


【解决方案1】:

所以hexagon is a neat library 对于 AS3 游戏,它有一些六边形类,可能在您的研究中很方便。 This article 有一些关于 Flash 中六边形图块的非常好的细节。

【讨论】:

    【解决方案2】:

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

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

    对于廉价座位,极坐标将一个点绘制为原点(如标准 x-y 笛卡尔图),选择一个向量作为基线(如笛卡尔),然后将点指定为(幅度、度数)。

    十六进制地图真正击中本垒打的地方在于,每个纯角度都是 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(optional) = some string(我喜欢将其设为人类可读的值),Name = 0(Magnitude 和 Vector 的串联),以及Exits = Array(您将填充 6 个节点,不包括虫洞或其他)。 以您选择作为地图中心的像素为中心绘制原点。 渲染十六进制。 为您的地图选择半径

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

    希望对某人有所帮助。十六进制地图摇滚。渲染它们有点糟糕。

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2018-07-26
      • 2011-06-01
      • 2014-08-24
      相关资源
      最近更新 更多