forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   IrrLicht - для новичков (http://forum.boolean.name/showthread.php?t=3832)

Miks 05.07.2007 23:52

IrrLicht - для новичков
 
Урааа, наконец-то я нашол хоть один русский форум где обсуждают IrrLicht.
Я только начал использовать этот движок, и хотел бы попросить вашей помощи - уважаемые форумчане.
Что я знаю: прочитал и изучил все стандартные manual - 15штук.
Что я хочу знать: всё что вообще возможно знать по созданию игр на данном движке.

До недавнего времени у меня пока всё получалось - загружал стандартные pk3 уровни и т.д. Но вот попал в такую засаду - загрузка собственного уровня. Я сделал уровень в программе: Cartography Shop - сохранил его, но при загрузке - он просто булый или вообще ничего не показывает.
Как сохранить уровень так, чтобы движок нормально его загружал вместе с текстурами? Загружаю вот так:
smgr->loadScene("../../media/Miks.csm");

Если есть способ получше - посоветуйте пожалуйста, как - а главное в чем лучше сделать карту и как лучше её загрузить. Заранее благодарю всех.

jimon 06.07.2007 00:04

Re: IrrLicht - для новичков
 
Miks
не знаю где ты такое вычитал ... но loadScene ето не тоже самое что загрузить уровень

представь что ты имееш на уровне дофига обьектов, у каждого куча параметров и тд ... ето называется сценой и сцену в irrlichtе можно сохранять\грузить используя встроенные команды
формат файлов сцены свой, .irr ... основан на xml :)
лан ето в теории

короче так делать нельзя
дам тебе совет как делать по проще :
скачай irrEdit ... и создай там свою сцену
а потом ее грузи в irrlicht'е, дело в том что на "ощупь" по началу трудно в ирлихте понять что к чему, а так ты можеж попробовать все штучки визуально и убедится что работает не так

а вообще грузить надо было так
IAnimatedMesh * mesh = scmr->getMesh(model_name.c_str());
Model = scmr->addAnimatedMeshSceneNode(mesh);

Miks 06.07.2007 12:17

Re: IrrLicht - для новичков
 
Я сделал уровень в IrrEdit - сохранил его с форматом .irr. Загрузил smgr->loadScene("../../media/Miks.irr"); - так описанно в 15-ом офф уроке. Он загружается вообще без текстур - просто всё белое с небольшим очертанием стен и т.п. Как сделать так, чтобы уровень загружался полность с текстурами - так как мне нужно(куда и как нужно сохранять текстуры, или что вообще нужно делать(стандартные уровни example.irr грузятся нормально))?

jimon 06.07.2007 13:15

Re: IrrLicht - для новичков
 
Miks
хм, а какие ты текстуры используеш ?
если ты не уверен точно
то открой свой .irr файл блокнотом и поищи там ссылки на файлы
к примеру
<string name="Mesh" value="../../media/room.3ds" />

15 пример собсно лежит в папке /bin/ и открывает ../../media/example.irr
но использует он пути записаные в етом файле как глобальный относительно exe !

тоесть если в irr файле будет написано
<string name="Mesh" value="room.3ds" />
а сам файл будет лежать в папке media
то room.3ds irrlicht будет искать в папке с exe :) а не в папке с файлом сцены

в irrEdit есть полезная фича для такого
открой файл irrEdit\scripts\autostart_setworking_directory.nut блокнотом
там собсно строчка
// irrSetWorkingDirectory("C:\\path\\to\\your\\game") ;
переделай ее на типа так
irrSetWorkingDirectory("C:\\blablabla\\mygame");
чтобы она указывала на папку с игрой

после етого irrEdit будет сам вписывать пути относительно exe :)

ps. ничего страшного что просто запутался с путями

Miks 06.07.2007 13:22

Re: IrrLicht - для новичков
 
Огромное тебе спасибо за помощ, сейчас всё попробую :)

DRAG 13.11.2007 18:38

Re: IrrLicht - для новичков
 
Дарофа всем :)
Я кстаи тоже ещё не видел нормальных сайтов(русских) по
irr, если и есть, то статьи - это перевод тутора который идёт с двигом, а если есть другие, то написаные за 5минут, и в которых толком нечего не оюъясняют:(

magpro 13.11.2007 21:01

Re: IrrLicht - для новичков
 
Цитата:

Сообщение от Miks
Урааа, наконец-то я нашол хоть один русский форум где обсуждают IrrLicht.


Дай ссылочку

XenuS 13.11.2007 21:17

Re: IrrLicht - для новичков
 
это же он про булку=)))

magpro 14.11.2007 12:50

Re: IrrLicht - для новичков
 
=)
Ясно)

Данил 14.11.2007 14:58

Re: IrrLicht - для новичков
 
Гы, я тож в начале не понял, что он про булку. Тож хотел сссылку попросить ^_^

Dronchik 10.02.2008 16:21

Ответ: IrrLicht - для новичков
 
Приветствую всех. Пробую этот код для создания колизий .irr сцены
Код:

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

// Used for getting Desktop Resolution
#include <windows.h>

using namespace irr;
using namespace irr::core;
using namespace irr::scene;

IrrlichtDevice *intro = 0;
video::IVideoDriver* driver = 0;
scene::ISceneManager* smgr;
scene::IMetaTriangleSelector* metaSelector;
scene::ISceneNodeAnimatorCollisionResponse* anim;
ICameraSceneNode* camera = 0;

bool fin1;

void recursiveFillMetaSelector(scene::ISceneNode* node, scene::IMetaTriangleSelector* meta )
{
  //
  // the following if is basically the same as ISceneNode_assignTriangleSelector
  //
  printf ("Node name is: %s \n",node->getName());
  printf ("Node id is: %d \n",node->getID());
  printf ("Node type:");
  //  printf ("Node type: %s=",smgr->getSceneNodeTypeName());
  if (node->getType() ==  ESNT_UNKNOWN) printf("Unknown mesh type \n\n");
  if (node->getType() ==  ESNT_MESH) printf("Standard Mesh \n\n");
  if (node->getType() ==  ESNT_ANIMATED_MESH) printf("Animated Mesh! \n\n");
  if (node->getType() ==  ESNT_SKY_BOX) printf("SkyBox! \n\n");
  if (node->getType() ==  ESNT_CAMERA_FPS) printf("Fps Camera! \n\n");
  if (node->getType() ==  ESNT_CAMERA_MAYA ) printf("Maya Camera! \n\n");
  if (node->getType() ==  ESNT_CAMERA )
  { printf("STD Camera! \n");
  printf ("The current position of this camera is: %f,%f,%f\n\n",node->getPosition().X,node->getPosition().Y,node->getPosition().Z);
  camera->setPosition(node->getPosition());
  }
  if (node->getType() ==  ESNT_PARTICLE_SYSTEM ) printf("Particles! \n\n");
  if (node->getType() ==  ESNT_LIGHT  ) printf("Light! \n\n");
  if (node->getType() ==  ESNT_OCT_TREE)
  {
      // Occ Trees are for land
      printf("Occtree! \n");
      io::IAttributes* attribs = intro->getFileSystem()->createEmptyAttributes();
      if (attribs)
        {// get the mesh name out
        node->serializeAttributes(attribs);
        core::stringc name = attribs->getAttributeAsString("Mesh");
        attribs->drop();
        // get the animated mesh for the object
        scene::IAnimatedMesh* mesh = smgr->getMesh(name.c_str());
        if (mesh)
        {
            scene::ITriangleSelector* selector =
            smgr->createOctTreeTriangleSelector(mesh->getMesh(0), node, 128);
            node->setTriangleSelector(selector);
            metaSelector->addTriangleSelector(selector);
            selector->drop();
        }

    }

  } 
  // now recurse on children...
  core::list<scene::ISceneNode*>::ConstIterator begin = node->getChildren().begin();
  core::list<scene::ISceneNode*>::ConstIterator end  = node->getChildren().end();

  for (; begin != end; ++begin)
    recursiveFillMetaSelector(*begin, meta);
}


int main()
{
    // Get the full desktop size from Windows.H
    // First the width
    int nWidth = GetSystemMetrics(0);
    // Second the Height
    int nHeight = GetSystemMetrics(1);
    intro = createDevice(video::EDT_DIRECT3D9, core::dimension2d<s32>(1024, 768), 32, false, true, true);
    driver = intro->getVideoDriver();
    smgr = intro->getSceneManager();

    core::stringw str = "Level Demo";
  intro->setWindowCaption(str.c_str());

// Define the Keyboard to use for the camera moves
    SKeyMap keyMap[9];
    keyMap[0].Action = EKA_MOVE_FORWARD;
  keyMap[0].KeyCode = KEY_UP;
  keyMap[1].Action = EKA_MOVE_FORWARD;
  keyMap[1].KeyCode = KEY_KEY_W;

  keyMap[2].Action = EKA_MOVE_BACKWARD;
  keyMap[2].KeyCode = KEY_DOWN;
  keyMap[3].Action = EKA_MOVE_BACKWARD;
  keyMap[3].KeyCode = KEY_KEY_S;

  keyMap[4].Action = EKA_STRAFE_LEFT;
  keyMap[4].KeyCode = KEY_LEFT;
  keyMap[5].Action = EKA_STRAFE_LEFT;
  keyMap[5].KeyCode = KEY_KEY_A;

  keyMap[6].Action = EKA_STRAFE_RIGHT;
  keyMap[6].KeyCode = KEY_RIGHT;
  keyMap[7].Action = EKA_STRAFE_RIGHT;
  keyMap[7].KeyCode = KEY_KEY_D;

  keyMap[8].Action = EKA_JUMP_UP;
  keyMap[8].KeyCode = KEY_SPACE ;

                // Setup the ZIP file "MyLevel.pk3" to be read directly
      //intro->getFileSystem()->addZipFileArchive("levels/MyLevel.pk3");
                // Load the scene file from the archive
  smgr->loadScene("irr.irr");

  camera = smgr->addCameraSceneNodeFPS(0, 120.0f, 120.0f, -1, keyMap, 9, true,0.25f);
      camera->setRotation(core::vector3df(0,135,0));
      camera->setFarValue(11000.0);
      camera->setAspectRatio(16/10);
      camera->setFOV(PI/2.5);
    metaSelector = smgr->createMetaTriangleSelector();
  recursiveFillMetaSelector( smgr->getRootSceneNode(), metaSelector );
  // DEfine the collision reponse for the FPS Camera
  anim = smgr->createCollisionResponseAnimator(  metaSelector, camera, core::vector3df(10,26,10),
      //metaSelector, camera, core::vector3df(10,26,10),
      core::vector3df(0,-2.0f,0),
      core::vector3df(0,24,0));
  camera->addAnimator(anim);
  anim->drop();
    metaSelector->drop();
    while(intro->run() && fin1==false)
  {
      if (intro->isWindowActive())
      {
        driver->beginScene(true, true, video::SColor(0,0,0,0));
        smgr->drawAll();
        driver->endScene();
      }
  }
  intro->closeDevice();
    return 0;
}

Получаеться простое падение сквозь ирр сцену. А колизий нет. Как сделать чтоб появилась проверка колизий?

Dronchik 29.02.2008 14:31

Ответ: IrrLicht - для новичков
 
Мне нужно было сделать колизии. Вот какое решение проблемы:
Код:

scene::IAnimatedMesh* l1v3levelmesh = smgr->getMesh("objects/land/level2.b3d");
  scene::ISceneNode* l1v3node = 0;

  driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);

 if (l1v3levelmesh)
    l1v3node = smgr->addOctTreeSceneNode(l1v3levelmesh->getMesh(0));
 scene::ITriangleSelector* selector = 0;

  if (l1v3node)
  {   
    l1v3node->setPosition(core::vector3df(0,-52,0));
    selector = smgr->createOctTreeTriangleSelector(l1v3levelmesh->getMesh(0), l1v3node, 128);
    l1v3node->setTriangleSelector(selector);
    selector->drop();
  }
  l1v3node->getMaterial(0).SpecularColor.set(0,0,0,0);

 scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
    selector, camera, core::vector3df(30,10,30),
    core::vector3df(0,-2,0),
    core::vector3df(0,50,0));
  camera->addAnimator(anim);
  anim->drop();

Сдесь загружаеться сцена в формате b3d( другие не колизяться) и создаёться детектирование колизий.


Часовой пояс GMT +4, время: 01:33.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot