Понедельник
29.04.2024, 15:33
Приветствую Вас Гость | RSS
Главная Каталог статей Регистрация Вход
Меню сайта

Категории раздела
Уроки програмирования игр на IrrLicht [7]
Уроки програмирования на игровом движке IrrLicht
Обработка цифровых изображений [0]
Различные способы реализации графических фильтровов,работа с цветовыми пространствами
Програмирование игр с использованием DirectX [3]
Програмирование трёхмерной графики на DirectX под Windows

Наш опрос
На каком языке вы програмируете?
Всего ответов: 209

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » Статьи » Програмирование » Уроки програмирования игр на IrrLicht

Урок 1.Первая программа с использованием IrrLicht

Привет! 

Настроим среду разработки Microsoft Visual Studio.

Инструкция для C++

1) Откройте Visual Studio и в меню Tools выберите пункт Options.

2) Откройте пункт Projects and Solutions и в нём выберите VC++ Directories.

3) Найдите надпись Show Directories For и в списке снизу выберите Include Files.

4) Щелкните на кнопке New Line ,после

    этого появится новая строчка в списке папок.

5) Щёлкните на этой строке и в конце строки появится кнопка,нажмите на неё и выберите папку с заголовочными файлами.

6) Нажмите ОК.Готово!

Инструкция для C#

1) Откройте Visual Studio и в меню Project выберите пункт Add Reference.
2) Выберите вкладку Browse и найдите файл IrrLicht.dll(специальный файл для платформы .NET)
3) Нажмите ОК.Готово!

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

//С++

#include <irrlicht.h>

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

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

//С++

using namespace irr;
//С#

using Irrlicht;

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

//С++

using namespace core;

using namespace scene;

using namespace video;

using namespace io;

using namespace gui;
//С#

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

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

//С++

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

// Не нужно!

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

//c++

int main()

{
//c#

namespace Urok1
{
class Example
{
[STAThread]
static void Main(string[] args)
{

Самая важная функция в движке , это -  "createDevice". С помощью этой функции инициализируется движок и
создаётся самый главный объект движка, который является корневым и от него мы получаем все остальные объекты.
У функции createDevice - 7 параметров:
DeviceType: Типа устройства.
Он принимает такие значения : 1)  Null device ( EDT_NULL )
                                               2) Software device ( EDT_SOFTWARE )
                                               3) DirectX8( EDT_DIRECTX8)
                                               4) DirectX9.0c ( EDT_DIRECTX9 )
                                               5) OpenGL ( EDT_OPENGL )
WindowSize: Размер окна для вывода изображения ( или разрешение, если включен полноэкранный режим ).
Bits: Количество цветов. Сюда можно ставить либо 16, либо 32. Параметр игнорируется при оконном режиме.
FullScreen: параметр отвечает за полноэкранный режим.
StencilBuffer: параметр отвечает за использование стенсил буфера.
Vsync: параметр игнорируется при оконном режиме. Определяет будет ли FPS синхронизироваться с частотой обновления экрана.
EventReceiver: Объект для обработки событий, пока он нам не нужен, поставим 0. 

//С++

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

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

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

//c++

device->setWindowCaption(L"Первая программа с использованием IrrLicht");
//c#

device.WindowCaption = "Первая программа с использованием IrrLicht";

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

//С++

IVideoDriver* driver = device->getVideoDriver();

ISceneManager* smgr = device->getSceneManager();

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

IVideoDriver driver = device.VideoDriver;

ISceneManager smgr = device.SceneManager;

IGUIEnvironment guienv = device.GUIEnvironment;

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

//c++

guienv->addStaticText(L"Демонстрация игрового движка - IrrLicht",
rect<int>(10,10,200,22), true);
//c#

guienv.AddStaticText( "Демонстрация игрового движка - IrrLicht",
new Rect( 10, 10, 200, 22 ), true, false, null, -1 );

Чтобы нарисовать что-нибудь интересное, мы загрузим Quake 2 модель ( .md2 ) и отобразим её. Мы получим от менеджера сцены указатель на объект и (getMesh()) прикрепим к SceneNode. Каждый объект (IMesh )имеет в движке свой Scene Node ( ISceneNode ) ( т.е. напрямую на IMesh нельзя воздействовать) , с помощью которого мы можем этот объект вертеть, перемещать, в общем производить какие-либо действия. IMesh служит только для загрузки объекта в память. А для отображения объекта на экране, необходимо создать этот самый Scene Node. В общем разберётесь! :Для того, чтобы отобразить объект на экране (addAnimatedMeshSceneNode()).

Движок может загружать модели следующих форматов :1) .md2 (Quake2)
                                                                                    2) .obj ( Maya )
                                                                                    3) .bsp ( Quake3 Map )
                                                                                    4) .ms3d ( Milkshape3D )
                                                                                    5) .x ( DirectX )
                                                                                    6) .3ds (3d Studio Max)(Вроде должен загружать)


Модель Sydney была сделана человеком по имени Brian Collins.

//С++

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

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

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

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

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

//С++

if (node)

{

node->setMaterialFlag(EMF_LIGHTING, false);

node->setFrameLoop(0, 310);

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

}
//С#

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).

//С++

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

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

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

//С++

while(device->run())

{
//С#

while(device.Run())
{

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

//С++

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


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

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

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

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

driver.EndScene();
}

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

//С++

device->drop();

return 0;
}
//С#

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

Всё!

Если будут вопросы пишите на alexmail16@mail.ru

Категория: Уроки програмирования игр на IrrLicht | Добавил: mannn (12.07.2010)
Просмотров: 4027 | Комментарии: 7 | Рейтинг: 0.0/0
Всего комментариев: 3
3 MatrixDeity  
0
Проблема 100% не актуальна для автора, но я оставлю это тут, чтобы эта информация могла оказаться полезной для кого-либо другого:

IrrlichtDevice *device = createDevice(EDT_SOFTWARE, dimension2du(512, 384), 16, false, false, false, 0); // Обратите внимание: поменял второй параметр

2 SphynX  
0
Может уже не актуально, но ошибка судя по описанию во втором параметре, а не в последнем. Как минимум тип не верный, разрешение не может быть отрицательным, так что там уместнее использовать тип u32. Плюс параметры все по-умолчанию проинициализированы и можно просто вызвать функцию createDevice(); все параметры кроме разрешения (там 640х480), будут те же.

1 Dirol  
0
Спасибо за урок)
Возникла небольшая проблема в строке:

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

А именно на последний параметр (EventReceiver=0).

Текст ошибки:
error C2664: 'irr::createDevice' : cannot convert parameter 2 from 'irr::core::dimension2d<T>' to 'const irr::core::dimension2d<T> &'

Подскажите пожалуйста, как это исправить.

Имя *:
Email *:
Код *:
Поиск

Друзья сайта
  • Самый свежий NET.Framework
  • Програмирование игр на OpenGL
  • FAQ по системе
  • Инструкции для uCoz


  • Copyright by ZHABIN GRAD © 2024