Установка
Так как данный урок рассчитан на новичков, мы будем использовать простейший способ установки движка. Для этого нам понадобится code::blocks. Irrlich не очень хорошо дружит с последними версиями блокса, поэтому качаем отсюда и устанавливаем проверенную версию 10.05. Code::blocks уже содержит в своем установщике компилятор, поэтому качать его отдельно не нужно. Далее создаем на жестком диске папку, где будут храниться наши проекты (у меня «D:/IrrlichtDev»). Теперь качаем отсюда последнюю версию Irrlicht'а и разархивируем ее в созданный нами каталог.
Создание проекта
Все необходимое у нас есть, настало время для создания проекта. Открываем Code:blocks, далее «File>New>Project», там выбираем «Irrlicht project». Следуя инструкции задаем имя нашему проекту, выбираем тот каталог для хранения, указываем в качестве компилятора «GNU GCC Compiler» и, если просит, говорим где находится движок.

Все, проект создан, минимальный код сгенерирован автоматически, но если попробовать скомпилировать его, то получим в ответ 2 ошибки. Ничего страшного, просто в 70 строке заменяем
dimension2d<s32> на dimension2du. Компилируем, запускаем и видим прекрасную, низкополигональную женщину с примитивной анимацией.
Поздравляю, это ваш первый проект на движке Irrlicht. Давайте сотрем ненужные комментарии (мы же умные, мы и так все поймем) и оставим следующее:
#include <irrlicht.h>
using namespace irr; //
using namespace core; // Здесь указываем пространства имен движка, для того, чтобы
using namespace scene; // не указывать их каждый раз, когда обращаемся
using namespace video; // к объекту движка.
using namespace io; //
using namespace gui; //
int main(int argc, char** argv)
{
IrrlichtDevice *device = // Здесь создаем ссылку на главный объект движка.
createDevice(EDT_SOFTWARE, dimension2du(640, 480), 16, // 1-й параметр - это рендер. Сейчас стоит программный
false, false, false, 0); // рендер, но можно указать EDT_OPENGL, например.
device->setWindowCaption(L"Hello HABRAHABR"); // Указываем заголовок нашего окошка.
IVideoDriver* driver = device->getVideoDriver(); // Ссылки на видео драйвер и менеджер сцены.
ISceneManager* smgr = device->getSceneManager(); // Подробнее о них можно почитать в документации.
smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); // Добавляем в менеджер сцены новую камеру.
while(device->run()) // Это наш основной цикл. Он будет выполняться постоянно, пока работает движок.
{
driver->beginScene(true, true, SColor(0,200,200,200)); // Драйвер начинает отрисовку сцены.
smgr->drawAll(); // Менеджер сцены рисует свои объекты.
driver->endScene(); // Драйвер заканчивает отрисовку сцены.
}
device->drop(); // Движок перестает работать, можно его удалить.
return 0;
}
Сейчас на нашей сцене ничего нет кроме камеры, так что давайте добавим простой кубик. Для этого просто добавим следующую строчку:
IMeshSceneNode * wall = smgr->addCubeSceneNode();
Если запустим проект, то увидим, что наш кубик полностью черный. Это потому, что на сцене нет освещения.
Чтобы на него не распространялись законы физики, связанные с освещением, ниже добавим следующее:
wall->setMaterialFlag(EMF_LIGHTING,false);
Думаю не нужно объяснять содержание этой строки.
Чтобы наш рукотворный примитив не был незримо белым, наложим на него текстуру, которую возьмем в стандартном наборе движка. Ниже пишем следующее:
wall->setMaterialTexture(0, driver->getTexture("../../media/wall.jpg")); //Цифра "0" обозначает слой текстуры.
Запускаем и видим красивый кусок стены.
Ну что это за кусок стены, если он не вращается? Значит далее пишем:
wall->setRotation(wall->getRotation() + vector3df(0,1,0));
Запускаем, проверяем.
Раз уж наш куб так истерично вращается, то поддержим психоделическую атмосферу неистово меняющимся цветом фона.
Создадим некую переменную «i», к которой каждый кадр будет прибавляться единица, а когда она будет достигать значения больше 256, будем сбрасывать её на ноль. Затем эту переменную укажем в качестве значения R, G и B цвета фона при отрисовке сцены. Таким образом, весь наш цикл while будет выглядеть так:
while(device->run()) {
int i;
i++;
if (i>256) i=0;
driver->beginScene(true, true, SColor(0,i,i,i)); // Здесь указывается цвет фона.
wall->setRotation(wall->getRotation() + vector3df(0,1,0));
smgr->drawAll();
driver->endScene();
}
Запускаем, наблюдаем.
Для ленивых вот полный исходный код урока:
#include <irrlicht.h>
using namespace irr; //
using namespace core; // Здесь указываем пространства имен движка, дл того, чтобы
using namespace scene; // не указывать их каждый раз, когда обращаемся
using namespace video; // к объекту движка.
using namespace io; //
using namespace gui; //
int main(int argc, char** argv)
{
IrrlichtDevice *device = // Здесь создаем ссылку на главный объект движка.
createDevice(EDT_OPENGL, dimension2du(640, 480), 16, // 1-й параметр - это рендер. Сейчас стоит программный
false, false, false, 0); // рендер, но можно указать EDT_OPENGL, например.
device->setWindowCaption(L"Hello HABRAHABR"); // Указываем заголовок нашего окошка.
IVideoDriver* driver = device->getVideoDriver(); // Ссылки на видео драйвер и менеджер сцены.
ISceneManager* smgr = device->getSceneManager(); // Подробнее о них можно почитать в документации.
smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); // Дабавляем в менеджер сцены новую камеру.
IMeshSceneNode * wall = smgr->addCubeSceneNode();
wall->setMaterialFlag(EMF_LIGHTING,false);
wall->setMaterialTexture(0, driver->getTexture("../../media/wall.jpg"));
while(device->run()) // Это наш основной цикл. Он будет выполняться постоянно, пока работает движок.
{
int i;
i++;
if (i>256) i=0;
driver->beginScene(true, true, SColor(0,i,i,i)); // Драйвер начинает отрисовку сцены.
wall->setRotation(wall->getRotation() + vector3df(0,1,0));
smgr->drawAll(); // Менеджер сцены рисует свои объекты.
driver->endScene(); // Драйвер заканчивает отрисовку сцены.
}
device->drop(); // Движок перестает работать, можно его удалить.
return 0;
}
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:
- Massacres That Matter - Part 1 - 'Responsibility To Protect' In Egypt, Libya And Syria
- Massacres That Matter - Part 2 - The Media Response On Egypt, Libya And Syria
- National demonstration: No attack on Syria - Saturday 31 August, 12 noon, Temple Place, London, UK
Комментариев нет:
Отправить комментарий