Совместный проект Silver Soft и Andrushka’s Software.
Irrlicht - что это такое и с чем его едят.
Урок 2. Ещё немного основ.
Итак, как скажут любители поиграться в третью кваку, сегодня нас ожидает tier 2. Для полноценной работы нам потребуется ещё немного основ. Этот урок для пользователей классического Irrlicht ничего не даст ( хотя нет, совсем чуть-чуть :) ), потому что здесь будут использоваться те конструкции, которые присутствуют только в NX++. Они теоретически могут быть реализованы и в классическом варианте движка, но с бОльшими трудностями.
В этом уроке:
• Загрузка 3D моделей
• Размещение 3Dмоделей на сцене
• Загрузка файлов напрямую из ZIP архива
• Камеры
Организация сцены
Попробуем понять, как организована в IrrlichtNX++ сцена. Комната, в которой сидят злобные монстры, улица по которой мы бежим, убивая не менее злобных монстров – всё это 3D сцены.
Для начала разберём два класса из движка. ISceneNode и IMesh. IMesh – это геометрия 3D модели, т.е., грубо говоря, описание всех полигонов модели, мест, куда лепить текстуры, кадров анимации, костей и прочего. ISceneNode переводится как «узел сцены». Для того, чтобы отобразить объект на экране, необходимо создать этот самый узел сцены. Каждый SceneNode создаётся по своему, но чаще всего SceneNode( иногда я буду называть SceneNode – объектом ) создаётся на основе объекта Mesh, т.е. для отображения объекта на сцене мы должны сообщить SceneManager геометрию объекта, координаты всех полигонов, а также количество текстур и проч., после этого SceneManager разместит объект на сцене и разрешит нам всячески им управлять. Любой объект SceneManager, по умолчанию, размещает в точке с координатами ( 0,0,0 ).
Если сравнивать ISceneNode и IMesh с чем-то жизненным, то IMesh – это горсть болтов, а ISceneNode – коробка, в которой эти болты хранятся и перемещаются по нашей мастерской.
Теперь приведу пример загрузки модели.
Нижеприведенный код необходимо смотреть только после изучения первого урока, т.к. названия переменных взяты из него.
Помните я говорил вам про загрузку файлов напрямую из зипа? Всё это делается одной нижеприведённой командой. Теперь если мы укажем просто имя файла без указания пути, то движок будет искать файл не только в текущей директории, а ещё и в ZIP архиве "data.zip”. Таким макаром можно подключить сколько угодно ZIP архивов. ( можно и отключить, но нам пока это не нужно, чуть позже расскажу как )
Вы спросите какого чёрта я вписал слово Animated? Это анимированная разновилность SceneNode и Mesh, т.е. если моделька – X, MS3D, MD2 или MD3 формата, то она будет дёргаться по всем правалм анимации, заложенной в ней.
В NX++ практически везде используются анимированные «ноды» и «меши». Если вдруг приспичило получить статический Mesh – то используйте метод mesh->getMesh( кадр_анимации ).
Вот так. Осталось последнее.
Камеры
Итак, что такое камера? Камера это наши глаза, «гляделка», как называла её моя сестра. :) Добавляется очень просто.
И всё. Но! О Ужас!! Наша камера просто сттоит на месте и ничего не делает. Как же быть? Писать все обработчики самому? Не-е-е-т. :) Не для этого я взял Irrlicht. Разработчики разработали систему так называемых контроллеров.
Контроллер – это особый класс, который подключается к CameraSceneNode и начинает её контролировать. :) Отслеживать наши нажатия на клавиши и двигать камеру так, как нам надо.
Как использовать контролле см. в коде.
Комментарии относительно игрового кода.
Итак, для загрузки уровней я сделал отдельный класс CLevel, в скором времени, когда всё переделаем на скрипты, эта штука оченно пригодится. Класс игрока ( фактически игрок состоит из камеры ) я вынес в отдельный класс CPlayer.
Далее, я сделал в кварке первый уровень. Господа, если вы решили, что я сделал убожество :), то, пожалуйста, не ленитесь делате свои уровни и присылайте их мне.
Комментарии в коде довольно обильные, думаю разберётесь. Летайте. :)