Урок второй. "Начало работы"
Итак, мы подключили Ирлихт к компилятору и сейчас напишем небольшую программу.
Открываем Код::Блокс, а затем и наш проект, созданный в предыдущем уроке (проекты Код::Блокса имеют расширение .cbp)
Начинаем "кодить":
Code
#include <irrlicht.h>
Этой строчкой мы подключаем библиотеку Ирлихта.
Объявляем нужные (и не очень) пространства имен:
Code
using namespace irr; //главное namespace
using namespace core; //здесь содержатся типы и прочее
using namespace video; //видео драйвер
using namespace scene; //менеджер сцены
using namespace io; //ввод-вывод
using namespace gui; //интерфейс
Такое начало лучше делать в начале любой программы с Ирлихтом.
Начинаем главную подпрограмму:
Создаем движок. Функция createDevice() содержит следующие аргументы:
1) рендерер может содержать следующие значения: EDT_OPENGL, EDT_SOFTWARE, EDT_DIRECT3D8, EDT_DIRECT3D9, EDT_NULL, EDT_BURNINGSVIDEO.
2) Размер окна в оконном или разрешение в полно экранном режиме.
3) Глубина цвета 16 или 32.
4) Приложение полно экранное? (true/false)
5) Трафаретный буфер включен? (true/false)
6) Вертикальная синхронизация включена? (true/false)
7) Ссылка на обработчик событий. Его у нас нет поэтому ставим 0.
Создаем движок и проверяем его работоспособность:
Code
IrrlichtDevice *device = createDevice(video::EDT_SOFTWARE, dimension2d< u32 >(640, 480));
if (!device) return 1;//при сбое выход из программы
Теперь создадим указатели на Видео драйвер и Менеджер сцены:
Code
IVideoDriver* driver = device->getVideoDriver(); //указатель видео драйвера
ISceneManager* smgr = device->getSceneManager();//указатель менеджера сцены
Загрузим созданную предварительно любую модель. Лично использовал Сидни (ссылка внизу):
Code
IAnimatedMesh* mesh = smgr->getMesh("./sydney.md2");//добавление меша
if (!mesh)//при сбое выход
{
device->drop(); //уничтожаем движок
return 1;
}
Теперь мы должны создать ноду. Нода (узел) это некое подобие объекта в ООП. Каждый меш (модель) на сцене, а также камеры и источники света должны быть нодами. Даже сцена это нода - RootSceneNode.
В общем создаем ноду:
Code
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );//добавление анимированного меша
if (node)
{
node->setMaterialFlag(EMF_LIGHTING, false);//отключаем обработку света для ноды т.к. у нас нет источников света на сцене
node->setRotation(vector3df(0, 40, 0)); //слегка повернем ноду по оси Y (она направлена снизу вверх, X направлена слева направо, а Z вдаль)
node->setMaterialTexture(0, driver->getTexture("./sydney.bmp")); //текстурируем модель
}
Создадим камеру, чтобы увидеть что получилось:
Code
ICameraSceneNode* camera = smgr->addCameraSceneNode();
camera->setPosition(vector3df(-30, 40, -30)); // позиционируем камеру
camera->setTarget(vector3df(0, 0, 0)); // направляем камеру на ноду (для камеры не действует setRotation(), его заменяет setTarget())
Главный цикл:
Code
while(device->run())//пока движок работает
{
driver->beginScene(true, true, video::SColor(255, 200, 200, 200)); // back- и z-bufer включены, третий параметр - цвет фона
smgr->drawAll(); // рисуем сцену
driver->endScene();
}
После окончания работы уничтожаем движок:
Code
device->drop();//уничтожение движка
return 0;//успех!
}