• <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>

            Sunshine Alike

            半完美主義

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              35 Posts :: 1 Stories :: 56 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(15)

            積分與排名

            • 積分 - 50292
            • 排名 - 451

            最新隨筆

            最新評論

             關于引擎本身不再多加描述,我也沒搞明白,但是最近又要用,學習ing
            首先這次先生成一個空白窗口,不使用SDK帶的Example。
            文件:
            MyApplication.h
            MyListener.h
            main.cpp

            首先需要了解一下Ogre程序的基本結構,在Ogre里使用一個叫場景管理器(SceneManager)的類來管理在屏幕上顯示的各種物體,
            這個類是個抽象類(class Ogre::SceneManager abstract),只起到定義接口的作用。
            不可以直接實例化這個類,只能由Root節(jié)點調(diào)用createSceneManager方法來生成特定類型的SceneManager
            OGRE里有很多種場景管理器。有的場景管理器渲染地面,有的場景管理器渲染BSP表等等。

            與場景(Scene)相關的概念:實體,節(jié)點。
            實體:簡單的說實體就相當于空間中的一個物體,例如游戲中的一個角色。
            場景節(jié)點:要想在場景中使用實體,必須還要用到節(jié)點(SceneNode),它會與實體綁定在一起,當控制這個節(jié)點進行各種位移旋轉操作時
            其對應的實體也就跟著相應的進行操作。
            ##注:
            根據(jù)以前玩游戲的經(jīng)驗,在游戲(比如飛行射擊)中判斷一個物體是否被打中也都是以圓點為中心的一個區(qū)域而非物體(飛機)本身
            外殼的形狀可能也是由于這個原因。
            ##

            接下來再來了解一下一個重要的函數(shù)void MyApplication::go()
            這是一個入口函數(shù),這一次在我的main方法里就只有兩行代碼:
                   MyApplication app;
                   app.go();
            現(xiàn)在來看看go里有做了些什么事情。
               void go()
               {
                   //step 1 to 3 should be in this order
                   CreateRoot();
                   SetupRenderSystem();
                   CreateRenderWindow();

                   SetupInputSystem();
                   CreateFrameListener();
                   StartRenderLoop();
               }
            前面的三步需要按特定的順序來進行,后面的則不一定。各個函數(shù)的功能由函數(shù)名自說明了,內(nèi)容也很簡單。
            調(diào)用go后,首先需要創(chuàng)建根節(jié)點m_pRoot = new Root()這是整個引擎中最核心的一個對象,在做其它事情前必須要首先創(chuàng)建它。
            接下來設置渲染系統(tǒng)SetupRenderSystem() :
                   if(!m_pRoot->showConfigDialog())
                       exit(0);
            Ogre有個默認的設置對話框,直接調(diào)用它就可以了,如果用戶取消這一步,那么直接退出程序就好。

            創(chuàng)建窗口這一步,可以有多種選擇,因為部分內(nèi)容跟具體的操作系統(tǒng)相關,可以使用Windows SDK或者MFC生成窗口,也可以使用
            Ogre默認的窗口系統(tǒng),為了簡便,這里使用Ogre默認窗口
                   m_pRoot->initialise(true, "MyApplication Rendering Window");

            由于是空的窗口,所以不需要生成場景及做相關的工作。在這次的程序中,將要監(jiān)聽一個鍵盤事件,按下ESC的時候退出程序。
            這部分工作在接下的兩個函數(shù)SetupInputSystem和CreateFrameListener中完成。

            FrameListener是一個幀監(jiān)聽器,顯示器上的圖像都是一幀一幀的顯示出來的,我們可以在這切換這些幀的時候做一些處理工作,
            比如,獲取和處理鍵盤事件。在Ogre的主循環(huán)中大概可能會是這個樣子:
            1. Root object調(diào)用frameStarted方法在所有已經(jīng)注冊的FrameListeners中。
            2. Root object渲染一幀。
            3. Root object調(diào)用frameEnded方法在所有已經(jīng)注冊的FrameListeners中。

            在這里添加一個MyListener類用來做這件事情。
            class CombatListener : public FrameListener
            {
            public:
               CombatListener(OIS::Keyboard *pkeyboard)
                   : m_pKeyboard(pkeyboard)
               {
               }

               bool frameStarted(const FrameEvent& evt)
               {
                   m_pKeyboard->capture();
                   return !(m_pKeyboard->isKeyDown(OIS::KC_ESCAPE));
               }

            private:
               OIS::Keyboard *m_pKeyboard;
            };
            同樣的,Ogre也已經(jīng)準備好了一個基類,只需要繼承再稍加修改就可以了,其中OIS是Object Oriented Input System
            它本身不屬于Ogre,是一個簡單易用的跨平臺開源系統(tǒng),可以用它來處理鍵盤鼠標和游戲手柄等設備。
            這里我在每一幀開始的時候獲取鍵盤狀態(tài),當ESC鍵按下時,返回false,這將導致程序正常退出。

            OIS使用一個統(tǒng)一的InputManager,它比較難配置,但一旦正確地創(chuàng)建之后,非常好使用。 首先在SetupInputSystem方法中加入
                   size_t windowHnd = 0;
                   std::ostringstream windowHndStr;
                   OIS::ParamList pl;
                   RenderWindow *win = m_pRoot->getAutoCreatedWindow();

                   win->getCustomAttribute("WINDOW", &windowHnd);
                   windowHndStr<<windowHnd;
                   pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
                   m_pInputManager = OIS::InputManager::createInputSystem(pl);
            說明一點,getCustomAttribute方法的功能是用來獲取特定平臺的信息,在API上用一個詞Horrid來形容這個方法,哈哈,無奈D3D需要這些信息。
            下面再把下面的代碼回到SetupInputSystem方法中就OK了。
                   try
                   {
                       m_pKeyboard = static_cast<OIS::Keyboard*>(
                           m_pInputManager->createInputObject(OIS::OISKeyboard, false));
                   }
                   catch(const OIS::Exception &e)
                   {
                       throw Exception(42, e.eText, "MyApplication::SetupInputSystem()");
                   }

            InputSystem設置好了,就可以使用幀監(jiān)聽器了,在創(chuàng)建幀監(jiān)聽器的方法中:
                   m_pListener = new MyListener(m_pKeyboard);
                   m_pRoot->addFrameListener(m_pListener);
            好,到這里程序基本上完成了,剩下只需要啟動渲染循環(huán)(StartRenderLoop)就可以讓程序跑起來了
                   m_pRoot->startRendering();


            posted on 2009-10-28 22:33 Sunshine Alike 閱讀(829) 評論(0)  編輯 收藏 引用 所屬分類: 游戲開發(fā)
            91精品国产高清久久久久久io | 久久国语露脸国产精品电影| 国产精品永久久久久久久久久 | 91精品国产高清久久久久久io| 久久精品人成免费| 久久91精品综合国产首页| 久久久午夜精品| 久久精品一区二区国产| 久久乐国产精品亚洲综合| 亚洲综合伊人久久大杳蕉| 色综合久久中文色婷婷| 中文字幕精品久久久久人妻| 国产91色综合久久免费| 亚洲伊人久久综合影院| 2021国产成人精品久久| 蜜臀av性久久久久蜜臀aⅴ麻豆| 国产高清国内精品福利99久久| 亚洲第一极品精品无码久久| 精品久久久久久无码免费| 久久九九精品99国产精品| 国产精品久久新婚兰兰| 久久久这里有精品中文字幕| 精品一区二区久久| 99久久久精品免费观看国产| 久久免费看黄a级毛片| 色综合久久中文字幕综合网| 国产精品久久久久久久久久免费| 成人久久免费网站| 亚洲伊人久久大香线蕉综合图片| 久久精品亚洲欧美日韩久久| 久久综合久久综合久久综合| 日韩AV无码久久一区二区| 亚洲成色WWW久久网站| 久久久久亚洲精品日久生情| 2021国产精品午夜久久| 一97日本道伊人久久综合影院| 亚洲国产精品综合久久网络| 欧美色综合久久久久久| 亚洲性久久久影院| 亚洲精品tv久久久久久久久 | 精品久久人人妻人人做精品|