自己看着英文文档,终于搞好了,让自己的食人魔 跳起舞来,想看看图片:
还可以吧,自己感觉呵呵。
接下来就是源码了:
- #include "Ogre/ExampleApplication.h"
- #include "ExampleFrameListener.h"
- #include "OIS.h"
- #include "OgreAnimation.h"
- #include "OgreAnimable.h"
- #include "OgreAnimationState.h"
- #include "OgreAnimationTrack.h"
- #include <iostream>
- class Example27FrameListener :public Ogre::FrameListener
- {
- public:
- Example27FrameListener(Ogre::SceneNode* node,
- Ogre::Entity* ent,
- RenderWindow * win,
- Ogre::Camera* cam)
- {
- //定义一个指向 渲染窗口的指针:win
- _node = node;
- //assign the cam to _Cam valueable
- _Cam = cam;
- _PolyMode = Ogre::PolygonMode::PM_SOLID;
- //定义实体entitiy
- _ent = ent;
- _aniState = ent->getAnimationState("Dance");
- _aniState ->setEnabled(true);
- _aniState ->setLoop(true);
- size_t windowHnd = 0;
- std::stringstream windowHndStr;
- win->getCustomAttribute("WINDOW",&windowHnd);
- //把窗口句柄转换成字符串
- windowHndStr <<windowHnd;
- //为OIS创建参数列表,把窗口句柄插入到列表中
- OIS::ParamList pl;
- //将“window”与str()连接
- pl.insert(std::make_pair(std::string("WINDOW"),windowHndStr.str()));
- //创建输入系统,并复制给_man
- _man = OIS::InputManager::createInputSystem(pl);
- //运用OIS键盘,获取用户输入
- _key = static_cast<OIS::Keyboard*>(_man->createInputObject(
- OIS::OISKeyboard,false));
- _mouse = static_cast<OIS::Mouse*>(_man->createInputObject(
- OIS::OISMouse,false));
- }
- bool frameStarted(const Ogre::FrameEvent &evt)
- {
- //捕获用户输入
- _key->capture();
- _mouse->capture();
- _timer.reset();
- if (_key->isKeyDown(OIS :: KC_ESCAPE))
- {
- //如果用户按下Esc 停止渲染帧退出
- return false;
- }
- //step 1 replace the :_node ->translate(Ogre::Vector3(0,0,0)*evt.timeSinceLastFrame);
- //让自己的Sinbad 动起来
- Ogre::Vector3 translate(0,0,0);//translate 为一个向量
- if (_key->isKeyDown(OIS::KC_S))
- {
- translate += Ogre::Vector3(0,0,10);
- }
- if (_key->isKeyDown(OIS::KC_W))
- {
- translate += Ogre::Vector3(0,0,-10);
- }
- if (_key->isKeyDown(OIS::KC_A))
- {
- translate +=Ogre::Vector3(-10,0,0);
- }
- if (_key->isKeyDown(OIS::KC_D))
- {
- translate +=Ogre::Vector3(10,0,0);
- }
- // 渲染模式更改
- if (_key->isKeyDown(OIS::KC_R))
- {
- //set a circle for the different mode
- if(_PolyMode == PM_SOLID)
- {
- _PolyMode = Ogre::PolygonMode::PM_WIREFRAME;
- }
- else if (_PolyMode == PM_WIREFRAME)
- {
- _PolyMode = Ogre::PolygonMode::PM_POINTS;
- }
- else if (_PolyMode == PM_POINTS)
- {
- _PolyMode = Ogre::PolygonMode::PM_SOLID;
- }
- }
- // timer detect
- if (_key->isKeyDown(OIS::KC_R) && _timer.getMilliseconds()>250)
- {
- _timer.reset();
- }
- //Remove the line translate node:
- /*_node->translate(translate* evt.timeSinceLastFrame);*/
- float rotX = _mouse->getMouseState().X.rel*evt.timeSinceLastFrame *(-1);
- float rotY = _mouse->getMouseState().Y.rel*evt.timeSinceLastFrame *(-1);
- _Cam->yaw(Ogre::Radian(rotX));
- _Cam->pitch(Ogre::Radian(rotY));
- _Cam->moveRelative(translate* evt.timeSinceLastFrame*_movementspeed);
- _node->translate(translate* evt.timeSinceLastFrame);
- _aniState->addTime(evt.timeSinceLastFrame);
- _timer.reset();
- _Cam->setPolygonMode(_PolyMode);
- return true;
- }
- Example27FrameListener(Ogre::SceneNode node)
- {
- FrameListener = NULL;
- }
- ~Example27FrameListener()
- {
- //销毁输入对象
- _man->destroyInputObject(_key);
- _man->destroyInputObject(_mouse);
- //销毁输入系统
- OIS::InputManager::destroyInputSystem(_man);
- if (FrameListener)
- {
- delete FrameListener;
- }
- }
- private:
- Ogre::SceneNode* _node;
- Ogre::FrameListener* FrameListener;
- OIS::InputManager* _man;
- OIS::Keyboard* _key;
- Ogre::Camera* _Cam;
- OIS::Mouse* _mouse;
- //static const float _movementspeed= 10只有静态常量整型数据成员才可以在类中初始化
- static const int _movementspeed= 2;
- Ogre::PolygonMode _PolyMode;
- Ogre::Timer _timer;
- Ogre::Entity* _ent;
- Ogre::AnimationState* _aniState;
- };
- class Example :public ExampleApplication
- {
- public :
- void createScene()//just realize virtual function createScene 就可以了
- {
- Ogre::Plane plane(Vector3::UNIT_Y,-10);
- Ogre::MeshManager::getSingleton().createPlane("plane",
- ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,
- 1500,1500,200,200,true, 1,5,5,Vector3::UNIT_Z);
- Ogre::Entity* ent =
- mSceneMgr->createEntity("LightPlaneEntity","plane");
- // Attation please; must add this dialog;
- mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
- ent->setMaterialName("Examples/BeachStones");
- Ogre::Light* light = mSceneMgr->createLight("Light1");
- light->setType(Ogre::Light::LT_DIRECTIONAL);
- light->setDirection(Ogre::Vector3(1,-1,0));
- Ogre::SceneNode * node = mSceneMgr->createSceneNode("Node1");
- mSceneMgr->getRootSceneNode()->addChild(node);
- //Ogre::Entity* Sinbad = mSceneMgr->createEntity("Sinbad","Sinbad.mesh");
- _SinbadEnt = mSceneMgr->createEntity("Sinbad","Sinbad.mesh");
- _SinbadNode = node->createChildSceneNode("SinbadNode");
- _SinbadNode->setScale(3.0f,3.0f,3.0f);
- _SinbadNode->setPosition(Ogre::Vector3( 0.0f, 4.0f, 0.0f));
- _SinbadNode->attachObject(_SinbadEnt);
- mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
- }
- // Overrode the createCamera () function
- void createCamera()
- {
- mCamera = mSceneMgr->createCamera("MyCamera1");
- mCamera->setPosition(0,100,200);
- mCamera->lookAt(0,0,0);
- mCamera->setNearClipDistance(5);
- }
- void createFrameListener( )
- {
- Example27FrameListener* Framelistener= new Example27FrameListener(_SinbadNode,_SinbadEnt,mWindow,mCamera);//就是在这里依照类里定义的构造函数实例化
- mRoot->addFrameListener(Framelistener);
- }
- private:
- Ogre::SceneNode* _SinbadNode;
- Ogre::Entity* _SinbadEnt;
- };
- // Listoner Framwork
- int main(void)
- {
- Example app;
- app.go();
- return 0;
- }