https://www.redblobgames.com/grids/hexagons/
我有这个漂亮的六边形图案,我需要以某种方式在java中实现它。我已经有一个代表一个六边形的“Tile”类和一个用于每个Tile坐标的“Vector”类。每个Tile对象都有自己的向量。
现在我只想将所有图块添加到列表中。但要做到这一点,我需要创建所有37个。这就是我现在被困住的地方。我当然可以手工创建所有内容,但这不仅乏味且容易出错,而且也不是很优雅。
你们中的任何人都可以告诉我能做些什么吗? :)
答案 0 :(得分:1)
我认为您需要做的第一件事就是连接您的瓷砖。给他们六个参考,每个潜在邻居一个 - 西北,东北,东,东南,西南和西。然后,给定任何图块,您可以轻松遍历其所有邻居。在您创建Tile
个对象图表后,请为其分配Vector
个实例。
假设每个Vector
的{{1}}是唯一的,下一步是创建一个函数,将每个Tile
个实例映射到笛卡尔坐标。此时,您可以绘制点数,看看您是否将瓷砖放在屏幕上的正确空间中。
根据您发布的链接判断,听起来您正在尝试制作某种游戏(这很酷!)。如果是这种情况,那么在Vector
功能正常工作后,您还有两件事要做:
渲染六角形瓷砖"正确",而不仅仅是点或方块。
创建反向vector2Cart()
方法,该方法采用笛卡尔坐标并返回与占据屏幕该部分的cartToVector()
对应的Vector。这样您就可以点击屏幕并对Tile
。
答案 1 :(得分:0)
要构建网格,请利用几何/对称性。根据深度来考虑网格,其中中心是深度0,并且每个连续层具有增加的深度。上面的网格深度= 3 每个级别都有与其深度相关的恒定属性(每个级别有6个边,每边的长度与深度成正比)。
以下代码将有助于构建网格:
public class HexagonGrid {
public static void main(String[] args) {
int size = 3;
buildHexagonGrid(size);
}
private static void buildHexagonGrid(int size) {
int totalTiles = 0;
int depth = 0;
// TODO: Build the center tile here
totalTiles++; // Center
System.out.printf("Current size (after depth=%d) = %d\n", depth, totalTiles);
for (depth=1; depth<=size; depth++) {
for (int side=1; side<=6; side++) {
for (int tile=1; tile<=depth; tile++)
// TODO: Build the Tiles along current side/depth
// There is a clear relationship between x/y/z and depth/side/tile
totalTiles++;
}
System.out.printf("Current size (after depth=%d) = %d\n", depth, totalTiles);
}
}
}
显示每层创建的图块数量:
Current size (after depth=0) = 1
Current size (after depth=1) = 7
Current size (after depth=2) = 19
Current size (after depth=3) = 37