Понедельник, 20.11.2017, 06:37
Приветствую Вас Гость

IrrPhysX russian community

Меню сайта
Категории раздела
Irrlicht & IrrPhysX [4]
статьи по использованию Irrlicht и IrrPhysX
IrrLicht [3]
статью по иррлихту
Мини-чат
Наш опрос
Оцените мой сайт
Всего ответов: 9
Статистика

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

баннер

Главная » Статьи » Irrlicht & IrrPhysX

2 вариант 2 статьи
Использование физики в иррлихт

В этом уроке мы продолжим изучение IrrPhysX. Коллизии для игровых объектов.
Такими игровыми объектами будет сам уровень, который будет висеть в пространстве не падая вниз(в игре же вы не выйдете за пределы карты, так что игроку не нужно знать что там снаружи), а также это будут шары, которыми мы будем стрелять(условно).

Для начала добавим некоторые файлы из папки Common files в папке примеров от IrrPhysX. Этими файлами являются CGridSceneNode.cpp CGridSceneNode.h ShapeCreation.cpp ShapeCreation.h . Эти файлы копируем в папку проекта и добавляем в сам проект в VS. Далее мы прописываем в файле main.cpp строчку кода, подключающую ShapeCreation.h.

Code
#include <irrlicht.h>
#include <iostream>
#include <IrrPhysx.h>
#include "ShapeCreation.h"

Теперь нам нужен обработчик событий. Он у нас выполнен в виде класса MyEventReceiver, родительским классом которого является IEventReceiver. Обработка событий идёт в методе этого класса OnEvent

Code

bool keys[irr::KEY_KEY_CODES_COUNT];
class MyEventReceiver : public IEventReceiver  
{  
public:  
  virtual bool OnEvent(const SEvent& event)  
  {  
  if(event.EventType == irr::EET_KEY_INPUT_EVENT)  
  {  
  keys[event.KeyInput.Key] = event.KeyInput.PressedDown;  
  return false;  
  }  
  return false;
  }
};

Этим кодом мы будем получать нажатия клавиш, а зачем, Вы увидите далее.
Сейчас мы пропишем используемые пространства имён.
Code

using namespace irr;
using namespace IrrPhysx;
using namespace core;
using namespace scene;
using namespace video;

объявим физический менеджер, а также массив физических объектов и их вес.
Code

IPhysxManager* physxManager = NULL;
core::array<SPhysxAndNodePair*> objects;
f32 objectDensity = 50;

Далее подключаем библиотеки иррлихта, физикса и иррфизикса.
Code

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(lib, "IrrPhysX.lib")  
#pragma comment(lib, "PhysXLoader.lib")
#endif

Приступаем к функции main. Сначала объявим экземпляр класса MyEventReceiver.
MyEventReceiver rv;

Выбор нужной графической системы делается как и в прошлом уроке, поэтому на этом мы останавливаться не будем. А вот создавая графическое устройство иррлихта, мы будем теперь использовать больше параметров. Последний из них будет адрес на наш экземпляр класса обработчика событий.

Code

IrrlichtDevice *device =
  createDevice(driverType, core::dimension2d<s32>(1024, 768),24,false,false,false,&rv);

Далее объявляем и определяем видео драйвер и менеджер сцен иррлихта, как в прошлом уроке.

Сейчас нам нужно обнулить все элементы массива, которые будут использоваться для получения нажатий клавиш клавиатуры.

Code

for(int x=0; x<irr::KEY_KEY_CODES_COUNT; x++) keys[x] = false;

Теперь добавляем к используемым директориям директорию архива map-20kdm2.pk3(как это сделать – в 1 статье).
И сейчас начинается самое интересное! Мы загрузим наш уровень и сделаем так, чтобы для других объектов уровень был физически непроходим средствами IrrPhysX. Для этого мы объявим специальную переменную sceneDesc типа SSceneDesc, в которой будут записаны все физические объекты сцены, инициализируем физический менеджер, загрузим bsp-уровень, переберём все его элементы(bsp-файлы состоят из множества объектов, а не из одного цельного), сделаем их физически-прочными. Для этого мы пишем этот код:
Code

SSceneDesc sceneDesc;
physxManager = createPhysxManager(device, sceneDesc);

scene::IMesh* mesh = smgr->getMesh("20kdm2.bsp")->getMesh(0);
scene::ISceneNode* node = 0;
SPhysxAndNodePair* pair = new SPhysxAndNodePair;

core::vector3df pos(0,0,0);
core::vector3df rot(0,0,0);
core::vector3df scale(2,2,2);

for (u32 i = 0 ; i < mesh->getMeshBufferCount() ; i++)  
{
  IPhysxMesh* physxMesh = physxManager->createTriangleMesh(mesh->getMeshBuffer(i), scale);
  pair->PhysxObject = physxManager->createTriangleMeshObject(physxMesh, scale,rot);
}

pair->SceneNode = smgr->addMeshSceneNode(mesh, NULL, -1, pos, rot, scale);
pair->SceneNode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true);
objects.push_back(pair);

Далее объявляем fps-камеру, чтоб мы могли перемещаться в пространстве игрового мира.
Code

scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();
camera->setPosition(pos);
camera->setInputReceiverEnabled(true);

Отключаем видимость курсора, как и в первой статье. И теперь мы добавим некоторый код в главный цикл иррлихт-приложения. Во-первых, добавим обработчик клавиши C, при нажатии которой, мы будем «выстреливать» шариками, которые будут являться нашими физическими объектами. Также мы делаем, чтоб физика тоже обновлялась, а не только графика перерисовывалась. А также не забудем добавить в заголовок окна фпс и количество физических объектов.
Code

int lastFPS = -1;
  s32 lastTime = device->getTimer()->getTime();
  while(device->run())
  {  
  if(keys[KEY_KEY_C])
  {
  objects.push_back(createSphereFromCamera(physxManager, smgr, driver, camera, 8, objectDensity));
  }
   
  s32 timeNow = device->getTimer()->getTime();
  s32 elapsedTime = timeNow - lastTime;
  lastTime = timeNow;
   

  // Set the physics simulation going
  physxManager->simulate(elapsedTime/1000.0f);

  // Whilst we're waiting we can do some non-physics related work
  // you must NEVER add/move physics objects whilst the simulation
  // is being done though, doing so will cause all kinds of horrible crashes!
  core::stringw strw;
  strw = "FPS: ";
  strw += driver->getFPS();
   
  strw = "Num Objects: ";
  strw += physxManager->getNumPhysxObjects();
   

  // Wait for the physics simulation to finish
  physxManager->fetchResults();

  // Update our objects to the correct transformations
  for (u32 i = 0 ; i < objects.size() ; i++)  
  objects[i]->updateTransformation();
  driver->beginScene(true, true, video::SColor(255,200,200,200));
  smgr->drawAll();
  driver->endScene();
   
  int fps = driver->getFPS();

  if (lastFPS != fps)
  {
  core::stringw str = L"Irrlicht Engine - Quake 3 Map example [";
  str += driver->getName();
  str += "] FPS:";
  str += fps;

  device->setWindowCaption(str.c_str());
  lastFPS = fps;
  }
   
  }

А в конце мы обязаны очистить весь мусор, оставленный нами. Это мы делаем вот как:
Code

removePhysxManager(physxManager);
  physxManager = 0;
  device->drop();
  return 0;

Вот и всё! Летайте, стреляйте, смотрите! Все медиа-файлы из стандртного SDK иррлихта.

Ссылка для скачивания проекта исходников к статье!

Категория: Irrlicht & IrrPhysX | Добавил: Lefthandboy (13.09.2009) | Автор: Андрей aka LeftHandBoy aka Dronchik
Просмотров: 982 | Комментарии: 1 | Теги: .bsp, УРОК, пример, стрельба шариками, статья | Рейтинг: 0.0/0 |
Всего комментариев: 1
1  
статья хорошая,одобряю!
наверно,даже лучше моей cool

Имя *:
Email *:
Код *:
информация
Если куда-то нужно добавить новую категорию(например,в каталог статей,или файлов,или ещё куда-нибудь,оставьте просьбу на форуме.после добавления раздела(или НЕ добавления))тема и комментарии будут удалены.писать можно в принципе в любом разделе форума,всёравно удалю)) вопросы лучше задавать всётаки на форуме,или в ПМ, на мыло писать в крайних случаях,потомучто на мыло приходит много спама=)
важно
вся информация,опубликованная на данном ресурсе,свободна для любого использования
любой,кто выкладывает какую-либо информацию на данном ресурсе,соглашается с правилом,указанным выше
при публикации материалов,базированных на материалах ресурса irrphysx.at.ua,на других ресурсах, обязательна ссылка на ресурс irrphysx.at.ua
вся информация предоставляется бесплатно, и администрация не отвечает за действия пользователей
Форма входа
Поиск
Друзья сайта
наша кнопка
код нашей кнопки