我想知道是否有人可以让我开始如何使用openGL构建迷宫。我是否需要编写代码来绘制迷宫,还是像在单独的窗口中绘制图片一样?我是否需要创建一个游戏引擎以此开始?我正在为iPhone开发这样做,所以任何建议对我来说都是一个很好的开始。感谢大家的回复。如何使用openGL为iPhone开发绘制迷宫?
回答
使用地图编辑器。开始使用类似QuArK的内容。
也检查出Game Level Builder。这可能不仅仅是你要找的东西,但我想我会在这里引用它。
生成迷宫的代码应该独立于绘图。您可以尝试先在控制台中生成视觉效果,然后再使用OpenGL。
这是您可以在控制台中使用的布局类型,其中S == Start et E == End。
+=+=+=+
|S| |
+ + + +
| |E|
+-+-+-+
底层结构可能是结构的二维阵列,告诉在那里你可以从一个特定的位置在迷宫中移动:
struct {
bool Left;
bool Right;
bool Up;
bool Down;
}
立即生成迷宫,我敢肯定有很多方法可以做到这一点。一个简单的解决方案:用墙壁初始化迷宫(每个布尔值为false),然后在S和E之间建立一条可行走的路径。然后在不影响路径的情况下随机设置布尔值。
玩得开心:)
你可能甚至不需要使用OpenGL来做到这一点。约翰布莱克本有一个post,他展示了如何仅使用核心动画制作迷宫般的结构。如果这种解决方案的性能足以满足您的需求,则可以节省大量代码。
我已经完成了这项工作,而且我建议您要做的是以前所说的组合。
1)写一个能够真正创建迷宫的算法,这里有几个选项,一些非常简单的(IMHO),是Kruskal和Primm。你应该看看Here
2)如果你打算做一些精灵的工作,或者事实上移动的游戏,我会推荐使用预制的游戏引擎,只是为了保存一些工作给你。如果你想深入研究游戏引擎技术,你可以稍后再做。一个优秀的OpenSource 2D游戏引擎就是我所推荐的。
祝你好运,迷宫世代是我在几年前进入C++(然后从它:P)的方式。
一个非常简单的方法,这将让你类似德军总部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
。单元格A
和C
有三个墙壁(左上,下,A
,右上,下,B
),单元格B
有两个墙(上和下)。为了将墙标记为存在或不存在,对于每个细胞检查周围的细胞。- 如果一个单元格上面有一个
SOLID
单元格,则其“上”墙不存在。对于它的左侧单元格,右侧单元格和单元格也是如此。 - 如果一个单元格位于地图的边缘,则总是会丢失一个墙。如果它在一个角落,两堵墙总是会丢失。
- 在初始化游戏时进行此计算,而不是在渲染时进行!
- 做了这些测试之后你已经知道哪些细胞是可见的。在开始编写代码之前,先备份(希望你会使用一些像Subversion这样的版本控制系统,但即使不只是将代码复制到某个地方)和比较这两个版本的结果。它可能实际上更快 - 特别是在iPhone 3GS上 - 不要移除空的墙壁,而是使用VBO为所有墙壁使用相同的网格。
- 如果一个单元格上面有一个
- 如果添加了动态的实体,具有“临时实体”我上面提到的,你其实可以自动丢弃不可见的动态实体,一旦你必须弄清楚哪些细胞是可见的,这不是一个方法:如果单元不可见,其关联的动态实体也将不可见(但要注意:实体可以触摸多个单元格)。
- 一个非常简单但非常粗略的方法不呈现所有细胞中,是只使细胞摄像机周围,例如:
。
+-+-+-+-+-+-+-+
| |X|X|X| | | |
+-+-+-+-+-+-+-+
| |X|C|X| | | |
+-+-+-+-+-+-+-+
| |X|X|X| | | |
+-+-+-+-+-+-+-+
| | | | | | | |
+-+-+-+-+-+-+-+
(这里C是相机和X相机细胞周围的细胞 - 当然我只用这只是一次电池除了摄像头用于说明目的细胞,但你应该使用超过那就像 - 例如16个单元一样,只要确保你的地图永远不会有空白区域,可以看到超过16个单元或任何你决定的区域)
当然投射射线可能会产生更好的结果:-)。
那么,我认为这是足够的信息给你一个出发点:-)。当然,您也可以使用Stackoverflow来解决其他任何问题:-P
- 1. 在opengl中渲染迷宫
- 2. 如何绘制迷宫作为机器人?
- 3. 如何在迷宫求解应用程序中绘制“轨迹”
- 4. 如何为迷宫/迷宫/地牢建造墙壁?
- 5. 我会如何将我的3D迷宫转换为2D迷宫?
- 6. 迷宫/迷宫游戏
- 7. 在迷宫中使用BFS?
- 8. JavaScript的迷宫发电机
- 9. 构建迷宫
- 10. 国王迷宫
- 11. 迷宫不工作?
- 12. Python迷宫递归
- 13. MatLab迷宫求解
- 14. 如何使用OpenGL ES绘制NURB
- 15. 如何绘制“发光”线在OpenGL ES
- 16. 使用DFS的迷宫一代
- 17. 迷宫解决使用图表
- 18. 探索迷宫(使用python 2.7)
- 19. 使用Java创建一个迷宫
- 20. 使用递归的python迷宫
- 21. 生成迷宫使用DFS算法
- 22. WPF布局/地图/迷宫发生器
- 23. 试图制作一个迷宫
- 24. 在Python中读迷宫文件并逐行打印迷宫行
- 25. 递归迷宫算法(在迷宫中旋转件)
- 26. YUI迷宫:我如何让CSS缩小?
- 27. 如何在迷宫中追溯...?
- 28. 如何在NetLogo中创建迷宫墙?
- 29. 递归回溯迷宫发生器(开始/结束)
- 30. 反正有没有在cocos中使用.tmx文件开发迷宫游戏2d
如果您的问题是关于iphone开发的,请在问题的主体中编辑并说明;这有很大的不同。 – Ricket 2009-08-05 18:04:04