Этот урок расскажет вам, как загрузить уровень от третьего квейка,
подобрать правильный SceneNode и добавить камеру, которая будет
контролироваться юзером. Перед тем, как читать дальше, убедитесь, что вы
прочли и поняли первый урок.
Поехали!
Начало программы будет такое-же как и в первом уроке. Мы только
добавим дополнительный заголовочный файл, чтобы спросить у пользователя,
какой драйвер он желает использовать.
#include <irrlicht.h> #include <iostream>
Как вы помните, в Irrlicht существует несколько namespaces, поэтому,
чтобы не быть похожими на обезьянок, давайте заставим компилятор
использовать эти самые namespaces за нас.
Теперь укажем компилятору какой файл нам надо прилинковать:
#pragma comment(lib, "Irrlicht.lib")
OK, можно начинать будем использовать main() вместо WinMain(), потому
что, короче.
Как и в первом уроке, создадим irrlichtDevice(). Отличие от
предыдущего урока в том, что мы спрашиваем юзера о том, какой драйвер он
хочет использовать.
video::E_DRIVER_TYPE driverType = video::EDT_DIRECTX9;
printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.2\n"\
" (d) Software Renderer\n (e) NullDevice\n (otherKey) exit\n\n");
char i; std::cin >> i; switch(i) { case 'a': driverType = video::EDT_DIRECTX9; break; case 'b': driverType = video::EDT_DIRECTX8; break; case 'c': driverType = video::EDT_OPENGL; break; case 'd': driverType = video::EDT_SOFTWARE; break; case 'e': driverType = video::EDT_NULL; break; default: return 1; } IrrlichtDevice *device = createDevice(driverType, core::dimension2d<s32>(640, 480)); if (device == 0) return 1;
Всё, как в первом уроке.
video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* smgr = device->getSceneManager();
Для того, чтобы отобразить карту от Quake3, мы должны сначала
загрузить её. Карты от Квейка пакуются в файлы .pk3, которые являются
обычным .zip архивом. Итак, сейчас мы добавим архив с картой в нашу
виртуальную файловую систему. Как только мы сделаем это, мы сможем
прочитать любой файл из архива без всякой распаковки в отдельную
директорию.
device->getFileSystem()->addZipFileArchive("../../media/map-20kdm2.pk3");
Теперь загрузим уровень, вызвав функцию getMesh(). Эта функция
возвращает указатель на IAnimatedMesh. Как изветно, уровни Quake3 на
самом деле не содержат анимации, поэтому наш mesh будет содержать всего
лишь один кадр. Итак, мы возьмём «первый кадр» из нашей «анимации» и
создадим OctTreeSceneNode, используя addOctTreeSceneNode(). OctTree
оптимизирует объект и обрабатывает только те его части, которые видны,
альтернативой ему является AnimatedMeshSceneNode, который рисует всё
подряд. Но учтите, что OcTree оптимизация целесообразна лишь для моделей
с большим количеством полигонов, например, как наш уровень.
scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");
scene::ISceneNode* node = 0;
if (mesh) node = smgr->addOctTreeSceneNode(mesh->getMesh(0));
Так как уровень был смоделирован не от точки (0,0,0), мы немного
сдвинем его.
if (node) node->setPosition(core::vector3df(-1300,-144,-1249));
Теперь нам нужна только камера, чтобы обозреть всё, что мы натворили.
Мы создадим камеру, контролируемую пользователем. В Irrlicht
реализовано несколько типов камер. Мы создадим камеру, которую обычно
используют в стрелялках:
smgr->addCameraSceneNodeFPS();
Теперь скроем мышиный курсор с глаз долой.
device->getCursorControl()->setVisible(false);
Мы сделали всё что были должны, теперь нарисуем это! :) Также
добавлен вывод FPS.
int lastFPS = -1; while(device->run()) { driver->beginScene(true, true, video::SColor(0,200,200,200)); smgr->drawAll(); driver->endScene(); int fps = driver->getFPS(); if (lastFPS != fps) { core::stringw str = L"Irrlicht Engine - Vertex and pixel shader example ["; str += driver->getName(); str += "] FPS:"; str += fps; device->setWindowCaption(str.c_str()); lastFPS = fps; } }
И в конце удалим наше device.
device->drop();
return 0;
}
Всё. Компилируйте и летайте. :)
|