• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Code Knight

            Programming is so cool
            隨筆 - 52, 文章 - 0, 評(píng)論 - 14, 引用 - 0
            數(shù)據(jù)加載中……

            OGRE之輸入系統(tǒng)筆記

                 一個(gè)基本的例子:
                
            #include "ExampleApplication.h"

            class TutorialFrameListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
            {
            public:
            TutorialFrameListener(RenderWindow* win, Camera* cam, SceneManager *sceneMgr)
             : ExampleFrameListener(win, cam, true, true)
            {
            // Populate the camera and scene manager containers
            mCamNode = cam->getParentSceneNode();
            mSceneMgr = sceneMgr;

            // set the rotation and move speed
            mRotate = 0.13;
            mMove = 250;

            // continue rendering
            mContinue = true;

            mMouse->setEventCallback(this);
            mKeyboard->setEventCallback(this);

            mDirection = Vector3::ZERO;
            }

            bool frameStarted(const FrameEvent &evt)
            {
            if(mMouse)
            mMouse->capture();
            if(mKeyboard)
            mKeyboard->capture();

            mCamNode->translate(mDirection * evt.timeSinceLastFrame, Node::TS_LOCAL);
            return mContinue;
            }

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

            // KeyListener
            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;
            } // switch
            return true;
            }
            protected:
            Real mRotate; // The rotate constant
            Real mMove; // The movement constant

            SceneManager *mSceneMgr; // The current SceneManager
            SceneNode *mCamNode; // The SceneNode the camera is currently attached to

            bool mContinue; // Whether to continue rendering or not
            Vector3 mDirection; // Value to move in the correct direction
            };

            class TutorialApplication : public ExampleApplication
            {
            public:
            void createCamera(void)
            {
            // create camera, but leave at default position
            mCamera = mSceneMgr->createCamera("PlayerCam");
            mCamera->setNearClipDistance(5);
            }

            void createScene(void)
            {
            mSceneMgr->setAmbientLight(ColourValue(0.25, 0.25, 0.25));

            // add the ninja
            Entity *ent = mSceneMgr->createEntity("Ninja", "ninja.mesh");
            SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode("NinjaNode");
            node->attachObject(ent);

            // create the light
            Light *light = mSceneMgr->createLight("Light1");
            light->setType(Light::LT_POINT);
            light->setPosition(Vector3(250, 150, 250));
            light->setDiffuseColour(ColourValue::White);
            light->setSpecularColour(ColourValue::White);

            // Create the scene node
            node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CamNode1", Vector3(-400, 200, 400));
            node->yaw(Degree(-45));
            node->attachObject(mCamera);

            // create the second camera node/pitch node
            node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CamNode2", Vector3(0, 200, 400));
            }

            void createFrameListener(void)
            {
            // Create the FrameListener
            mFrameListener = new TutorialFrameListener(mWindow, mCamera, mSceneMgr);
            mRoot->addFrameListener(mFrameListener);

            // Show the frame stats overlay
            mFrameListener->showDebugOverlay(true);
            }
            };

            #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
            #define WIN32_LEAN_AND_MEAN
            #include "windows.h"

            INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
            #else
            int main(int argc, char **argv)
            #endif
            {
            // Create application object
            TutorialApplication app;

            try {
            app.go();
            } catch(Exception& e) {
            #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
            MessageBox(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
            #else
            fprintf(stderr, "An exception has occurred: %s\n",
            e.getFullDescription().c_str());
            #endif
            }

            return 0;
            }

            按照理論來(lái)說(shuō)
            unbuffered:不斷的響應(yīng)按鍵信息,直到按鍵放開(kāi)。例如,按下上下左右,使得角色持續(xù)移動(dòng)。
                           一般來(lái)講適合于3D場(chǎng)景漫游過(guò)程,當(dāng)在每幀渲染之前,系統(tǒng)捕獲輸入設(shè)備狀態(tài),并根據(jù)這些狀態(tài)對(duì)場(chǎng)景中的物體和攝象機(jī)進(jìn)行控制。
            buffered:在一個(gè)按鍵放開(kāi)之前,只處理一次輸入信息。
                         例如呼出主菜單。適合于GUI界面的情況(如設(shè)置菜單),輸入設(shè)備狀態(tài)可以被發(fā)送到各GUI元素進(jìn)行處理(如按鈕被按下)。

            這個(gè)例子試圖說(shuō)明緩沖輸入和非緩沖輸入的區(qū)別,但是讓我困惑的是為什么采用了緩沖輸入系統(tǒng)還能響應(yīng)持續(xù)按鍵呢?編譯后運(yùn)行按住WSAD照樣移動(dòng)攝像機(jī)。

            posted on 2009-12-06 19:44 Code Knight 閱讀(796) 評(píng)論(1)  編輯 收藏 引用 所屬分類: OGRE

            評(píng)論

            # re: OGRE之輸入系統(tǒng)筆記  回復(fù)  更多評(píng)論   

            unbuffered:快照catch
            buffered:輸入消息隊(duì)列
            我的理解
            2009-12-07 09:14 | LOGOS
            国产精品久久午夜夜伦鲁鲁| 久久午夜福利无码1000合集| 国产69精品久久久久9999APGF| 99久久无码一区人妻| 久久99国产精品久久99果冻传媒 | 亚洲国产精品无码久久| 伊人久久成人成综合网222| 欧美精品一区二区久久 | 久久亚洲国产成人影院网站| 99国产欧美精品久久久蜜芽| 久久99精品国产麻豆| 国产精品青草久久久久婷婷| 久久精品草草草| 国内精品欧美久久精品| 久久久精品国产Sm最大网站| 亚洲国产精品嫩草影院久久 | 无码日韩人妻精品久久蜜桃| 亚洲午夜久久久久久久久久| 久久国产精品99国产精| 久久综合九色综合久99| 久久国产成人午夜AV影院| 午夜视频久久久久一区| 亚洲AV日韩AV永久无码久久| 国内精品伊人久久久久AV影院| 久久综合久久综合九色| 中文精品久久久久人妻| 久久久久亚洲精品天堂| 99久久99久久精品国产| 久久久久久国产精品无码下载| 韩国无遮挡三级久久| 亚洲国产高清精品线久久 | 久久91精品久久91综合| 久久久久久久综合日本| 久久精品99久久香蕉国产色戒| 久久国产精品无码网站| 亚洲伊人久久大香线蕉综合图片| 99久久99久久| 少妇高潮惨叫久久久久久| 久久久国产精品| 久久久国产精品福利免费 | 色诱久久久久综合网ywww|