java - OpenGL 中的编码迷宫

标签 java algorithm opengl

<分区>

目标

我的学校项目任务是用 OpenGL 制作迷宫。目前我正在考虑创建迷宫的算法,我想问你这是否是一个好方法,或者我应该以不同的方式实现它。这是我的想法,我会这样做:

算法

我的想法是,我将创建一个具有 isPresent bool 属性的 block 类。然后我将创建另一个代表 map 的类。此类将有一个二维数组,比方说 100x100。在阵列的每个架子上,我希望有一堵墙,我将 isPresent 值设置为 1。

然后我将使用 for 循环渲染墙。我会遍历数组,当 isPresent 值为 1 时,我会渲染 GL_QUAD。

问题

这只是我的想法,但是我是初学者,所以请问是否可以使用?或者您希望如何进行?

最佳答案

您的建议应该可行,甚至可以通过仅使用评论中提到的 boolean 值来改进。

但是这样做你会受到很大的限制,因为封闭的 1x1 迷宫现在实际上需要 3x3 的网格(除了中间的之外都是墙)。这是可行的,但它会让你的算法更难设计路径,而且你基本上没有机会控制壁厚(在你的情况下,它总是和空白一样厚)。

要进行一些改进,您可以使用一个类来表示最多 4 面墙的空段,其中包含 4 个 boolean 值 leftClosedrightClosedtopClosed 底部关闭。当然你可以做 float[width][height][4]。这会产生一些数据开销,但它使设计和提取墙变得非常容易。

基本绘图将是为每个段中的每面墙绘制一个矩形。由于有些是重复的,您可以只绘制所有顶墙和所有左墙。异常(exception)情况是最底部的行和最右侧的列也需要绘制底部和右侧的墙壁。 (原因是 segment[x][y].rightsegment[x+1][y].left 是同一堵墙所以最好画只是其中之一)。

一个更高级的过程是生成“路径”。您基本上可以从任何位置开始,然后继续附加顶点数据。作为伪代码,使用如下术语:

while(currentSegment != initialSegment && currentHeading != initialHeading)
    if currentSegment.blocked(currentHeading) {
        currentHeading = currentHeading.turnClockwise()
    } else {
        currentSegment = currentSegment.stepToward(currentHeading)
    }
    vertexData.appendToClockwiseHeading(currentHeading, currentSegment)
}

所以基本上你从任何地方开始,当你回到你开始的地方时你就完成了。您确实需要一个标题,就像向上移动一样,对吧……blocked 方法就像 case upwards: return topClosed 一样。顺时针转动只是改变旋转方式,就像从向上 转到向右 并再次向前迈进一样。显然可以从段和标题生成顶点数据; 向上 顺时针表示您正在绘制左侧墙。

关于java - OpenGL 中的编码迷宫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49651939/

相关文章:

java - 从 JCA 迁移到 OSGI 是个好主意吗?

java - Ubuntu MaxPermSize 上的 Torquebox 设置

java - 编写一个 java 程序,其中包含一个名为 getVowel() 的函数,该函数采用链表

algorithm - 什么软件算法将从一个大集合中选择不同的项目子集

c++ - GLFW:请求配置文件但 WGL_ARB_create_context_profile 不可用

java - 使用 netbeans 创建的 JFrame 在设计窗口中看起来不错,但在我运行它时却一团糟

algorithm - 在给定的约束条件下,我可以使用哪些算法/方法来实现一周中几天的任务调度?

c++ - 如何为 GL_SELECT 缓冲区启用深度测试?

OpenGL 计算阶段与其他阶段

java - 在 Java 中获取 TreeSet 的 headSet 的时间复杂度是多少?另外,如果我调用 headSet 方法 'n' 次怎么办?