让自己的 游戏 Sinbad 跳舞(附加游戏源码)

自己看着英文文档,终于搞好了,让自己的食人魔 跳起舞来,想看看图片:

还可以吧,自己感觉呵呵。

接下来就是源码了:

Code:
  1. #include "Ogre/ExampleApplication.h"  
  2. #include "ExampleFrameListener.h"  
  3. #include "OIS.h"  
  4. #include "OgreAnimation.h"  
  5. #include "OgreAnimable.h"  
  6. #include "OgreAnimationState.h"  
  7. #include "OgreAnimationTrack.h"  
  8. #include <iostream>   
  9.   
  10. class Example27FrameListener :public Ogre::FrameListener   
  11. {   
  12. public:   
  13.   
  14.     Example27FrameListener(Ogre::SceneNode* node,   
  15.                             Ogre::Entity* ent,   
  16.                             RenderWindow * win,   
  17.                             Ogre::Camera* cam)   
  18.     {   
  19.         //定义一个指向 渲染窗口的指针:win   
  20.         _node =  node;   
  21.   
  22.         //assign the cam to _Cam valueable   
  23.         _Cam  =  cam;   
  24.   
  25.         _PolyMode = Ogre::PolygonMode::PM_SOLID;   
  26.   
  27.         //定义实体entitiy   
  28.         _ent = ent;   
  29.   
  30.         _aniState = ent->getAnimationState("Dance");   
  31.         _aniState ->setEnabled(true);   
  32.         _aniState ->setLoop(true);   
  33.   
  34.         size_t  windowHnd = 0;   
  35.   
  36.         std::stringstream windowHndStr;   
  37.   
  38.         win->getCustomAttribute("WINDOW",&windowHnd);   
  39.         //把窗口句柄转换成字符串   
  40.         windowHndStr <<windowHnd;   
  41.         //为OIS创建参数列表,把窗口句柄插入到列表中   
  42.         OIS::ParamList pl;   
  43.         //将“window”与str()连接   
  44.         pl.insert(std::make_pair(std::string("WINDOW"),windowHndStr.str()));   
  45.         //创建输入系统,并复制给_man   
  46.         _man = OIS::InputManager::createInputSystem(pl);   
  47.         //运用OIS键盘,获取用户输入   
  48.         _key = static_cast<OIS::Keyboard*>(_man->createInputObject(   
  49.             OIS::OISKeyboard,false));      
  50.            
  51.         _mouse = static_cast<OIS::Mouse*>(_man->createInputObject(   
  52.             OIS::OISMouse,false));   
  53.     }   
  54.   
  55.   
  56.     bool frameStarted(const Ogre::FrameEvent &evt)   
  57.     {   
  58.         //捕获用户输入   
  59.         _key->capture();   
  60.         _mouse->capture();   
  61.         _timer.reset();   
  62.         if (_key->isKeyDown(OIS :: KC_ESCAPE))   
  63.         {   
  64.             //如果用户按下Esc 停止渲染帧退出   
  65.             return false;   
  66.         }   
  67.         //step 1 replace the :_node ->translate(Ogre::Vector3(0,0,0)*evt.timeSinceLastFrame);   
  68.         //让自己的Sinbad 动起来   
  69.         Ogre::Vector3 translate(0,0,0);//translate 为一个向量   
  70.         if (_key->isKeyDown(OIS::KC_S))   
  71.         {   
  72.             translate += Ogre::Vector3(0,0,10);   
  73.         }   
  74.         if (_key->isKeyDown(OIS::KC_W))   
  75.         {   
  76.             translate += Ogre::Vector3(0,0,-10);   
  77.         }   
  78.         if (_key->isKeyDown(OIS::KC_A))   
  79.         {   
  80.             translate +=Ogre::Vector3(-10,0,0);   
  81.         }   
  82.         if (_key->isKeyDown(OIS::KC_D))   
  83.         {   
  84.             translate +=Ogre::Vector3(10,0,0);   
  85.         }   
  86.         //   渲染模式更改   
  87.         if (_key->isKeyDown(OIS::KC_R))   
  88.         {   
  89.             //set a circle for the different mode   
  90.             if(_PolyMode == PM_SOLID)   
  91.             {   
  92.                 _PolyMode = Ogre::PolygonMode::PM_WIREFRAME;   
  93.             }   
  94.             else if (_PolyMode == PM_WIREFRAME)   
  95.             {   
  96.                 _PolyMode = Ogre::PolygonMode::PM_POINTS;   
  97.             }   
  98.             else if (_PolyMode == PM_POINTS)   
  99.             {   
  100.                 _PolyMode = Ogre::PolygonMode::PM_SOLID;   
  101.             }   
  102.         }   
  103.         // timer detect   
  104.         if (_key->isKeyDown(OIS::KC_R) && _timer.getMilliseconds()>250)   
  105.         {   
  106.             _timer.reset();   
  107.         }   
  108.   
  109.         //Remove the line translate node:   
  110.         /*_node->translate(translate* evt.timeSinceLastFrame);*/  
  111.         float rotX = _mouse->getMouseState().X.rel*evt.timeSinceLastFrame *(-1);   
  112.         float rotY = _mouse->getMouseState().Y.rel*evt.timeSinceLastFrame *(-1);   
  113.            
  114.         _Cam->yaw(Ogre::Radian(rotX));   
  115.         _Cam->pitch(Ogre::Radian(rotY));   
  116.         _Cam->moveRelative(translate* evt.timeSinceLastFrame*_movementspeed);   
  117.         _node->translate(translate* evt.timeSinceLastFrame);   
  118.         _aniState->addTime(evt.timeSinceLastFrame);   
  119.   
  120.         _timer.reset();   
  121.         _Cam->setPolygonMode(_PolyMode);   
  122.         return true;   
  123.     }   
  124.   
  125.     Example27FrameListener(Ogre::SceneNode node)   
  126.     {   
  127.   
  128.         FrameListener = NULL;   
  129.     }   
  130.     ~Example27FrameListener()   
  131.     {   
  132.         //销毁输入对象   
  133.         _man->destroyInputObject(_key);   
  134.         _man->destroyInputObject(_mouse);   
  135.         //销毁输入系统   
  136.         OIS::InputManager::destroyInputSystem(_man);   
  137.   
  138.         if (FrameListener)   
  139.         {   
  140.             delete FrameListener;   
  141.         }   
  142.     }   
  143.   
  144. private:   
  145.     Ogre::SceneNode* _node;   
  146.     Ogre::FrameListener* FrameListener;   
  147.     OIS::InputManager* _man;   
  148.     OIS::Keyboard* _key;   
  149.     Ogre::Camera* _Cam;   
  150.     OIS::Mouse* _mouse;   
  151.     //static const float  _movementspeed= 10只有静态常量整型数据成员才可以在类中初始化   
  152.     static const int  _movementspeed= 2;   
  153.     Ogre::PolygonMode _PolyMode;   
  154.     Ogre::Timer _timer;   
  155.     Ogre::Entity* _ent;   
  156.     Ogre::AnimationState* _aniState;   
  157.   
  158. };   
  159.   
  160. class Example :public ExampleApplication   
  161. {   
  162. public :   
  163.     void createScene()//just realize virtual function createScene 就可以了   
  164.     {   
  165.         Ogre::Plane plane(Vector3::UNIT_Y,-10);   
  166.   
  167.         Ogre::MeshManager::getSingleton().createPlane("plane",   
  168.             ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,   
  169.             1500,1500,200,200,true, 1,5,5,Vector3::UNIT_Z);   
  170.            
  171.         Ogre::Entity* ent =    
  172.             mSceneMgr->createEntity("LightPlaneEntity","plane");   
  173.   
  174.             //  Attation please; must add this dialog;   
  175.         mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);   
  176.   
  177.         ent->setMaterialName("Examples/BeachStones");   
  178.   
  179.         Ogre::Light* light = mSceneMgr->createLight("Light1");   
  180.         light->setType(Ogre::Light::LT_DIRECTIONAL);   
  181.         light->setDirection(Ogre::Vector3(1,-1,0));   
  182.   
  183.   
  184.         Ogre::SceneNode * node = mSceneMgr->createSceneNode("Node1");   
  185.         mSceneMgr->getRootSceneNode()->addChild(node);   
  186.   
  187.         //Ogre::Entity* Sinbad = mSceneMgr->createEntity("Sinbad","Sinbad.mesh");   
  188.            
  189.         _SinbadEnt = mSceneMgr->createEntity("Sinbad","Sinbad.mesh");   
  190.   
  191.         _SinbadNode = node->createChildSceneNode("SinbadNode");   
  192.         _SinbadNode->setScale(3.0f,3.0f,3.0f);   
  193.         _SinbadNode->setPosition(Ogre::Vector3( 0.0f, 4.0f, 0.0f));   
  194.         _SinbadNode->attachObject(_SinbadEnt);   
  195.         mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);   
  196.   
  197.     }   
  198.     //  Overrode the createCamera () function    
  199.        
  200.     void createCamera()   
  201.     {   
  202.         mCamera = mSceneMgr->createCamera("MyCamera1");   
  203.         mCamera->setPosition(0,100,200);   
  204.         mCamera->lookAt(0,0,0);   
  205.         mCamera->setNearClipDistance(5);   
  206.     }   
  207.   
  208.     void createFrameListener( )   
  209.     {   
  210.         Example27FrameListener* Framelistener= new Example27FrameListener(_SinbadNode,_SinbadEnt,mWindow,mCamera);//就是在这里依照类里定义的构造函数实例化   
  211.         mRoot->addFrameListener(Framelistener);   
  212.     }   
  213.   
  214.   
  215. private:   
  216.     Ogre::SceneNode* _SinbadNode;   
  217.     Ogre::Entity* _SinbadEnt;   
  218.   
  219. };   
  220.   
  221. //  Listoner Framwork   
  222.   
  223. int main(void)   
  224. {   
  225.   
  226.     Example app;   
  227.     app.go();   
  228.     return 0;   
  229. }   
  230.   

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值