После того, как мы настроили среду разработки, можем начать писать программу, итак, внесём свои первые строки. //c++
#include
Мы подключили самый главный заголовочный файл движка.
В Irrlicht все объекты, находятся в namespace irr, т.е. если вы хотите обратится к какому-либо классу движка, то вам необходимо написать irr:: перед именем класса. Например чтобы использовать IrrlichtDevice необходимо написать irr::IrrlichtDevice. Чтобы избежать утомительного вбивания irr, мы заставим компилятор делать это за нас :). Необходимо написать следующий код: //c++
using namespace irr;
Также в движке присутствует 5 namespaces второго уровня. Более подробно вы можете прочитать про них в документации. Чтобы не стать похожими на обязьян за печатными машинками и избавится от рутины, мы напишем следующий код: //c++
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
Он даёт компилятору указание подставлять что надо, где надо автоматически :) Чтобы использовать Irrlicht.dll мы должны прилинковать файл irrlicht.lib. Мы можем мучатся и прописывать пути к файлу ( как делал автор в самом начале :) ) А можем прямо в коде написать следующее: //c++
Эта строка даёт указание компилятору прилинковать файл "irrlicht.lib". Дальше. Необходимо ввести код главной функции. Я думаю лучше всего использовать main. //c++
int main()
{
Самая важная функция в движке ( по крайней мере так думает Niko :) ) является "createDevice". С помощью этой функции инициализируется движок и создаётся самый главный объект движка, который является корневым и от него мы получаем все остальные объекты. У функции createDevice - 7 параметров: deviceType: Типа устройства. В данный момент доступны Null device ( EDT_NULL ), Software device ( EDT_SOFTWARE ), DirectX8( EDT_DIRECTX8) , DirectX9.0c ( EDT_DIRECTX9 )и OpenGL ( EDT_OPENGL ). windowSize: Размер окна для вывода изображения ( или разрешение, если включен полноэкранный режим ). bits: Количество цветов. Сюда можно ставить либо 16, либо 32. Параметр игнорируется при оконном режиме. fullscreen: параметр отвечает за полноэкранный режим stencilbuffer: параметр отвечает за использование стенсил буфера. vsync: параметр игнорируется при оконном режиме. Определяет будет ли FPS синхронизироваться с частотой обновления экрана. eventReceiver: Объект для обработки событий, пока он нам не нужен, поставим 0. //c++
Теперь необходимо получить указатель на видео-драйвер ( IVideoDriver ), менеджер сцены ( ISceneManager ) и графический интерфейс ( IGUIEnvironment ), это делается для того, чтобы не писать постоянно device->getVideoDriver(), device->getSceneManager() и device->getGUIEnvironment(). //c++
Теперь мы добавим текст к окну используя IGUIEnvironment. Текст будет расположен на позиции (10,10) (левый верхний угол ) и (200,22) ( правый нижний угол ). //c++
guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!", rect(10,10,200,22), true);
Чтобы нарисовать что-нибудь интересное, мы загрузим Quake 2 модель ( .md2 ) и отобразим её. Мы получим от менеджера сцены указатель на объект и (getMesh()) прикрепим к SceneNode (Прим ечание переводчика: здесь я намеренно не стал переводит SceneNode, дословно это переводится как Узел сцены, что не даёт нам никакой информации. Я сам долго пытался понять что это за штука такая. Каждый объект (IMseh )имеет в движке свой Scene Node ( ISceneNode ) ( т.е. напрямую на IMesh нельзя воздействовать) , с помощью которого мы можем этот объект вертеть, перемещать, в общем производить какие-либо действия. IMesh служит только для загрузки объекта в память. А для отображения объекта на экране, необходимо создать этот самый Scene Node. В общем разберётесь, а если не разберётесь, то мне всегда можно написать на e-mail ) для того, чтобы отобразить объект на экране (addAnimatedMeshSceneNode()). Кроме .md2 моделей, движок может загружать .obj ( Maya ), .bsp ( Quake3 Map ), .ms3d ( Milkshape3D ), .x ( DirectX ) и что-то ещё :), подробнее в разделе возможности.
Модель Sydney была сделана человеком по имени Brian Collins. //c++
Чтобы моделька выглядела чуть лучше, мы немного изменим её свойства: отключим у модельки освещение ( Примечание переводчика: т.е. она будет выглядеть так, как будто её освещают со всех сторон - никаких теней, она буде полностью освещена. Я понимаю, это странно звучит, но у автора написано именно disable lighting, кому надо, тот поймёт :) ) Затем мы заставим Sydney дрыгать ручками и ножками, для этого будем циклично проигрывать кадры от 0 до 310.И в самом конце натянем на модельку текстуру, чтобы девушка, была похожа на девушку. //c++
Ура, мы загрузили всё что грузится и добавили, всё что надо было, теперь давайте всё это нарисуем. Мы организуем цикл, который будет работать до тех пор, пока мы не захлопнем устройство ( irrlichtDevice ) ( программно, через Ctrl-Alt-Del либо просто закроем окошко, не важно ) //c++
while(device->run())
{
Всё должно отрисовываться между командами SceneManager beginScene() и endScene() call. beginScene очищает экран заданным цветом а также depth buffer, если это необходимо. Затем мы позволим SceneManager ( Менеджер сцены ) и GUI Environment ( интерфейс пользователя ) отрисовать всё, что необходимо. По команде endScene() отрисовка закончится и всё, наконеч то :), вылезет на экран.. //c++
После того, как нам надоест созерцать дрыгающуюся модельку, нам желательно уничтожить IrrlichtDevice. Делается это функцией drop(). Такая функция есть почти у каждого объекта в Irrlicht. Смотрите документацию для более подробной информации. //c++