[Главная] [Новости] [Статьи] [Игры] [Проекты] | [Автор] | |||
Описание структуры файла карты игровой сцены | ||||
25/03/2008, 18/04/2008 |
||||
Описание возможностей модуля DX8MapLoader.pas - Пример использования для редактора карт показан в приложении MapEditor; - Пример использования в игровом приложении для загрузки созданной в редакторе карт сцены в приложении MapScene2;
Иерархия классов и функции методов при построении и отрисовке карты игрового мира: TSceneMapLoader - базовый класс карты игровой сцены Содержит поля: DrawList: TGameObjectList; //список всех объектов на карте ModelList: TD3DCashedMeshesList; //список загружаемых мешей (статичных и анимированных) Ссылки на меши используются игровыми объектами списка DrawList модуль DX8MapLoader также содержит доступную переменную - MapObjects: TGameObjectList; //список типов игровых объектов, используется редактором карт при добавлении объектов на карту TSceneMapLoader - загрузчик игровой сцены, происходит от TSceneMapLoaderClass; методом LoadMapFile вызываемым из класса игровой сцены TGameScene2 - TGameScene2.ConstructZoneMap формирует игровую карту посредством следующих методов - CreateMap > ReadMeshes, ReadGameObjects метод ReadMeshes - загружает модели объявленные в начале определений зоны; В конце данного метода вызывается метод TD3DCashedMeshesList.LoadD3DObject, производящий фактическую загрузку мешей. метод ReadGameObjects - формирует по полученным из файла карты данным игровые объекты, в конце данного метода вызывается метод CreateGameObject по которому объект размещается на карте мира и добавляется в список отрисовки игровых объектов. |
||||
Описание языка тегов определяющего структуру текстового файла карты уровня: Тег [zone n\] - начало определений зоны номер n [\zone n] - конец определений зоны n сразу после начала зоны - [zoneobjects\] - список уникальных объектов (статичных и анимированных мешей) загружаемых в кеш-список сцены. Здесь должны указываться только уникальные для каждой зоны объекты. В последующих зонах, находящихся в пределах данной ЛОКАЦИИ (см. ниже) определяются только уникальные для них объекты. Объекты, которые используются, но уже содержатся в предыдущей зоне заново не описываются. [\zoneobjects] Каждая строка внутри данных тегов оформляется следующим образом - (в скобках указан один из вариантов) mesh(animmesh) objectname 'Media\Models\scene2\nanotree.x'; mesh - определяет статичную модель, animmesh - анимированную, objectname - определяет имя объекта, путь указанный в кавычках до ; определяет путь для загружаемой модели. Объекты группы zoneobjects попадают в список Meshes представленный классом TD3DCashedMeshesList Из объектов игровой зоны (вне объектов zoneobjects) формируется список игровых объектов представленных классом TGameObjectList. Это объекты, отрисовываемые на карте мира. Они содержат ссылки на меши из списка Meshes. Каждый из объектов зоны имеет строго определенное имя goType и жестко закрепленный за именем код типа goTypeCode. Значения определяются в константах кода приложения. [objectname\] - начало параметров объекта карты [\objectname] - конец параметров объекта карты
|
||||
Свойства игровых объектов зоны - определяются внутри тегов [objectname\] и [\objectname] Pos = x; y; z; - локальные координаты объекта на карте зоны. Отсчет координат - от центра зоны. Rotate = x; y; z; - вращения (в радианах вокруг основных осей); По умолчанию Rotate = 0; 0; 0; Scale = x; y; z; - масштабные коэффициенты. По умолчанию Scale = 1; 1; 1; Если данные параметры Rotate и Scale не заданы они принимаются равными по умолчанию и не учитываются в результирующей матрице объекта (WorldMatrix) при вызове метода TSceneMapLoader.CalcRelativePos вызываемого из CreateMap Первым объектом зоны должна являться земная поверхность. Для нее обяхательно должен быть объявлен параметр Pos. Координаты других объектов вычисляются относительно центра земной поверхности данной зоны. Специфические свойства объектов: Между тегами [nanoterra\]..[\nanoterra] - земная поверхность, свойства описанные ниже формируют наполнение экземпляра класса TNanoZone Neighbors = Left; Top; Right; Bottom; //определяет ближайшие соседние зоны. Если соседа нет значение с данной стороны установить в = -1; То же касается мнимых зон, которые будут формировать иллюзию непрерывности карты. LimTex = Pathnames\Filename; //имя файлы текстуры ограничений перемещений и карты уровней высот данной зоны |
||||
Добавление новых объектов в игру: 1) В языке тегов перед классом TSceneMapLoader описать соответствующие константы - Например, //земная
поверхность 2) В массиве GOTypeCodes ввести описания для ногово объекта //соответствие
имен и кодов типов объектов {...} n - общее количество описанных объектов 3) Внутри метода TSceneMapLoader.ReadGameObjects в строках //модель
объекта по его типу Задать соответствие между типом объекта и загружаемой моделью 4) Внутри метода TD3DCashedMeshesList.LoadD3DObject добавить необходимый код загружающий данный тип объекта в кешируемый список объектов Также возможно потребуется внести дополнения в реализацию методов - TD3DCashedMeshesList.DoRestoreDeviceObjects, TD3DCashedMeshesList.DoInvalidateDeviceObjects и TD3DCashedMeshesList.DoDeleteDeviceObjects определяющих действия с объектом исходя из его типа - if
FObjects.Count > 0 then 5) В методах DrawDisplayList и Animate игровой сцены задать нужные состояния и методы отрисовки и анимации (если требуется) для объекта по его типу - if
DrawList.GameObjects[i].goTypeCode = SceneMap_Object_NanoTerrain_TypeCode
then begin 6) Большинство игровых объектов будут выполнять в игровой сцене какую-то активную роль, кроме того, для отрисовки некоторых объектов могут потребоваться особые состояния и т.п. В этом случае для объекта создается отдельный класс нужного типа, а внутри класса игровой сцены объявляется поле соответствующего типа. В нужных методах игрового объекта описываются нужные особенности, которые учитываются посредством вызова этих методов при отрисовке и анимации объектов данного типа - в методах DrawDisplayList и Animate игровой сцены. 7) Добавить описания объектов в файл карты игровой сцены; 8) при добавлении новых земных поверхностей дополнить реализацию метода TSceneMapLoader.FindZoneNanoTerra - сопоставив номеру зоны новую земную поверхность - 2: ZoneTerrainFinded
:= (CompareStr(ZoneNanoTerra.goType, |
||||
Уникальность каждого объекта внутри списков: Meshes: TD3DCashedMeshesList; - в области описаний объектов для новой зоны описываются только новые, не содержащиеся в предыдущих зонах объекты - ПРАВИЛО УНИКАЛЬНОСТИ. Важно! Следует учитывать какое количество зон будет загружаться за один раз - ЛОКАЦИЯ. Тогда только для объектов в пределах ЛОКАЦИИ должно выполняться ПРАВИЛО УНИКАЛЬНОСТИ. А в каждой отдельной ЛОКАЦИИ начиная с первой загружаемой зоны данной ЛОКАЦИИ все требуемые объекты нужно объявлять заново. DraList: TGameObjectList; - каждый игровой объект имеет имя goType и код типа goTypeCode, номер зоны ZoneNum и положение Pos на карте игрового мира. Каждый объект уникален по номеру индекса в списке DrawList |
||||
|
||||
|
||||
[Назад] [Все уроки] | ||||
[Главная] [Новости] [Статьи] [Игры] | ||||
(c) Мега Информатик 2006-2008 |