Я пытаюсь перейти к 2D-игре, такой как Legend of Mana и Star Ocean Second Story, а не к 2D-играм на основе плиток.
ОБЗОР
В настоящее время я идуо создании моей игры примерно так:
У меня есть файлы геометрии и файлы текстур.Файлы геометрии хранят ширину, высоту, положение XY, номер идентификатора текстуры и имя используемой текстуры.
Я пытаюсь сделать так:
У меня будет объект диспетчера сценыкоторый загружает объекты "сцены".Каждый объект сцены хранит список всех геометрических объектов в этой сцене, а также текстурных и звуковых объектов (будет реализовано).
Каждая сцена визуализируется с использованием массива вершин, посредством чего объект менеджера сцены будет вызывать метод, подобный getВершины сцены по имени сцены, которая возвращает указатель на массив GLFloats (GLfloat *), и этот указатель на GLfloat используется в функции glVertexPointer () OpenGL.
Когда я хочу обновить позицию каждого персонажа (например, героя)например), моя цель - использовать игровые объекты «герой» в текущей сцене и вызывать такую функцию, как:
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 не получают данные в одном и том же порядке каждый раз, когда выполняется код.Затем он получает в случайном порядке.
Из-за этого у меня возникают проблемы с объединением всех данных массива вершин из каждого геометрического объекта в объекте сцены и передачей одного единственного указателя вершины в GLfloats.
Каждый объект геометрии хранит свой собственный массив из 8 значений вершин (4 пары значений координат X, Y).Я хотел бы, чтобы каждый геометрический объект управлял своими собственными вершинами (чтобы я мог использовать Move, Rotate, как упомянуто ранее), и в то же время я хотел бы, чтобы мой объект сцены мог выводить ссылку одного указателя на все данные вершин всехобъекты геометрии в текущей сцене для использования в функции glVertexArray () OpenGL.
Я стараюсь избегать вызова glDrawArrays (GL_TRIANGLE_STRIP, 0, 4) OpenGL несколько раз.Как рисовать героя, рисовать карту, рисовать AI агентов, рисовать объекты BG.Это было бы не очень эффективно.Как можно меньше сводить к минимуму количество обращений в GL (до 1 предпочтительно), особенно на ограниченном оборудовании, таком как iPhone, и это было предложено, когда я читал о разработке игр OpenGL.
ПРЕДЛОЖЕНИЯ?
Каков наилучший практический способ делать то, что я пытаюсь сделать?
Должен ли я использовать базу данных SQL для хранения моих игровых данных, таких как данные геометрических вершин, и загрузки сцены JUST 1 в память iPhoneиз файла базы данных sql на диске iPhone?