Понедельник, 21.05.2018, 09:06
Мир Irrlicht
Главная | Форум | Статьи | Файлы | Регистрация | Вход
Меню сайта
Категории каталога
Для начинающих [5]
Наш опрос
Приходилось ли вам иметь дело с Irrlicht?
Всего ответов: 908
Главная » Статьи » Для начинающих

Привет мир!
В этом уроке мы научимся создавать программы которые используют Irrlicht. Этот урок подразумевает что вы уже настроили Visual Studio на использование Irrlicht.

Для того чтобы использовать библиотеку, нужно подключить хедер-файл irrlicht.h:
#include "irrlicht.h"
Теперь мы подключаем библиотеку Irrlicht.lib. Мы могли бы это зделать через настройки проекта, но мы для простоты сделаем это через директиву препроцессора pragma comment:
#pragma comment(lib, "Irrlicht.lib")
После этого в программе уже будет определён неймспейс irr, поэтому для более удобного использования библиотеку мы указываем явно использование этого неймспейса чтобы позже не писать эту приставку:
using namespace irr;
using namespace core;
Так же мы указали еще и неймспейс core, он находится в неймспейсе irr. В действительности в самом неймспейсе irr есть 5 поднеймспейсов: core, scene, video, io и gui. Мы можем написать для упрощения этого урока сейчас в ряд "using namespace..." и т.д. (как это сделано в реальном уроке в Irrlicht SDK), но по опыту я бы не рекомендовал привыкать к этому -- лучше чётко представлять в каком неймспейсе находится та или иная функциональность, поэтому я не буду писать этих 5 деклараций неймспейсов, но вы можете делать как вам удобней. core мы оставили для того чтобы не писать приставку к таким типам как vector, dimension и т.д. Они довольно часто используются.

Точкой входа в программу под Windows может быть как main() так и WinMain(). Основное различие в том что при первом варианте будет создана консоль. Движок Irrlicht пишет в консоль полезную информацию во время работы, поэтому мы будем в наших примерах в основном использовать main().
int main()
{
Наиболее важная функция движка это createDevice(). Эта функция создаёт устройство Irrlicht, которое является корневым для любых действий движка.

createDevice() принимает 7 параметров из которых все являются необязательными :) -- но поверьте, без параметров вряд ли вы будете ее использовать. Рассмотрим параметры этой функции:
  • deviceType
    Тип устройства. Этот параметр принимает одно из значений video::E_DRIVER_TYPE. На данный момент это перечисление содержит такие элементы:
    • video::EDT_NULL (рендеринг картинки не происходит)
    • video::EDT_SOFTWARE (софтверный рендерер. Это значение по умолчанию)
    • video::EDT_BURNNGSVIDEO (альтернативный софтверный рендерер с качеством на порядок выше чем у video::EDT_SOFTWARE)
    • video::EDT_DIRECT3D8 (рендеринг с использованием Direct 3D 8.1 (только для платформ Windows))
    • video::EDT_DIRECT3D9 (рендеринг с использованием Direct 3D 9 (только для платформ Windows))
    • video::EDT_OPENGL (рендеринг с использованием OpenGL. Минимальный поддерживаемый OpenGL версии 1.2)
  • windowSize
    Размер окна. Если параметр fullscreen будет true, это будет также и графическим разрешением экрана в полноэкранном режиме, поэтому убедитесь что драйвер вашей видеокарты умеет работать в полноэкранном режиме с разрешением которое вы собираетесь задать. Это значение по умолчанию равно core::dimension2d(640, 480).
  • bits
    Глубина цвета. Если параметр fullscreen будет false, этот параметр будет игнорироваться. Возможные значения параметра: 16 или 32. По умолчанию этот параметр равен 16.
  • fullscreen
    Булевский флаг. Если это значение true, окно будет создано во весь экран и будет установлен режим указанный в windowSize с глубиной цвета в bits. По умолчанию этот параметр false.
  • stencilbuffer
    Булевский флаг. Нужно ли использовать буфер трафарета? Этот флаг обычно используется если нужна возможность рисовать трафаретные тени (stencil shadows). Внимание: не все устройства умеют рисовать такие тени, поэтому этот флаг будет проигнорирован для их. По умолчанию этот параметр false.
  • vsync
    Булевский флаг, отвечающий за включение вертикальной синхронизации. При значении true драйвер будет ожидать вертикального прохода луча. Этот параметр игнорируется если fullscreen будет false. По умолчанию этот параметр false.
  • receiver
    Указатель на пользовательский обработчик событий. По умолчанию значение этого параметра равно 0. Этот параметр может быть установлен позже через IrrlichtDevice::setEventReceiver().
  • sdk_version_do_not_use
    Этот параметр никогда не должен быть использован напрямую. Этот параметр используется самим Irrlicht для проверки версий SDK с каким программа компилировала и с каким запускается (с какой версией Irrlicht.dll). Значение этого параметра равно IRRLICHT_SDK_VERSION.
IrrlichtDevice *irrDevice = createDevice(video::EDT_OPENGL,
dimension2d(500, 400));
Теперь получим указатели на видео драйвер, менеджер сцен и графический интерфейс пользователя. Чтобы не писать всегда irrDevice->getVideoDriver(), irrDevice->getSceneManager() и irrDevice->getGUIEnvironment:
video::IVideoDriver *irrVideo = irrDevice->getVideoDriver();
scene::ISceneManager *irrScene = irrDevice->getSceneManager();
gui::IGUIEnvironment *irrGUI = irrDevice->getGUIEnvironment();
Озаглавим окно каким-нибудь текстом, например, названием урока. Заметьте, символ "L" перед строкой, из С++ мы знаем что таким образом задаются юникод-строки и один символ в памяти занимает 2 байта. В Irrlicht многие строки задаются через юникод. Установим заголовок:
irrDevice->setWindowCaption(L"001. Привет мир!");
Теперь загрузим модель syndey.md2 и текстуру к ней syndey.bmp:
scene::IAnimatedMesh* mesh =
irrScene->getMesh("../media/sydney.md2");
scene::IAnimatedMeshSceneNode* node =
irrScene->addAnimatedMeshSceneNode(mesh);

if (node)
{
node->setMaterialFlag(video::EMF_LIGHTING, false);
node->setMD2Animation (scene::EMAT_STAND);
node->setMaterialTexture(0, irrDriver->getTexture("../media/sydney.bmp"));
}
Если бы мы не использовали irrScene то скорее всего камера нам была бы не нужна, но так как мы используем -- мы должны создать хотя бы одну камеру. Первая созданная камера автоматически будет активной (активную камеру можно указать через irrScene->setActiveCamera()). Добавляем в сцену камеру:
scene::ICameraSceneNode *cam =
irrScene->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));
Теперь создадим надпись при помощи системы гуи, которую предоставляет Irrlicht:
irrGUI->addStaticText(L"Hello World! This is simple Irrlicht app!",
core::rect(10,10,260,22), true);
Надпись у нас на английском потому, что мы пока что не сможем отобразить русский шрифт. В Irrlicht.dll встроен 1 шрифт который не умеет рисовать кириллицу, поэтому вывод кириллицы будет показан в отдельном уроке, чтобы не нагружать этот.

Теперь давайте все нарисуем. Мы будем находится в цикле до того времени пока irrDevice->run() не возвратит false. Это может быть в случае если пользователь кликнул на крестик окна или нажал ALT+F4. Код будет выглядеть так:
while(irrDevice->run())
{
irrDriver->beginScene(true, true,
video::SColor(255, 30, 60, 90));
irrScene->drawAll();
irrGUI->drawAll();
irrDriver->endScene();
}
Вся отрисовка у нас должна быть между irrDriver->beginScene() и irrDriver->endScene(). Если мы используем гуи и пропустим здесь строку irrGUI->darwAll(), мы просто не увидим нашего гуи.

Давайте рассмотрим параметры функции beginScene():
  • backbuffer
    Флаг, указывающий необходимость очищать задний буфер, заполняя его цветом color. В нашем случаи на каждом кадре происходит очистка заднего буфера. Эта очистка не нужна в тех случаях, если вы используете так называемые "закрытые сцены", тоесть такие сцены в которых всегда на заднем плане есть конечный объект (например skybox). Отключение backbuffer может увеличить производительность на несколько процентов.
  • zBuffer
    Флаг, указывающий на очистку буфера глубины (z-buffer). Если вы выполняете только 2Д графику или же вы отрисовываете объекты вручную (при чем вы позаботились и отсортировали их по глубине, так что отрисовываете дальние в начале и те что поближе -- в конце), то этот параметр можно установить в false. Отключение очистки буфера глубины может увеличить производительность на несколько процентов.
  • color
    Цвет, которым будет заполнятся задний буфер при очистке. А значит, что если backbuffer установлен в false, этот параметр игнорируется.
Отображение всего на экран происходит при вызове irrDriver->endScene().

После того как мы закончили, мы должны удалить устройство Irrlicht тем самым освободив память (освобождение ресурсов когда они более не нужны -- обычная практика в программировании в целом). В Irrlicht мы должны удалять все объекты которые создали через функции начинающиеся на "create" (например, createDevice()). Само удаление выполняется вызовом метода drop(). Так как мы создали устройство Irrlicht через createDevice(), мы должны вызвать для него drop():
irrDevice->drop();
return 0;
}
Результатом нашей программы будет следующее окно:



В консоли будет выведена информация о версии Irrlicht, о используемом драйвере и видеокарте. Так же будет выведена информация о том что была загружена модель syndey.md2 и текстура syndey.bmp.

Если вы видите в консоли сообщения "Could not load mesh, because file can not be opened.: ..." и/или "Could not open file of texture: ...", значить вы должны убедиться что пути к файлу модели и файлу текстуры заданы верно в функциях getMesh() и getTexture() соответственно.
Категория: Для начинающих | Добавил: greenya (29.09.2007) | Автор: greenya
Просмотров: 9939 | Комментарии: 9 | Рейтинг: 4.2/4 |

Всего комментариев: 7
7  
Мне кажется, там где написано irrDevice->, нужно писать irrVideo->
Исправьте!
////////////////

Бля! перепутал! Вот как надо:

там где написано irrDriver->, нужно писать irrVideo->


6  
Мне кажется, там где написано irrDevice->, нужно писать irrVideo->
Исправьте!

5  
//проблема решена

4  
Так, пример который собственно поставлен в изначальном виде - работает.
Но там все команды записаные у вас с приставкой irr с приставкой не хотят работать)те только без нее0

3  
так провел эксперимент.Создал новый проект, в нем все проделал, 1ая программа откомпилировалась.Но вот во второй снова не компилиться=)Правда ошики уже другие и их гораздо меньше) -
.\pervuj.cpp(8) : error C2955: 'irr::core::dimension2d' : use of class template requires template argument list
e:\irrlicht-1.5\irrlicht-1.5\include\dimension2d.h(157) : see declaration of 'irr::core::dimension2d'
.\pervuj.cpp(21) : error C2065: 'irrDriver' : undeclared identifier
.\pervuj.cpp(21) : error C2227: left of '->getTexture' must point to class/struct/union/generic type
type is ''unknown-type''
.\pervuj.cpp(26) : error C2955: 'irr::core::rect' : use of class template requires template argument list
e:\irrlicht-1.5\irrlicht-1.5\include\rect.h(253) : see declaration of 'irr::core::rect'
.\pervuj.cpp(29) : error C2227: left of '->beginScene' must point to class/struct/union/generic type
type is ''unknown-type''
.\pervuj.cpp(33) : error C2227: left of '->endScene' must point to class/struct/union/generic type
type is ''unknown-type''

Вот на всяк случай пример кода до первой ошибки -
#include "irrlicht.h"

#pragma comment(lib, "Irrlicht.lib")
using namespace irr;
using namespace core;
int main()
{IrrlichtDevice *irrDevice = createDevice(video::EDT_OPENGL,dimension2d(500, 400));


2  
Вероятно забыли:
Code

#include "irrlicht.h"
#pragma comment(lib, "Irrlicht.lib")

1  
помогите!у меня на этом примере он выдал просто кучу ошибок=(в чем дело не очень понимаю
error C2871: 'irr' : a namespace with this name does not exist
d:\documents and settings\admin\мои документы\visual studio 2005\projects\1\1\1.cpp(5) : error C2871: 'core' : a namespace with this name does not exist
d:\documents and settings\admin\мои документы\visual studio 2005\projects\1\1\1.cpp(7) : error C2065: 'IrrlichtDevice' : undeclared identifier
d:\documents and settings\admin\мои документы\visual studio 2005\projects\1\1\1.cpp(7) : error C2065: 'irrDevice' : undeclared identifier
d:\documents and settings\admin\мои документы\visual studio 2005\projects\1\1\1.cpp(7) : error C2653: 'video' : is not a class or namespace name
d:\documents and settings\admin\мои документы\visual studio 2005\projects\1\1\1.cpp(7) : error C2065: 'EDT_OPENGL' : undeclared identifier
d:\documents and settings\admin\мои документы\visual studio 2005\projects\1\1\1.cpp(7) : error C3861: 'createDevice': identifier not found

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
Статистика
Copyright MyCorp © 2018 Создать бесплатный сайт с uCoz