MOLDOVANIA
Меню сайта
Категории каталога
Мои статьи [0]
Уроки [2]
Уроки
Справочник [3]
что есть что
Из интернета [2]
Из интернета
Наш опрос
Оцените мой сайт
Всего ответов: 58
Главная » Статьи » Из интернета

02.Quake3Map


Поехали!

Начало программы будет такое-же как и в первом уроке. Мы только добавим дополнительный заголовочный файл, чтобы спросить у пользователя, какой драйвер он желает использовать.
#include
#include


Как вы помните, в Irrlicht существует несколько namespaces, поэтому, чтобы не быть похожими на обезьянок, давайте заставим компилятор использовать эти самые namespaces за нас. ( Прим. пер.: тут автор всё-таки решил поизвращаться и объявил только один namespace, но если вы хорошо читали первый урок :) то без труда исправите это упущение)
using namespace irr;


Теперь укажем компилятору какой файл нам надо прилинковать:
#pragma comment(lib, "Irrlicht.lib")


OK, можно начинать будем использовать main() вместо WinMain(), потому что, короче.
int main()
{


Как и в первом уроке, создадим 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;

}


// create device and exit if creation failed


IrrlichtDevice *device =

createDevice(driverType, core::dimension2d(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;

}


Всё. Компилируйте и летайте. :)
Информация взята с сайта
http://www.gamedev.ru




Категория: Из интернета | Добавил: Admin (31.12.2007)
Просмотров: 891 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright MyCorp © 2024Бесплатный конструктор сайтов - uCoz