Ogre的状态框架

Ogre的状态框架可以参照官网上的这篇Wiki: Advanced Ogre Framework . 基本思路就是通过一个状态机基类来实现游戏中各个状态的切换(如魔兽争霸中的:主菜单, 游戏状态,游戏暂停,游戏中菜单,游戏退出等)。

 

template class State { public: State(T* _t, std::string _name = "State") { mOwner = _t; mName = _name; } virtual void enter() = 0; virtual void exit() = 0; virtual bool pause() = 0; virtual void resume() = 0; virtual void update(double timeSinceLastFrame) = 0; virtual void postFrame()=0; virtual ~State(){}; std::string getName(){return mName;} protected: T* mOwner; std::string mName; };

 

上面的代码是我根据《游戏人工智能编程案例精粹》中状态机实现的状态类。这种设计是考虑到状态的拥有者可以有不同的层级,比如可以是Application(即整个游戏,游戏会有各种不同的状态),也可以是游戏中的一个NPC(他的进攻,逃跑等状态),而所有状态都基本上都是由这几个函数构成,因此通过参数以及C++模板将拥有者和状态分离,增强了其可复用性。

    例如游戏状态的构建可由下面代码构成:

class GameState : public State, public OIS::KeyListener, public OIS::MouseListener { public: GameState(Application*, std::string _name = "GameState"); virtual void enter(); virtual void exit(); virtual bool pause() ; virtual void resume() ; virtual void update(double timeSinceLastFrame); virtual void postFrame(); virtual ~GameState(){}; bool keyPressed(const OIS::KeyEvent &keyEventRef); bool keyReleased(const OIS::KeyEvent &keyEventRef); bool mouseMoved(const OIS::MouseEvent &arg); bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id); bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id); private: void processUnbufferKeyInput(); Ogre::Camera* mCamera; Ogre::SceneManager* mSceneMgr; bool mIsLMouseDown, mIsRMouseDown; double mMoveScale, mMoveSpeed; Ogre::Vector3 mTranslateVector; Scene* mScene; };

你可能感兴趣的:(游戏开发,框架,游戏,application,string,vector,class)