Ryen的学习笔记

成长有多少新奇的美,就有多少撕裂的痛;离去有多么辽阔的自由,就有多么无边的孤寂。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Ogre的状态框架

Posted on 2009-12-28 17:15  Ryen_lee  阅读(456)  评论(0)    收藏  举报

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;
};