【笔记】五、带缓冲的输入

class TutorialFrameListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener { public: TutorialFrameListener(RenderWindow* win, Camera* cam, SceneManager *sceneMgr) : ExampleFrameListener(win, cam, true, true)// "true, true"参数指明了将要使用带缓冲的键盘鼠标输入。 { mCamNode = cam->getParentSceneNode(); mSceneMgr = sceneMgr; // 设置旋转和移动速度 mRotate = 0.13; mMove = 250; // 继续渲染 mContinue = true; // 调用输入对象的setEventCallback方法,把TutorialFrameListener注册成一个监听器。 mMouse->setEventCallback(this); mKeyboard->setEventCallback(this); mDirection = Vector3::ZERO;// 初始化为0向量 } bool frameStarted(const FrameEvent &evt) { if(mMouse) mMouse->capture(); if(mKeyboard) mKeyboard->capture(); mCamNode->translate(mDirection * evt.timeSinceLastFrame, Node::TS_LOCAL); return mContinue; } // 鼠标监听 bool mouseMoved(const OIS::MouseEvent &e) {// 右键移动进入自由监听模式 if (e.state.buttonDown(OIS::MB_Right)) { mCamNode->yaw(Degree(-mRotate * e.state.X.rel), Node::TS_WORLD); mCamNode->pitch(Degree(-mRotate * e.state.Y.rel), Node::TS_LOCAL); } return true; } bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id) { // 左键按下打开或者关闭灯光 Light *light = mSceneMgr->getLight("Light1"); switch (id) { case OIS::MB_Left: light->setVisible(! light->isVisible()); break; } return true; } bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id) { return true; } // 键盘监听 bool keyPressed(const OIS::KeyEvent &e) { switch (e.key) { case OIS::KC_ESCAPE: // 退出 mContinue = false; break; case OIS::KC_1:// 将摄像头移动到第一个场景结点 mCamera->getParentSceneNode()->detachObject(mCamera); mCamNode = mSceneMgr->getSceneNode("CamNode1"); mCamNode->attachObject(mCamera); break; case OIS::KC_2:// 将摄像头移动到第二个场景结点 mCamera->getParentSceneNode()->detachObject(mCamera); mCamNode = mSceneMgr->getSceneNode("CamNode2"); mCamNode->attachObject(mCamera); break; case OIS::KC_UP: case OIS::KC_W:// 向前移动 mDirection.z -= mMove; break; case OIS::KC_DOWN: case OIS::KC_S:// 向后移动 mDirection.z += mMove; break; case OIS::KC_LEFT: case OIS::KC_A:// 向左移动 mDirection.x -= mMove; break; case OIS::KC_RIGHT: case OIS::KC_D:// 向右移动 mDirection.x += mMove; break; case OIS::KC_PGDOWN: case OIS::KC_E:// 向下移动 mDirection.y -= mMove; break; case OIS::KC_PGUP: case OIS::KC_Q:// 向上移动 mDirection.y += mMove; break; } return true; } bool keyReleased(const OIS::KeyEvent &e) { switch (e.key) { case OIS::KC_UP: case OIS::KC_W: mDirection.z += mMove; break; case OIS::KC_DOWN: case OIS::KC_S: mDirection.z -= mMove; break; case OIS::KC_LEFT: case OIS::KC_A: mDirection.x += mMove; break; case OIS::KC_RIGHT: case OIS::KC_D: mDirection.x -= mMove; break; case OIS::KC_PGDOWN: case OIS::KC_E: mDirection.y += mMove; break; case OIS::KC_PGUP: case OIS::KC_Q: mDirection.y -= mMove; break; } return true; } protected: Real mRotate; // 旋转常量 Real mMove; // 运动常量 SceneManager *mSceneMgr; // 当前的场景管理器 SceneNode *mCamNode; // 当前摄像机附着的场景节点 bool mContinue; // 是否要继续渲染 Vector3 mDirection; // 指向正确的移动方向 // mContinue变量是frameStarted方法的返回值。当mContinue为false的时候,程序退出。 // mDirection变量指定了在每一个帧里我们如何移动摄像机节点。 }; 测试场景: void createCamera(void) { // 创建一个摄像机,放在默认位置 mCamera = mSceneMgr->createCamera("PlayerCam"); mCamera->setNearClipDistance(5); } void createScene(void) { mSceneMgr->setAmbientLight(ColourValue(0.25, 0.25, 0.25)); // 加入一个实体 Entity *ent = mSceneMgr->createEntity("Ninja", "ninja.mesh"); SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode("NinjaNode"); node->attachObject(ent); // 创建灯光 Light *light = mSceneMgr->createLight("Light1"); light->setType(Light::LT_POINT); light->setPosition(Vector3(250, 150, 250)); light->setDiffuseColour(ColourValue::White); light->setSpecularColour(ColourValue::White); // 创建场景结点 node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CamNode1", Vector3(-400, 200, 400)); // 旋转实体,面向观察者 node->yaw(Degree(-45)); // 创建一个场景结点 node = node->createChildSceneNode("PitchNode1"); node->attachObject(mCamera); // 创建第二个场景结点 node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CamNode2", Vector3(0, 200, 400)); node = node->createChildSceneNode("PitchNode2"); } void createFrameListener(void) { // 创建帧监听 mFrameListener = new TutorialFrameListener(mWindow, mCamera, mSceneMgr); mRoot->addFrameListener(mFrameListener); // 显示帧频 mFrameListener->showDebugOverlay(true); }  

你可能感兴趣的:(vector,测试,Class,UP,CAM)