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

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

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

Статистика

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

Форма входа

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

Урок 2.Загрузка карты и Quake 3

Этот урок расскажет вам, как загрузить уровень от третьего квейка, подобрать правильный SceneNode и добавить камеру, которая будет контролироваться юзером. Перед тем, как читать дальше, убедитесь, что вы прочли и поняли первый урок.

Изображение

Поехали!

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

#include <irrlicht.h>
#include <iostream>

Как вы помните, в Irrlicht существует несколько namespaces, поэтому, чтобы не быть похожими на обезьянок, давайте заставим компилятор использовать эти самые namespaces за нас.

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;
}
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;

}

Всё. Компилируйте и летайте. :)

Категория: Уроки програмирования игр на IrrLicht | Добавил: mannn (17.07.2010)
Просмотров: 1819 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 1
1 Hans  
0
Всем привет !
Я бы хотел узнать совет программиста разбирающегося в движке Quake 3.Я делаю Аддон для Return to Castle Wolfenstain на движке Quake 3.Компьютеры в 2001 году были слабенькие, соответственно игра имеет очень много ограничений: по количеству брашей MAX_MAP_BRUSHES 0x8000,MAX_MAP_ENTITIES 0x800, количеству солдат на мапе 64 бота, вершин и т.д... Например модели подходят только низкополигональные, если не ошибаюсь, не больше 1024 полигонов... Сейчас компьютеры мощные, а ограничения, зашитые в движок очень мешают строить большие, красивые карты.Можно ли в исходнике RTCW SP программой Microsoft Visual C++ 2008 Express Edition подредактировав код снять ограничения или нет и в каких файлах нужно вносить изменения.В исходнике RTCW SP нашёл в папке src/bspc/q3 files. ограничения движка,увеличил их в три раза,но компилировать dll-ку пока не получается.Я не программист.Я не могу понять или заняться изучением движка RTCW (С++) или изменение исходников невозможно.
Андрей

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

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


  • Copyright by ZHABIN GRAD © 2024