OpenGL编码迷宫[关闭]

问题描述 投票:0回答:1

目标

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

算法

我的想法是,我会创建一个具有isPresent bool属性的块类。然后我会创建另一个代表地图的类。这个类有一个二维数组,比方说100x100。在阵列的每个架子上,我想要有一个墙,我会将isPresent值设置为1。

然后我会使用for循环渲染墙。我会通过数组,isPresent值为1,我会渲染GL_QUAD。

这只是我的想法,但我是初学者,所以请你告诉我它是否可用?或者你想怎么做?

java algorithm opengl
1个回答
1
投票

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

但是这样做会非常有限,因为封闭的1x1迷宫现在实际上需要3x3网格(所有都是墙,但是中间的)。它是可行的,但它会使你的算法设计路径更难,你基本上没有机会控制壁厚(在你的情况下,它总是像空的空间一样厚)。

为了获得一点改进,你可以拥有一个代表一个空段的类,其中最多有4个墙有4个布尔值leftClosedrightClosedtopClosedbottomClosed。当然你可以做float[width][height][4]。这会产生一些数据开销,但它使设计和提取墙壁变得非常容易。

基本绘图将是为每个段中的每个墙绘制一个矩形。由于有些是重复的,因此您只能绘制所有顶部和所有左侧墙壁。例外的是,最底部的行和最右边的列也需要绘制底部和右侧墙壁。 (原因是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。顺时针转动只是改变旋转,就像你从upwards转到right,前进一步很简单。顶点数据显然可以从段和标题生成;顺时针方向的upwards意味着你正在画左墙。

© www.soinside.com 2019 - 2024. All rights reserved.