我正在尝试使用Legend of Mana和Star Ocean Second Story这样的2D游戏,而不是基于平铺的2D游戏。
目前,我正在构建游戏的方式如下:
我有几何文件和纹理文件。几何文件存储宽度,高度,XY位置,要使用的纹理ID号和要使用的纹理名称。
我正在尝试的方式是:
我将有一个加载“场景”对象的场景管理器对象。每个场景对象都存储该场景中所有几何对象的列表以及纹理和声音对象(将被实现)。
使用顶点数组渲染每个场景,其中场景管理器对象将调用方法,如按场景名称获取场景顶点,返回指向GLFloats数组的指针(GLfloat *),此指针指向GLfloat,用于OpenGL的glVertexPointer( )功能。
当我想更新每个角色的位置时(例如英雄),我的目标是使用当前场景中的“英雄”游戏对象并调用如下函数:
Hero.Move(newXPosition, newYPosition);
实际上会改变英雄几何对象的顶点数据。所以它会做类似的事情:
for(int i = 0; i < 8; i++)
{
vertexList[i] = vertexList[i] + newXPosition;
vertexList[i+1] = vertexList[i+1] + newYPosition;
...
}
这样,当我在渲染帧中渲染场景时,它将使用更新的顶点坐标再次渲染整个场景。
游戏中的每个对象都只是一个四边形,纹理映射到它。
我正在使用Objective C进行编程和OpenGL。这适用于iOS平台。
到目前为止,我已成功使用此方法渲染1个对象。
我遇到的问题是我使用的是NSMutableDictionary,它是一种使用键值对在场景对象类中存储几何实例对象的数据结构。 Objective C中的字典在每次运行代码时都不会以相同的顺序检索数据。它以随机顺序检索。
由于这一点,我无法组合场景对象中每个几何对象的所有顶点数组数据,并将1个顶点指针传递给GLfloats。
每个几何对象存储它自己的8个顶点值的数组(4对X,Y坐标值)。我希望每个几何对象都能管理它自己的顶点(所以我可以像之前提到的那样使用Move,Rotate),同时,我希望我的场景对象能够输出一个指向所有顶点数据的指针。当前场景中的几何对象,用于在OpenGL的glVertexArray()函数中使用。
我试图避免多次调用OpenGL的glDrawArrays(GL_TRIANGLE_STRIP,0,4)。喜欢绘制英雄,绘制地图,绘制AI代理,绘制BG对象。那不会很有效率。最大限度地减少GL绘制调用的数量(最好是1个绘制调用),特别是在iPhone等有限的硬件上,这是我在阅读OpenGL游戏开发时的建议。
做我正在做的事情的最佳做法是什么?
我是否应该使用SQL数据库存储我的游戏数据(如几何顶点数据),并从iPhone磁盘上的sql数据库文件中将JUST 1场景加载到iPhone内存中?
答案 0 :(得分:0)
您可以使用列表列表来跟踪绘制图层和顺序,并仅使用字典进行快速查找。
答案 1 :(得分:0)
我不明白为什么你不使用Cocos2D,这恰好是建立在场景管理器范例之上的。想想你将节省的所有开发时间......
我曾在一家做过精彩游戏的公司工作过。由于缺乏调试开发时间,它最终因为不断推出有缺陷的游戏而死亡。然而,他们确实有时间创建图形渲染引擎。
我想,并且仍然认为,他们有错误的优先事项。在我看来,你犯的是同样的错误:你是想尝试制作iOS游戏,还是想学习如何为iOS制作2D游戏引擎?
注意:Cocos2D是开源的,因此您可以阅读它,因为您已经考虑过创建此类引擎的过程。