[Конкурс] Простой редактор уровней на основе существующих пакетов. Часть 1
Автор: Pavel Anatolievich Nakaznenko
Простой редактор уровней средствами 3D Studio Max
Редактирование и экспорт игровых сцен из 3D Studio Max
Наказненко Павел Анатольевич, aka “Crio”
Специально для конкурса проводимого сообществом «Уголок tool-программистов»
www.gamedev.ru
Введение
Основная идея
Редактор объектов
Как пользоваться Object Editor
Экспортер уровней
Как пользоваться Scene Exporter
Загрузчик
Заключение
Введение
То, что редактор уровней – суровая необходимость, не для кого уже не секрет. Неопытные разработчики предпочитают разрабатывать собственные программные пакеты для создания игровых уровней, однако это не всегда приемлемо, с точки зрения сроков и бюджета.
Дело в том, что 90% времени левел-дизайнера занимает работа с геометрией, а остальное время уходит на установку триггеров, различных гейм-объектов, назначения свойств отдельным объектам сцены, а так же на балансировку. Поскольку разработать удобный редактор уровней – дело довольно трудоемкое и затратное, возникает необходимость в более простом и недорогом решении. Альтернативный метод рассматриваемый в данной статье - доработка определенной среды моделирования под свои нужды. В частности, ниже будет описан способ, как можно превратить 3D Studio Max в довольно простой, но очень удобный редактор уровней.
Примечание:
Стоит заметить, что сам по себе 3D Studio Max не является недорогим решением, однако, это всего лишь пример того, как можно воспользоваться иными программными пакетами.
В этой статье не будут объясняться принципы программирования, а так же синтаксические особенности языков программирования высокого уровня. Поэтому, несмотря на открытый исходный код, прилагающейся к статье, для четкого понимания статьи желательно знание основ написания скриптов MaxScript. Так же необходимы базовые навыки работы в пакете 3d Studio Max.
Основная идея
В пакете 3DSMAX, каждый объект сцены имеет определенные стандартные свойства, присваиваемые ему пакетом по умолчанию. В том числе есть, так называемые, User-Defined свойства. Чтобы убедиться в этом, достаточно выбрать любой объект на сцене, нажать на нем правой клавишей, выбрать пункт меню Properties. В появившемся диалоговом окне есть та самая вкладка User-Defined. Само по себе это свойство – ни что иное, как текстовое поле, в котором мы можем хранить дополнительную информацию об объекте.
Поскольку 3DSMAX – очень удобный инструмент по работе с геометрией, нам остается всего лишь реализовать назначение свойств объектам. В итоге мы получим простой и удобный редактор уровней.
Для написания дополнительного инструментария, мы воспользуемся встроенным интерпретатором MaxScript. Основное преимущество script’а перед ‘plug-in’ом в том, что он не зависит (в общем случае) от версии пакета 3D Studio Max, а так же предоставляет бОльшую скорость выполнения, нежели plug-in.
Примечание:
Конечно, разница в производительности варьируется, в зависимости от рода задач. В данном случае удобнее и быстрее вести разработку именно с помощью средств MaxScript
Для большего удобства, предлагаю разделить редактор уровней на две части: Object Editor и Scene Exporter. Итак, первым делом, нам необходимо определить, какие характеристики\свойства мы будем назначать объектам. Возьмем, к примеру, следующие параметры:
Name
char[255]
Имя объекта
ObjectType
int
Число, обозначающее тип объекта
Params
int
Число, которое содержит биты флагов некоторых свойств
FileName
char[255]
На тот случай, если для отображения объекта потребуется считать некоторый файл (модель скрипт и т. д.)
Transform
float[16]
Трансформация объекта
Color
Float[3]
Цвет объекта
Пусть на нашем уровне присутствует всего четыре вида объекта:
Model
Загружается из файла
Некоторая модель, которую мы подгружаем из файла
Cube
Обычный кубик
Sphere
Обычная сфера
ParticleEffect
Загружается из файла
Некоторый эффект отображающийся с помощью системы частиц. Все параметры грузятся из файла
Отдельно стоит заметить, что свойство Params содержит в себе несколько флагов. Среди них:
Visible – является ли объект видимым или нет,
Alpha Test – необходимо ли включать alpha test при отображении объекта,
Depth Test - ли включать depth test при отображении объекта,
Culling : No, Back, Front – отсечение невидимых граней
Все эти флаги «упаковываются» в одно число типа int с помощью побитовых операций. Предположим есть некоторые флаги:
#define idVisible 1 << 6 #define idDepthTest 1 << 7 #define idAlphaTest 1 << 8
Тогда чтобы активировать флаг Visible (например) достаточно написать конструкцию следующего вида
Params |= (idVisible | … другие флаги … | … );
чтобы деактивировать флаг
Params &= ~(idVisible | … другие флаги … | …);
Проверить активность флага:
If (Params & idVisible) // если флаг активирован, условие выполнится
#3D Studio MAX, #editor, #level, #MAX Script, #конкурс
25 июня 2007 (Обновление: 27 сен 2007)