⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 collisiondemo.h

📁 使用stl技术,(还没看,是听说的)
💻 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 + -