Ogre的状态框架可以参照官网上的这篇Wiki: Advanced Ogre Framework. 基本思路就是通过一个状态机基类来实现游戏中各个状态的切换(如魔兽争霸中的:主菜单, 游戏状态,游戏暂停,游戏中菜单,游戏退出等)。
代码
template <typename T>
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<Application>, 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;
};
浙公网安备 33010602011771号