IrrlichtСтатьи

01. Hellow World

Автор:

Поехали! 

После того, как мы настроили среду разработки, можем начать писать программу, итак, внесём свои первые строки.

//c++

#include <irrlicht.h>

Мы подключили самый главный заголовочный файл движка.

В Irrlicht все объекты, находятся в namespace irr, т.е. если вы хотите обратится к какому-либо классу движка, то вам необходимо написать irr:: перед именем класса. Например чтобы использовать IrrlichtDevice необходимо написать irr::IrrlichtDevice. Чтобы избежать утомительного вбивания irr, мы заставим компилятор делать это за нас :). Необходимо написать следующий код:

//c++

using namespace irr;
//c#

using Irrlicht;

Также в движке присутствует 5 namespaces второго уровня. Более подробно вы можете прочитать про них в документации. Чтобы не стать похожими на обязьян за печатными машинками и избавится от рутины, мы напишем следующий код:

//c++

using namespace core;

using namespace scene;

using namespace video;

using namespace io;

using namespace gui;
//c#

using Irrlicht.Video;
using Irrlicht.Core;
using Irrlicht.Scene;
using Irrlicht.IO;
using Irrlicht.GUI;

Он даёт компилятору указание подставлять что надо, где надо автоматически :) Чтобы использовать Irrlicht.dll мы должны прилинковать файл irrlicht.lib. Мы можем мучатся и прописывать пути к файлу ( как делал автор в самом начале :) ) А можем прямо в коде написать следующее:

//c++

#pragma comment(lib, "где_он_у_вас_установлен/Irrlicht.lib")
//c#

// Подключение библиотек описано здесь:
// http://www.gamedev.ru/community/irrlicht/articles/?id=3

Эта строка даёт указание компилятору прилинковать файл "irrlicht.lib". Дальше. Необходимо ввести код главной функции. Я думаю лучше всего использовать main.

//c++

int main()

{
//c#

namespace _01.HelloWorld
{
  class Example
  {
    [STAThread]
    static void Main(string[] args)
    {

Самая важная функция в движке ( по крайней мере так думает 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++

IrrlichtDevice *device = createDevice(EDT_SOFTWARE, dimension2d<s32>(512, 384),
            16, false, false, false, 0);
//c#

IrrlichtDevice device = new IrrlichtDevice(DriverType.OPENGL, new Dimension2D(512,384),
            16, false, false, false, new System.IntPtr(0));

Теперь мы определим заголовок окна.

//c++

device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
//c#

device.WindowCaption = "Hello World! - Irrlicht Engine Demo";

Теперь необходимо получить указатель на видео-драйвер ( IVideoDriver ), менеджер сцены ( ISceneManager ) и графический интерфейс ( IGUIEnvironment ), это делается для того, чтобы не писать постоянно device->getVideoDriver(), device->getSceneManager() и device->getGUIEnvironment().

//c++

IVideoDriver* driver = device->getVideoDriver();

ISceneManager* smgr = device->getSceneManager();

IGUIEnvironment* guienv = device->getGUIEnvironment();
//c#

IVideoDriver driver = device.VideoDriver;

ISceneManager smgr = device.SceneManager;

IGUIEnvironment guienv = device.GUIEnvironment;

Теперь мы добавим текст к окну используя IGUIEnvironment. Текст будет расположен на позиции (10,10) (левый верхний угол ) и (200,22) ( правый нижний угол ).

//c++

guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!", 
                    rect<int>(10,10,200,22), true);
//c#

guienv.AddStaticText( "Hello World! This is the Irrlicht Software engine!",
                  new Rect( 10, 10, 200, 22 ), true, false, null, -1 ); 

Чтобы нарисовать что-нибудь интересное, мы загрузим 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++

IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");

IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
//c#

IAnimatedMesh mesh = smgr.GetMesh(@"..\..\media\sydney.md2");

IAnimatedMeshSceneNode node = smgr.AddAnimatedMeshSceneNode(mesh, null, -1);

Чтобы моделька выглядела чуть лучше, мы немного изменим её свойства: отключим у модельки освещение ( Примечание переводчика: т.е. она будет выглядеть так, как будто её освещают со всех сторон - никаких теней, она буде полностью освещена. Я понимаю, это странно звучит, но у автора написано именно disable lighting, кому надо, тот поймёт :) ) Затем мы заставим Sydney дрыгать ручками и ножками, для этого будем циклично проигрывать кадры от 0 до 310.И в самом конце натянем на модельку текстуру, чтобы девушка, была похожа на девушку.

//c++

if (node)

{

node->setMaterialFlag(EMF_LIGHTING, false);

node->setFrameLoop(0, 310);

node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );

}
//c#

if (node != null)
{
  node.SetMaterialFlag( MaterialFlag.LIGHTING, false );

  node.SetFrameLoop(0,310);

  node.SetMaterialTexture( 0, driver.GetTexture( @"..\..\media\sydney.bmp" ) );

Чтобы узреть объект, нам необходимо добавить камеру в позицию (0, 10, -40). Их этого места камера будет смотреть на точку (0,5,0).

//c++

smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));
//c#

smgr.AddCameraSceneNode( null, new Vector3D(0,30,-40), new Vector3D(0,5,0), -1 );

Ура, мы загрузили всё что грузится и добавили, всё что надо было, теперь давайте всё это нарисуем. Мы организуем цикл, который будет работать до тех пор, пока мы не захлопнем устройство ( irrlichtDevice ) ( программно, через Ctrl-Alt-Del либо просто закроем окошко, не важно )

//c++

while(device->run())

{
//c#

while(device.Run())
{

Всё должно отрисовываться между командами SceneManager beginScene() и endScene() call. beginScene очищает экран заданным цветом а также depth buffer, если это необходимо. Затем мы позволим SceneManager ( Менеджер сцены ) и GUI Environment ( интерфейс пользователя ) отрисовать всё, что необходимо. По команде endScene() отрисовка закончится и всё, наконеч то :), вылезет на экран..

//c++

driver->beginScene(true, true, SColor(0,200,200,200));


smgr->drawAll();
guienv->drawAll();

driver->endScene();
}
//c#

driver.BeginScene(true, true, new Color(0,200,200,200));

smgr.DrawAll();
guienv.DrawAll();

driver.EndScene();
}

После того, как нам надоест созерцать дрыгающуюся модельку, нам желательно уничтожить IrrlichtDevice. Делается это функцией drop(). Такая функция есть почти у каждого объекта в Irrlicht. Смотрите документацию для более подробной информации.

//c++

device->drop();

 return 0;
}
//c#

} // end main()
} // end class
} // end namespace

На сегодня всё. Компилируёте и запускайте.

Автор: Nikolaus "Niko" Gebhardt

Перевёл: Панченко "Andrushka" Андрей.
C# код: Двойников "G-ray" Сергей.

О глюках сообщайте мне на мыло.

#основы

8 декабря 2005 (Обновление: 17 ноя 2006)