• <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, 評論 - 14, 引用 - 0
            數據加載中……

            OGRE之輸入系統筆記

                 一個基本的例子:
                
            #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;
            }

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

            這個例子試圖說明緩沖輸入和非緩沖輸入的區別,但是讓我困惑的是為什么采用了緩沖輸入系統還能響應持續按鍵呢?編譯后運行按住WSAD照樣移動攝像機。

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

            評論

            # re: OGRE之輸入系統筆記  回復  更多評論   

            unbuffered:快照catch
            buffered:輸入消息隊列
            我的理解
            2009-12-07 09:14 | LOGOS
            五月丁香综合激情六月久久| 思思久久99热免费精品6| 无码久久精品国产亚洲Av影片| 精品伊人久久久| 精品国产91久久久久久久| 日本久久中文字幕| 久久精品国产69国产精品亚洲 | 伊人久久无码精品中文字幕| 亚洲狠狠婷婷综合久久蜜芽| 国产69精品久久久久99| 国产成人精品久久| 久久久久99精品成人片| 欧美喷潮久久久XXXXx| 久久久久久久综合综合狠狠| 熟妇人妻久久中文字幕| 午夜福利91久久福利| 精品国产乱码久久久久久1区2区| 久久久久亚洲精品天堂久久久久久 | 漂亮人妻被黑人久久精品| 久久久这里有精品中文字幕| 国产亚洲欧美成人久久片| 久久精品国产久精国产果冻传媒| 国产成人久久久精品二区三区 | 久久无码AV一区二区三区| 久久久久国产精品麻豆AR影院 | 久久综合88熟人妻| 思思久久99热只有频精品66| 久久国产精品国语对白| 亚洲狠狠久久综合一区77777| 色偷偷88888欧美精品久久久| 亚洲欧美国产精品专区久久| 777久久精品一区二区三区无码| 国内精品久久久人妻中文字幕| 中文成人无码精品久久久不卡| 欧美久久一级内射wwwwww.| 欧美激情精品久久久久久| 午夜精品久久久久成人| 一级a性色生活片久久无少妇一级婬片免费放 | 99久久国产综合精品成人影院 | 中文无码久久精品| 亚洲欧美国产精品专区久久|