Adding a Door

From IrrWizard

Jump to: navigation, search

Adding a Door using a FlyStraightAnimator

Create a function that adds doors for level 1 in the CGameStateLevel01 class and declare it in the header file.

//! Add DOORS to level
void CGameStateLevel01::addDoors(CGameManager* pManager)
{
   scene::IAnimatedMesh* doorMesh = 0;
   doorMesh = pManager->getSceneManager()->getMesh("media/portcullis.3DS");
    
   // Create a GameItem object to add to the CgameItemManager
   CGameItem* door = new CGameItem(GAME_ITEM_DOOR); 
   door->setMeshNode(pManager->getSceneManager()->addAnimatedMeshSceneNode(doorMesh));
   if (door->getMeshNode())
   {
       door->getMeshNode()->setMaterialTexture(0, pManager->getDriver()->
             getTexture ("media/portcullis.jpg"));
       door->getMeshNode()->setPosition(core::vector3df(-265, 65, -245));
       door->getMeshNode()->setScale(core::vector3df(1.1,1.5,1));
       door->getMeshNode()->setRotation(core::vector3df(0,90,0));
       door->getMeshNode()->setMaterialFlag(video::EMF_LIGHTING, false);
       door->getMeshNode()->setID(GAME_ITEM_DOOR); 
       door->setTriggerRegion(130);
       pManager->getItemManager()->AddItem(door);
        
       // Add collision detection, don't want players walking through door.
      	irr::scene::ITriangleSelector* doorSelector = pManager->
             getSceneManager()->createTriangleSelectorFromBoundingBox(door->getMeshNode()); 
       if(doorSelector) pManager->getMetaSelector()->addTriangleSelector(doorSelector); 
   }
}

Now call this new function from within the Init() function of CGameStateLevel01 below:

//! Initialisation, loads data required for level
void CGameStateLevel01::Init(CGameManager* pManager)
{
   ...
   addDoors(pManager);
   ...
}

Change the CGameItemManager::processTriggerDoor(CGameManager* pManager, CGameItem* pItem) function to the same as below, (CGameItemManager is in the 'core' folder).

//! DOOR Trigger activated
void CGameItemManager::processTriggerDoor(CGameManager* pManager, CGameItem* pItem)
{
       // non animated door, using a FlyStraightAnimator
       core::vector3df start = pItem->getMeshNode()->getPosition();
       core::vector3df end = start;
       end.Y = end.Y + 120;
       ISceneNodeAnimator* anim = pManager->getSceneManager()->
           createFlyStraightAnimator(start, end, 3000, false);
       pItem->getMeshNode()->addAnimator(anim);
}

Compile and run. This should produce a door that raises automatically when the player moves within it's trigger radius. The speed can be altered by reducing the 3rd parameter of the createFlyStraightAnimator function, in this case 3000.

door01.jpg

Personal tools