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)