📄 collisiondemo.h
字号:
#ifndef __COLLISIONTEST_H__
# define __COLLISIONTEST_H__ 1
# include "ExampleApplication.h"
# include "HeadEntity.h"
# include "FloorEntity.h"
enum EntityStates
{
ENTITY_NEW = 1,
ENTITY_MOVING
};
class CollisionDemoFrameListener : public ExampleFrameListener
{
private:
Ogre::SceneManager* mSceneMgr;
HeadEntity* mCurrentEntity;
typedef std::vector<GameEntity*> EntityList;
EntityList entityList;
unsigned int count;
unsigned int state;
public:
CollisionDemoFrameListener(Ogre::RenderWindow* win, Ogre::Camera* cam,
Ogre::SceneManager* mgr)
: ExampleFrameListener(win, cam),
mSceneMgr(mgr),
mCurrentEntity(0),
count(0),
state(ENTITY_NEW)
{
FloorEntity* fp = new FloorEntity(mSceneMgr);
// setup entity and collision detection
fp->initialise();
entityList.push_back(fp);
}
~CollisionDemoFrameListener()
{
entityList.clear();
}
bool frameStarted(const Ogre::FrameEvent& evt)
{
if(!ExampleFrameListener::frameStarted(evt))
return false;
switch(state)
{
case ENTITY_NEW:
if(count > 2)
return true;
// create new game entity
mCurrentEntity = new HeadEntity(mSceneMgr);
// setup entity and collision detection
mCurrentEntity->initialise();
// set the starting position of the entity
//mCurrentEntity->setPosition(0, 0, 0);
state = ENTITY_MOVING;
count++;
break;
case ENTITY_MOVING:
mCurrentEntity->translate(0, -1, 0);
break;
}
for(EntityList::iterator i = entityList.begin(); i != entityList.end();
i++)
{
if((*i)->collide(mCurrentEntity))
{
entityList.push_back(mCurrentEntity);
state = ENTITY_NEW;
break;
}
}
return true;
}
};
class CollisionDemoApplication : public ExampleApplication
{
private:
Ogre::CollisionManager* mCollisionMgr;
public:
CollisionDemoApplication()
: mCollisionMgr(0) { }
~CollisionDemoApplication()
{
delete mCollisionMgr;
}
protected:
// Just override the mandatory create scene method
void createScene(void)
{
// Set ambient light
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Create a skydome
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
// Create a light
Ogre::Light* l = mSceneMgr->createLight("MainLight");
// Accept default settings: point light, white diffuse, just set position
// NB I could attach the light to a SceneNode if I wanted it to move automatically with
// other objects, but I don't
l->setPosition(20,80,50);
}
// Create new frame listener
void createFrameListener(void)
{
mFrameListener =
new CollisionDemoFrameListener(mWindow, mCamera, mSceneMgr);
mRoot->addFrameListener(mFrameListener);
}
bool setup()
{
// Instanciate the CollisionManager singleton
mCollisionMgr = new Ogre::CollisionManager();
ExampleApplication::setup();
Ogre::LogManager::getSingleton().setLogDetail( Ogre::LL_BOREME );
return true;
}
};
#endif // __COLLISIONTEST_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -