• <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
            久久午夜免费视频| 久久九九有精品国产23百花影院| 99久久精品无码一区二区毛片| 国产精品无码久久久久| 欧美激情精品久久久久久久| 一本综合久久国产二区| 国产成人精品久久二区二区| 青青草国产精品久久| 国产精品一区二区久久精品涩爱 | 伊人久久综合精品无码AV专区| 久久亚洲AV成人出白浆无码国产| 99精品久久久久久久婷婷| 亚洲午夜无码AV毛片久久| 久久本道伊人久久| 婷婷久久综合九色综合九七| 久久久噜噜噜久久熟女AA片| 久久本道久久综合伊人| 成人妇女免费播放久久久| 亚洲欧美久久久久9999| 伊人色综合久久天天| 久久丫精品国产亚洲av| 久久久噜噜噜久久| 久久人人妻人人爽人人爽| 国产欧美久久久精品影院| 99久久免费国产精品| 久久国产乱子精品免费女| 久久精品国产99国产精品亚洲| 久久久久亚洲AV成人网人人网站| 91久久婷婷国产综合精品青草| 久久婷婷色香五月综合激情| 国产亚州精品女人久久久久久| 久久人人爽人人爽人人片AV不 | 2021久久国自产拍精品| 亚洲午夜福利精品久久| 亚洲欧美精品一区久久中文字幕| 久久精品免费大片国产大片| 国产欧美久久久精品| 日本三级久久网| 久久精品一区二区三区中文字幕| 国产午夜福利精品久久| 99热精品久久只有精品|