【笔记】四、帧监听、无缓冲输入

class TutorialFrameListener : public ExampleFrameListener { public: TutorialFrameListener(RenderWindow* win, Camera* cam, SceneManager *sceneMgr) : ExampleFrameListener(win, cam, false, false)// 第三和第四个参数要置为false。第三个参数指明是否使用带缓冲的键盘输入,第四个参数指明是否使用带缓冲的鼠标输入。 { // 键盘和鼠标状态追踪 mMouseDown = false; mToggle = 0.0; mCamNode = cam->getParentSceneNode();// 初始化摄像机所在的场景结点 mSceneMgr = sceneMgr;// 初始化场景结点 // 设置旋转和移动的速度 mRotate = 0.13; mMove = 250; } bool frameStarted(const FrameEvent &evt) { // 捕获键盘鼠标的输入 mMouse->capture(); mKeyboard->capture(); ////////////////////////////////////////////////////////////////////////// // 1、ESC退出程序功能 if (mKeyboard->isKeyDown(OIS::KC_ESCAPE)) {// 捕获键盘输入是ESC键时退出程序 return false; } ////////////////////////////////////////////////////////////////////////// // 2、左键点击灯光打开与关闭功能 // 获取鼠标左键是否被按下 bool currMouse = mMouse->getMouseState().buttonDown(OIS::MB_Left); // 当前左键按下,并且上一帧中鼠标没有被按下 if ( currMouse && !mMouseDown ) { Light *light = mSceneMgr->getLight("Light1");// 获得当前灯光 light->setVisible(! light->isVisible());//设置灯光的关闭与打开 } mMouseDown = currMouse;// 把mMouseDown的值设置成与currMouse变量相同。下一帧里,它会告诉我们上次是否按下了鼠标按键。 ////////////////////////////////////////////////////////////////////////// // 3、键盘上1和2键按下换摄像机切换结点功能 mToggle -= evt.timeSinceLastFrame;// 每次减去一个值,允许一段时间后再触发 if ((mToggle < 0.0f ) && mKeyboard->isKeyDown(OIS::KC_1)) {// 按下1键 mToggle = 0.5f;// 重设其值 mCamera->getParentSceneNode()->detachObject(mCamera);// 将mCamera解除与节点的绑定 mCamNode = mSceneMgr->getSceneNode("CamNode1");// 取得第一个结点 mCamNode->attachObject(mCamera);// 将摄像头绑定到第一个结点上 } else if ((mToggle < 0.0f) && mKeyboard->isKeyDown(OIS::KC_2)) {// 按下2键 mToggle = 0.5f;// 重设其值 mCamera->getParentSceneNode()->detachObject(mCamera);// 接触摄像机与场景结点的绑定 mCamNode = mSceneMgr->getSceneNode("CamNode2");// 获得第二个场景结点 mCamNode->attachObject(mCamera);// 将摄像机与第二个场景结点绑定 } ////////////////////////////////////////////////////////////////////////// // 4、用户按下方向键或W、A、S、D键,进行mCamNode的平移功能 // E键或者PageDown键进行向下移动,用Q键或者PageUp键进行向上移动 Vector3 transVector = Vector3::ZERO; if ( mKeyboard->isKeyDown(OIS::KC_UP) || mKeyboard->isKeyDown(OIS::KC_W) ) { transVector.z -= mMove; } if (mKeyboard->isKeyDown(OIS::KC_DOWN) || mKeyboard->isKeyDown(OIS::KC_S)) { transVector.z += mMove; } if (mKeyboard->isKeyDown(OIS::KC_LEFT) || mKeyboard->isKeyDown(OIS::KC_A)) { transVector.x -= mMove; } if (mKeyboard->isKeyDown(OIS::KC_RIGHT) || mKeyboard->isKeyDown(OIS::KC_D)) { transVector.x += mMove; } if (mKeyboard->isKeyDown(OIS::KC_PGUP) || mKeyboard->isKeyDown(OIS::KC_Q)) { transVector.y += mMove; } if (mKeyboard->isKeyDown(OIS::KC_PGDOWN) || mKeyboard->isKeyDown(OIS::KC_E)) { transVector.y -= mMove; } ////////////////////////////////////////////////////////////////////////// // 5、场景的旋转 mCamNode->translate(transVector * evt.timeSinceLastFrame, Node::TS_LOCAL); //mCamNode->translate(mCamNode->getOrientation()*transVector*evt.timeSinceLastFrame, Node::TS_WORLD); if (mMouse->getMouseState().buttonDown(OIS::MB_Right)) { mCamNode->yaw(Degree(-mRotate * mMouse->getMouseState().X.rel), Node::TS_WORLD); mCamNode->pitch(Degree(-mRotate * mMouse->getMouseState().Y.rel), Node::TS_LOCAL); } return true; return ExampleFrameListener::frameStarted(evt); } protected: bool mMouseDown; // 鼠标左键是否在上一帧被按下 Real mToggle; // 直到下一次触发的时间 Real mRotate; // 滚动常量 Real mMove; // 移动常量 SceneManager *mSceneMgr; // 当前场景管理器 SceneNode *mCamNode; // 当前摄像机所附在的场景节点 /************************************************************************ 说明: mSceneMgr拥有一个目前SceneManager的指针 mCamNode拥有目前SceneNode并且绑定着摄像机。 mRotate和mMove是旋转和移动的变量。如果想移动或旋转的更快或更慢,改变这两 个变量的大小就可以了。 另外两个变量(mToggle和mMouseDown)控制输入。 mMouseDown用来追踪鼠标在上一帧里是否也被按下(所以如果mMouseDown为真,在 鼠标释放之前不会做同样的操作)。 mToggle指定了直到我们可以执行下一个操作的时间。 即,当一个按键被按下去了,在mToggle指明的这段时间里不允许有其它动作发生。 ************************************************************************/ }; 建立测试场景: void createCamera(void) { ////////////////////////////////////////////////////////////////////////// // 注册监听帧 mCamera = mSceneMgr->createCamera("PlayerCam");// 添加一个摄像机 mCamera->setNearClipDistance(5);// 设置近距离剪切值 } void createScene(void) { mSceneMgr->setAmbientLight(ColourValue(.25, .25, .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));// 结点按照Y轴旋转-45° node->attachObject(mCamera);// 将摄像机与这个场景结点进行绑定 node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CamNode2", Vector3(0, 200, 400));// 再创建一个场景结点 } void createFrameListener(void) { // 创建一个帧监听 mFrameListener = new TutorialFrameListener(mWindow, mCamera, mSceneMgr);// 实例化一个帧监听 mRoot->addFrameListener(mFrameListener);// 将这个帧监听注册到Root对象中 // 注意add|removeFrameListener方法仅仅是得到一个指向FrameListener的指针(也就是说FrameListener并没有一个名字你可以移除她)。 // 这就意味着需要对每一个FrameListener持有一个指针,随后可以移除他们。 mFrameListener->showDebugOverlay(true);// 在左下角显示帧频 }  

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