Zee*_*aja 0 iphone xcode objective-c iphone-sdk-3.0
我想知道是否有人可以让我开始如何使用openGL构建迷宫.我是否需要编写代码来绘制迷宫,还是像在单独的窗口中绘制图片一样?我需要创建一个游戏引擎来开始吗?我正在为iphone开发这样做,所以任何建议对我来说都是一个很好的开始.感谢大家的回复.
一个非常简单的方法,它将获得类似于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.细胞A和C有三个城墙(左,上,下的A,右,上,下为B)和细胞B有两个壁(上下).为了标记墙壁是否存在,对于每个单元格检查周围的单元格.
SOLID格上方有一个单元格,则它的"向上"墙不存在.类似地,其左侧细胞,右侧细胞和下方细胞..
+-+-+-+-+-+-+-+
| |X|X|X| | | |
+-+-+-+-+-+-+-+
| |X|C|X| | | |
+-+-+-+-+-+-+-+
| |X|X|X| | | |
+-+-+-+-+-+-+-+
| | | | | | | |
+-+-+-+-+-+-+-+
Run Code Online (Sandbox Code Playgroud)
(这里C是摄像机所在的单元格,X是摄像机周围的单元格 - 当然我只使用了距离摄像机一个单元格的单元格,但是你应该使用更多 - 例如16个单元格只要确保你的地图永远不会有一个空白区域,可以看到超过16个单元格或你决定的任何东西)
当然,投射光线可能会产生更好的结果:-).
好吧,我认为这是足够的信息给你一个起点:-).当然,Stackoverflow可用于您可能遇到的任何其他问题:-P
| 归档时间: |
|
| 查看次数: |
2776 次 |
| 最近记录: |