Adding a Door
From IrrWizard
[edit]
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.
