ios - 为 Star Ocean Second Story 和 Legend of Mana 等 2D 游戏存储游戏数据

标签 ios data-structures opengl-es

我正在尝试开发像《圣剑传说》和《星海二传》这样的 2D 游戏,而不是基于图 block 的 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;
    ...
}

这样,当我在渲染帧中渲染场景时,它会使用更新后的顶点坐标再次渲染整个场景。

游戏中的每个对象都只是一个映射了纹理的四边形。

问题

我在编程和 OpenGL 中使用 Objective C。这是针对 iOS 平台的。

到目前为止,我已经成功地使用此方法渲染了 1 个对象。

我遇到的问题是我使用的是 NSMutableDictionary,它是一种使用键值对在场景对象类中存储几何实例对象的数据结构。每次运行代码时,Objective C 中的字典不会以相同的顺序检索数据。然后以随机顺序检索。

因此,我无法将场景对象中每个几何对象的所有顶点数组数据组合在一起,并将 1 个顶点指针传递给 GLfloats。

每个几何对象存储它自己的 8 个顶点值数组(4 对 X、Y 坐标值)。我希望每个几何对象都管理它自己的顶点(这样我就可以像前面提到的那样使用移动、旋转),同时,我希望我的场景对象能够输出对所有顶点数据的单个指针引用当前场景中的几何对象,用于 OpenGL 的 glVertexArray() 函数。

我试图避免多次调用 OpenGL 的 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)。比如画英雄,画 map ,画AI代理,画BG物体。那不会很有效。尽可能减少 GL 绘制调用的数量(最好是 1 个绘制调用),尤其是在像 iPhone 这样的有限硬件上,这是我在阅读有关 OpenGL 游戏开发的文章时提出的建议。

建议?

做我想做的事情的最佳实践方法是什么?

我是否应该使用 SQL 数据库来存储我的游戏数据(例如几何顶点数据)并将 iPhone 磁盘上的 sql 数据库文件中的 1 个场景加载到 iPhone 内存中?

最佳答案

您可以使用列表的列表来跟踪绘制层和顺序,并仅使用字典进行快速查找。

关于ios - 为 Star Ocean Second Story 和 Legend of Mana 等 2D 游戏存储游戏数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7309432/

相关文章:

ios - 将 UIScrollView 添加到 Storyboard 中的现有 UIView

ios - 使用传递给函数的闭包会导致 malloc 崩溃

inheritance - 具有混合结构类型的 Go 映射和 slice

c - 数据结构中的大变量

android - 如何使图像旋转看起来干净?安卓 GL ES

ios - 带有类型为 "cannot invoke initializer for type ' 的参数列表的 'UITextField' Int' 是什么意思?

iphone - 如何在 iOS 中获取保存的图像文件路径

Java:多索引排序缓存或带索引访问的 SortedMap

c++ - 设置 opengl View 和投影转换

android - 适用于 Linux 的 BlueStacks 模拟器?