如何使用openGL绘制迷宫进行iphone开发?

Zee*_*aja 0 iphone xcode objective-c iphone-sdk-3.0

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

Bad*_*tor 5

一个非常简单的方法,它将获得类似于Wolfenstein 3D的一些结果(但是使用OpenGL的优点容易:-P)是让世界由2D网格组成,如:

+-+-+-+-+-+-+-+
| | | | | | | |
+-+-+-+-+-+-+-+
| | | | | | | |
+-+-+-+-+-+-+-+
| | | | | | | |
+-+-+-+-+-+-+-+
| | | | | | | |
+-+-+-+-+-+-+-+
Run Code Online (Sandbox Code Playgroud)

每个单元格应该包含有关单元格的信息,例如单元格是空的还是实体的,如果单元格是实心的,它有什么样的材料,或者它是否为空,地板和天花板有什么材料.如果它是空的,你还可以添加其他信息,例如光投射,对某些实体的引用(用于添加游戏模型或其他东西),逻辑标记(例如"退出"或"开始"或"危险"的标记)等.一个简单的结构就像(在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;
Run Code Online (Sandbox Code Playgroud)

在上面的结构中,flags是单元格的标志.如果SOLID设置了标志,则单元格为实体(墙),如果START设置了标志,则单元格是玩家的起始位置,如果EXIT设置了标志,则单元格是迷宫的退出位置,最后如果HAZARD设置了,则单元格会导致损坏给玩家.当然你可以在那里添加更多的旗帜(比如LIGHT投射灯光的SECRET旗帜,标志着细胞作为秘密区域的一部分的旗帜等),但你明白了:-).

texture字段是OpenGL ES纹理名称(使用glGenTextures并填充glTexImage2D).这用于渲染迷宫(这里我只使用单个纹理以简化,但如果你想展示更多有趣的世界,你应该为固体单元格指定四个纹理,为空单元格指定两个纹理 - 四个纹理将是每一面的纹理一个细胞/墙壁和两个纹理将是细胞的地板和天花板).

entity如果要添加实体,该字段只是对实体的引用.静态实体(如花瓶,灯,桌子等)通常由网格和材料制成.如果您想要添加动态实体(例如怪物,拾取项目等),您需要将动画信息添加到实体结构中,并将"动态"实体列表与单元格分开,因为这些实体会移动世界各地,因此不会"属于"一个单元格(出于优化原因,您可能希望在每个单元格中分配一个"临时"实体,但优化是您在引擎/游戏运行应该打扰的事情) .

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

如果你这样做,你将拥有一个迷宫:-).一些优化提示:

  • 你很快就会意识到你正在渲染许多永远不会被看到的四边形.如果这确实有速度影响(并且在您尝试仅渲染可见单元格之后),您可能希望扩展包含单元格墙壁实际存在的标志的结构.例如,想象连续这三个细胞:ABC.细胞AC有三个城墙(左,上,下的A,右,上,下为B)和细胞B有两个壁(上下).为了标记墙壁是否存在,对于每个单元格检查周围的单元格.
    • 如果一个单元SOLID格上方有一个单元格,则它的"向上"墙不存在.类似地,其左侧细胞,右侧细胞和下方细胞.
    • 如果单元格位于地图的边缘,则始终会丢失一个墙.如果它在一个角落,总是缺少两面墙.
    • 在初始化游戏时进行此计算,而不是在渲染时进行!
    • 弄清楚哪些单元格可见之后进行这些测试.在开始为此编写代码之前,请保留一个备份(希望您将使用某些版本控制系统,如Subversion,但即使不只是将代码复制到某处)并比较两个版本的结果.它可能实际上更快 - 特别是在iPhone 3GS上 - 不移除空墙,但使用VBO对所有墙使用相同的网格.
  • 如果您添加动态实体并拥有上面提到的"临时实体",那么一旦您有方法确定哪些单元格可见而哪些单元格不可见,您实际上可以自动丢弃不可见的动态实体:如果单元格是不可见的,则其关联的动态实体也将是不可见的(但要注意:实体可以触摸多个单元格).
  • 一种非常简单但非常粗糙的方法是不渲染所有单元格,只是渲染相机周围的单元格,例如:

.

+-+-+-+-+-+-+-+
| |X|X|X| | | |
+-+-+-+-+-+-+-+
| |X|C|X| | | |
+-+-+-+-+-+-+-+
| |X|X|X| | | |
+-+-+-+-+-+-+-+
| | | | | | | |
+-+-+-+-+-+-+-+
Run Code Online (Sandbox Code Playgroud)

(这里C是摄像机所在的单元格,X是摄像机周围的单元格 - 当然我只使用了距离摄像机一个单元格的单元格,但是你应该使用更多 - 例如16个单元格只要确保你的地图永远不会有一个空白区域,可以看到超过16个单元格或你决定的任何东西)

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

好吧,我认为这是足够的信息给你一个起点:-).当然,Stackoverflow可用于您可能遇到的任何其他问题:-P