2009-08-04 58 views
1

我想知道是否有人可以让我开始如何使用openGL构建迷宫。我是否需要编写代码来绘制迷宫,还是像在单独的窗口中绘制图片一样?我是否需要创建一个游戏引擎以此开始?我正在为iPhone开发这样做,所以任何建议对我来说都是一个很好的开始。感谢大家的回复。如何使用openGL为iPhone开发绘制迷宫?

+0

如果您的问题是关于iphone开发的,请在问题的主体中编辑并说明;这有很大的不同。 – Ricket 2009-08-05 18:04:04

回答

1

使用地图编辑器。开始使用类似QuArK的内容。

也检查出Game Level Builder。这可能不仅仅是你要找的东西,但我想我会在这里引用它。

2

生成迷宫的代码应该独立于绘图。您可以尝试先在控制台中生成视觉效果,然后再使用OpenGL。

这是您可以在控制台中使用的布局类型,其中S == Start et E == End。

+=+=+=+ 
|S| | 
+ + + + 
| |E| 
+-+-+-+ 

底层结构可能是结构的二维阵列,告诉在那里你可以从一个特定的位置在迷宫中移动:

struct { 
    bool Left; 
    bool Right; 
    bool Up; 
    bool Down; 
} 

立即生成迷宫,我敢肯定有很多方法可以做到这一点。一个简单的解决方案:用墙壁初始化迷宫(每个布尔值为false),然后在S和E之间建立一条可行走的路径。然后在不影响路径的情况下随机设置布尔值。

玩得开心:)

0

你可能甚至不需要使用OpenGL来做到这一点。约翰布莱克本有一个post,他展示了如何仅使用核心动画制作迷宫般的结构。如果这种解决方案的性能足以满足您的需求,则可以节省大量代码。

0

我已经完成了这项工作,而且我建议您要做的是以前所说的组合。

1)写一个能够真正创建迷宫的算法,这里有几个选项,一些非常简单的(IMHO),是Kruskal和Primm。你应该看看Here

2)如果你打算做一些精灵的工作,或者事实上移动的游戏,我会推荐使用预制的游戏引擎,只是为了保存一些工作给你。如果你想深入研究游戏引擎技术,你可以稍后再做。一个优秀的OpenSource 2D游戏引擎就是我所推荐的。

祝你好运,迷宫世代是我在几年前进入C++(然后从它:P)的方式。

5

一个非常简单的方法,这将让你类似德军总部3D的一些结果(但与OpenGL的善良是容易:-P)是拥有世界等制成的二维网格:

+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 

每个单元格应该包含有关单元格的信息,例如单元格是空的还是实体的,如果它是坚实的,它具有什么样的材料,或者它是否是空的,地板和天花板有什么材料。如果它是空的,您还可以添加其他信息,如光照投射,对某个实体的引用(用于添加游戏模型或其他东西),逻辑标志(例如“退出”或“开始”或“危险”的标志)等一种简单的结构将是这样(在C):

#define SOLID 0x0001 
#define START 0x0002 
#define EXIT 0x0004 
#define HAZARD 0x0008 

struct _cell_t 
{ 
    unsigned int flags; 
    GLuint texture; 
    entity_t* entity; 
} cell_t; 

在上述结构中,flags是细胞的标志。如果设置了SOLID标志,则单元格为固定(墙壁),如果设置了标志START,则单元格为玩家的起始位置,如果设置了EXIT标志,则单元格为迷宫的退出位置,最后如果设置HAZARD这个单元对玩家造成伤害。当然,你可以在那里添加更多的标志(例如LIGHT标志可以投射光线,SECRET标志将标志着该单元标志为秘密区域的一部分,等等),但你明白了:-)。

texture字段是OpenGL ES纹理名称(由glGenTextures生成并填充了glTexImage2D)。这是用于渲染迷宫(这里我只使用一个纹理为了简单起见,但如果你想显示更有趣的世界,你应该为实体单元指定四个纹理,为空单元指定两个纹理 - 四个纹理将是每个边的纹理的细胞/墙壁,两种纹理将是细胞的地板和天花板)。

entity字段只是对实体的引用,如果你想添加实体。静态实体(如花瓶,灯,桌子等)通常由网格和材料制成。如果你想添加当然的动态实体(比如怪物,拾取物品等),你需要添加动画信息到实体结构中,并将“动态”实体列表与单元格分开,因为它们会移动因此不会“属于”一个单元格(为了优化的原因,您可能希望在每个单元格中分配一个“临时”实体,但优化是之后之后您有引擎/游戏运行)。

现在渲染迷宫,渲染所有单元格(稍后您可能需要进行一些洪水填充或光线投影测试,以仅渲染可见内容,但现在不用担心)。对于每个单元格,检查单元格的标志是否包含SOLID标志,如果是,则渲染组成单元格的四个四边形(想象一下没有顶部和底部的立方体)。如果单元格没有SOLID标记,则渲染单元格的地板和天花板的两个四边形(想象同一个立方体,但现在只有,顶部和底部只有)。如果您要渲染的单元格的字段不为空,那么也会渲染该实体。

如果你这样做,你会有一个迷宫:-)。一些优化技巧:

  • 你很快就会意识到你正在渲染许多不会被看到的四边形。如果这对速度有影响(并且在您尝试渲染可见单元格之后),则可能需要扩展包含单元格墙壁实际存在的标志的结构。例如,将这三个单元格想象成一排:ABC。单元格AC有三个墙壁(左上,下,A,右上,下,B),单元格B有两个墙(上和下)。为了将墙标记为存在或不存在,对于每个细胞检查周围的细胞。
    • 如果一个单元格上面有一个SOLID单元格,则其“上”墙不存在。对于它的左侧单元格,右侧单元格和单元格也是如此。
    • 如果一个单元格位于地图的边缘,则总是会丢失一个墙。如果它在一个角落,两堵墙总是会丢失。
    • 在初始化游戏时进行此计算,而不是在渲染时进行!
    • 做了这些测试之后你已经知道哪些细胞是可见的。在开始编写代码之前,先备份(希望你会使用一些像Subversion这样的版本控制系统,但即使不只是将代码复制到某个地方)和比较这两个版本的结果。它可能实际上更快 - 特别是在iPhone 3GS上 - 不要移除空的墙壁,而是使用VBO为所有墙壁使用相同的网格。
  • 如果添加了动态的实体,具有“临时实体”我上面提到的,你其实可以自动丢弃不可见的动态实体,一旦你必须弄清楚哪些细胞是可见的,这不是一个方法:如果单元不可见,其关联的动态实体也将不可见(但要注意:实体可以触摸多个单元格)。
  • 一个非常简单但非常粗略的方法不呈现所有细胞中,是只使细胞摄像机周围,例如:

+-+-+-+-+-+-+-+ 
| |X|X|X| | | | 
+-+-+-+-+-+-+-+ 
| |X|C|X| | | | 
+-+-+-+-+-+-+-+ 
| |X|X|X| | | | 
+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 

(这里C是相机和X相机细胞周围的细胞 - 当然我只用这只是一次电池除了摄像头用于说明目的细胞,但你应该使用超过那就像 - 例如16个单元一样,只要确保你的地图永远不会有空白区域,可以看到超过16个单元或任何你决定的区域)

当然投射射线可能会产生更好的结果:-)。

那么,我认为这是足够的信息给你一个出发点:-)。当然,您也可以使用Stackoverflow来解决其他任何问题:-P