青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-380  評論-37  文章-0  trackbacks-0

轉:http://m.shnenglu.com/yuanyajie/archive/2006/11/01/14485.html

使用 cegui 來制作界面 , 不論在何種平臺下 , 有基本的三大步驟要做 :
1, 創建一個 CEGUI::Render 實例
2, 創建 CEGUI::System 對象
3, 調用各種方法來渲染用戶界面
第一步 , 在我使用的 ogre 環境下使用以下代碼來創建 CEGUI::Render 實例
Ogre3D
CEGUI::OgreCEGUIRenderer* myRenderer =
       new CEGUI::OgreCEGUIRenderer(myRenderWindow);
第二步相當簡單 , 可使用
new CEGUI::System(myRenderer);
第三步,基本上來講,大部分平臺下,如 direct3D, OpenGL, 我們在渲染循環的尾部調用
CEGUI::System::renderGUI 來開始界面的渲染。如果我們使用 ogre3d 引擎,這一步不需要
我們顯示的執行。因為 ogre 引擎已經考慮了。
除了這三大步之外,我們還有一些工作要做,首先,我們需要加載數據文件,并且完成初始化工作。
CEGUI 使用了許多類型的文件。 CEGUI 使用一個稱為 ResourceProvider 的幫助對象,用它來做為核心 CEGUI 庫與外部文件加載系統的接口。通過實現一個特定的 ResourceProvider 對象, cegui 的渲染模塊就可以與外部系統的資源管理器、文件加載子系統無縫地集成。 CEGUI 需要的數據文件便可以通過外部系統提供的功能來進行加載。 CEGUI 中的大部分文件是以 XML 的文件格式來保存的。缺省情況下, CEGUI 在內部使用 Xerces-C++ 庫來分析 XML 文件,使用 schema 來對 xml 進行校驗, schema 文件以標準的 .xsd 擴展名來保存 . 許多文件本質上都是 XML 格式的文件,但是根據其意義不同,分別使用了不同的文件擴展名。
.Imageset 文件可將一幅圖像看做若干小圖像的集合。換名話說,就是將一幅圖像的某個區域看做一幅獨立的圖片來使用。
.Font 定義了在 CEGUI 中所使用的字體類型。
.scheme  可以將許多數據組合在一起使用,它也是裝載與注冊 widget 最方便的方法。在一個 .scheme 文件中可以包括下列幾種數據:
Imagest,font, window Set, window Alias
window set 指定了裝載模塊( .dll 等)的名稱,和一組可以注冊到系統中的 widget.
window alias 提供了別名的功能,實現已經注冊的 window/widget 的形式上的隱藏。
.Layout  包含了窗口布局的 xml 表示。每個嵌套的 'window' 元素定義了被創建的 window 或是 widget."Property" 元素定義了窗口的設置與屬性值。
.config 是可供選擇的配置文件,他可指定一些缺省的屬性。
我們使用 CEGUI 來制作圖形界面,至少要使用以下三種文件:
.imageset, .Font . Scheme;
當然,我們知道在一個 Scheme 中是可以包括 imageset 與 Font 的。
CEGUI::SchemeManager::getSingleton().loadScheme(“../datafiles/schemes/TaharezLook.scheme”);
// load in a font.  The first font loaded automatically becomes the default font.
CEGUI::FontManager::getSingleton().createFont(“../datafiles/fonts/Commonwealth-10.font”);
對于 ogre 的使用者來講,應該在 resources.cfg 將這些資源所在的目錄加進去。
我們可用下面的語句來指定 cegui 所需要的缺省的 font 與 cursor 資源。
在 cegui 的概念里,每個 widget 都是一個 window, 從編程的角度來講,每個 widget 類都是從同一個相同的 window 基類繼承而來的 . 因此, widget 與 window 有著基本相同的行為。
窗體的許多屬性與設置在窗口層樹上是可以遺傳的。高一級窗口的屬性與行為會影響到下一級窗口的屬性與行為。例如附著在某個 window 上的 window 與 widget 會被父 window 影響。當父窗口被 destroy 時,它所附屬的所有的子窗口與 widget 也都將被 destroy.
創建 CEGUI 窗口,我們可以使用兩種形式,一是 C ++代碼,二是編輯 XML layout 文件。
注意:在 CEGUI 中,所有的 window 都是由 WindowManager singleton object 來統一創建的。我們首先得到這個對象:
using namespace CEGUI;
WindowManager& wmgr = WindowManager::getSingleton();
一般來講,我們總是創建一個 DefaultWindow 來做為我們將使用的窗口的 Root, 在這種方式下,我們會有比較好的靈活性。
Window* myRoot = wmgr.createWindow(“DefaultWindow”, “root”);
System::getSingleton().setGUISheet(myRoot);
createwindows() 函數所使用的第一個參數,指明了將要創建的窗口類型,它一般是在我們使用的 .scheme 文件中所注冊過的,當然還有一些系統定義的,總是有效的窗口類型如上面所提到的 DefaultWindow.DefualtWindow 是不可見的,它只是做為所有窗口的 root 來使用。
一般我們總是要創建一個 Framewindow, 它可以包括其他窗口與 widget ,本身也是可視的。
FrameWindow* fWnd = (FrameWindow*)wmgr.createWindow(“TaharezLook/FrameWindow”, “testWindow”);
之后,我們將創建的窗口掛到 root 上,形成一個層次關系。
myRoot->addChildWindow(fWnd);
編輯 xml layout 文件,可使用專門提供的制作工具。具體的使用方法可以參閱相關文檔,這里說一下如何使用制作好的 xml layout 文件。
using namespace CEGUI;
Window* myRoot = WindowManager::getSingleton().loadWindowLayout(“test.layout”);
System::getSingleton().setGUISheet(myRoot);
首先,將 layout 文件裝載進來,再指定根結點。
CEGUI 本身偵測用戶輸入,這些不是 CEGUI 的責任,而是程序的員的責任。當有用戶外部輸入時,我
們可以選擇將這些消息告知 CEGUI ,這樣 CEGUI 才會響應。
在 ceguir::System 類中定義了一組函數,它作為我們進行消息傳遞的接口。
bool injectMouseMove(float delta_x, float delta_y);
bool injectMousePosition(float x_pos, float y_pos);
bool injectMouseLeaves(void);
bool injectMouseButtonDown(MouseButton button);
bool injectMouseButtonUp(MouseButton button);
bool injectKeyDown(uint key_code);
bool injectKeyUp(uint key_code);
bool injectChar(utf32 code_point);
bool injectMouseWheelChange(float delta);
bool injectTimePulse(float timeElapsed);
這些函數的返回值說明了 CEGUI 是否已經將傳入的消息 consume 掉了。
CEGUI 使用回調機制來進行消息處理??梢詾槟硞€窗體的特定事件注冊一個函數,當窗體事件發生時, CEGUI 會自動調用所注冊的函數。
bool TutorialApplication::handlePopMenu(constCEGUI::EventArgs& e)

// 。。。。。進行事件響應

void setupEventHandlers(void)
    {
       CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
       wmgr .getWindow((CEGUI::utf8*)"MyButton")->subscribeEvent(
       CEGUI ::PushButton::EventClicked, CEGUI::Event::Subscriber(&TutorialApplication::handlePopMenu, this));
   }

EventClicked :: 系統預定義的事件 . subscribeEvent:: 注冊函數,它事件與響應函數聯接在一起。
在 ogre 程序中,當偵聽器收到鍵盤,鼠標消息時,首先經過適當的轉換( CEGUI 可以識別)再傳遞給 CEGUI 。下面這個函數執行鼠標鍵標識轉換。
CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)
{
       switch (buttonID)
       {
       case MouseEvent::BUTTON0_MASK:
              return CEGUI::LeftButton;
       case MouseEvent::BUTTON1_MASK:
              return CEGUI::RightButton;
       case MouseEvent::BUTTON2_MASK:
              return CEGUI::MiddleButton;
       case MouseEvent::BUTTON3_MASK:
              return CEGUI::X1Button;
       default:
              return CEGUI::LeftButton;
       }
}

將 CEGUI 需要知道的鍵盤,鼠標消息告知它。即在 OGRE 處理這些消息時通知 CEGUI 。以下這函數說明了用法。
       void mouseMoved (MouseEvent *e)// 鼠標移動
       {
              CEGUI::System::getSingleton().injectMouseMove(
                   e->getRelX() * mGUIRenderer->getWidth(),
                   e->getRelY() * mGUIRenderer->getHeight());
                   e->consume();
       }

       void mousePressed (MouseEvent *e)// 鼠標按下
       {
              CEGUI::System::getSingleton().injectMouseButtonDown(
               convertOgreButtonToCegui(e->getButtonID()));
             e->consume();
       }
       void mouseReleased (MouseEvent *e)// 鼠標彈起
       {
              CEGUI::System::getSingleton().injectMouseButtonUp(
              convertOgreButtonToCegui(e->getButtonID()));
              e->consume();
       }

       void keyPressed(KeyEvent* e)// 鍵按下
       {
              CEGUI::System::getSingleton().injectKeyDown(e->getKey());
              CEGUI::System::getSingleton().injectChar(e->getKeyChar());
              e->consume();
       }
       void keyReleased(KeyEvent* e)// 鍵彈起
       {
             CEGUI::System::getSingleton().injectKeyUp(e->getKey());
             e->consume();

       }
在 CEGUI 中使用中文的問題:   現在總結了一下在 CEGUI 中顯示中文需要注意的事項 :
    1 、將 simhei.ttf copy to \ogrenew\Samples\Media\gui
    2 、將 simhei-12.font  拷到上目錄內容為
<?xml version="1.0"  ?>
<Font Name="SimHei-12" Filename="simhei.ttf" Type="Dynamic" Size="12" NativeHorzRes="800" NativeVertRes="600" 
AutoScaled="true">
<GlyphSet Glyphs=" 你好世界退出演示渲染到新材質建編輯窗口 " /> ( <---- 自己要用到的漢字)
</Font>
注意大小寫??! GlyphSet Glyphs 是在程序中要用到的漢字,它是讓 cegui 預生成一個字符圖像集用的(想當然的 :-P )如果修改了這個文件,注意要用 Unicode ( UTF-8 )的編碼來保存,在 vc7.1 中:文件 -> 高級保存選項   的   編碼   欄中選擇。
    3 、在 TaharezLook.scheme 中
     <Font Name="Tahoma-12" Filename="tahoma-12.font" /> 后加入
     <Font Name="SimHei-12" Filename="simhei-12.font" />  注意大小寫
     以上是一些準備工作
    4 、在自己的應用中設置默認字體
    mGUISystem->setDefaultFont((CEGUI::utf8*)"Tahoma-12"); 改為
    mGUISystem->setDefaultFont((CEGUI::utf8*)"SimHei-12");
    5 、在自己的應用程序中就可以把相關的 Text 屬性該為中文了,如:
    item = new CEGUI::ListboxTextItem((CEGUI::utf8*)" 退出 ", 6);
    同樣要注意的是要保存為 Unicode ( UTF-8 )的編碼。同時這些字要是在 simhei-12.font 中定義過的字,當然也可以象那個 CEGUIChieseDemo
那樣用動態生成如:
    gfont->defineFontGlyphs(gfont->getAvailableGlyphs() + (utf8*)" 當前最佳壞平均的框架率三角 ");
    編譯自己的程序,應該就可以看到中文了,羅嗦一下,記住只要有漢字出現的文件就保存為 Unicode ( UTF-8 )編碼的!??!

posted on 2009-11-27 03:09 小王 閱讀(1016) 評論(0)  編輯 收藏 引用 所屬分類: 游戲引擎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美1区3d| 亚洲精品韩国| 亚洲欧美日韩国产另类专区| 亚洲欧美日韩精品久久亚洲区| 久久夜色精品亚洲噜噜国产mv| 亚洲黄色毛片| 久久av一区二区三区漫画| 免费成人毛片| 国产亚洲欧美另类一区二区三区| 亚洲国产另类久久久精品极度| 久久久久久久综合| 国产农村妇女精品一区二区| 夜久久久久久| 欧美色123| 久久国产欧美| 亚洲激情成人在线| 欧美一级欧美一级在线播放| 亚洲美女在线看| 亚洲国产精品女人久久久| 国内自拍亚洲| 亚洲国产美女久久久久| 亚洲人成网站999久久久综合| 亚洲国产精品久久精品怡红院| 在线观看国产精品网站| 在线亚洲+欧美+日本专区| 性8sex亚洲区入口| 老司机久久99久久精品播放免费 | 久久国产精品一区二区三区| 香蕉av777xxx色综合一区| 久久经典综合| 国产自产v一区二区三区c| 国内精品久久久久久影视8| 亚洲国产精品999| 亚洲新中文字幕| 久久福利精品| 亚洲精品小视频| 久久久7777| 国产精品福利网站| 亚洲福利久久| 小嫩嫩精品导航| 亚洲国产毛片完整版| 欧美激情免费观看| 亚洲欧美伊人| 欧美揉bbbbb揉bbbbb| 欧美专区在线观看一区| 国产一区二区三区四区老人| 一区二区三区黄色| 亚洲女人天堂av| 久久久久久高潮国产精品视| 亚洲欧洲久久| 久久三级视频| 欧美1区免费| 亚洲欧美精品在线| 欧美日韩亚洲一区二区三区在线| 狠狠入ady亚洲精品| 午夜精品福利在线观看| 亚洲人成网站色ww在线| 乱人伦精品视频在线观看| 国产精品影片在线观看| 亚洲色图自拍| 亚洲精品一区在线| 久久激情视频免费观看| 亚洲一区二区三区影院| 亚洲国产精品日韩| 欧美成人一区二区三区在线观看| 在线免费观看欧美| 牛人盗摄一区二区三区视频| 欧美一区二区三区的| 国产精品一区二区三区久久久| 亚洲性夜色噜噜噜7777| 99热在这里有精品免费| 欧美日韩精品在线播放| 一区二区欧美国产| 亚洲视频一区二区| 国产精品视频免费在线观看| 欧美在线观看你懂的| 欧美一区二区视频97| 黄色成人91| 欧美粗暴jizz性欧美20| 欧美99久久| 亚洲精品视频免费观看| 亚洲欧洲在线一区| 免费在线欧美视频| 久久久久综合网| 亚洲国产精品久久久久婷婷老年| 女同性一区二区三区人了人一| 久久激情五月婷婷| 亚洲黄网站黄| 99精品欧美一区| 国产日韩在线一区二区三区| 久久影院午夜论| 欧美国产日韩在线| 亚洲一区亚洲| 久久亚洲综合色| 亚洲天堂网在线观看| 香港久久久电影| 91久久精品美女高潮| 一区二区三区精密机械公司 | 亚洲精品欧美精品| 国产精品青草综合久久久久99 | 亚洲综合精品四区| 久久经典综合| 亚洲天堂av在线免费观看| 欧美在线观看视频| 一区二区高清视频| 一区二区福利| 午夜视频在线观看一区| 亚洲精品久久久久久久久久久久久| 亚洲精品一二三| 狠狠干综合网| 亚洲视频久久| 亚洲人成久久| 欧美一区二区三区精品| 99精品视频一区| 久久黄金**| 亚洲欧美自拍偷拍| 欧美区在线观看| 欧美成人国产| 国内精品伊人久久久久av影院| 亚洲蜜桃精久久久久久久 | 一区二区三区视频在线| 久久精品一区| 午夜精品一区二区三区四区| 欧美黄色片免费观看| 玖玖玖免费嫩草在线影院一区| 国产精品国产三级国产专播精品人| 欧美激情视频一区二区三区在线播放| 国产精品视频区| 亚洲一卡二卡三卡四卡五卡| 99精品视频免费观看| 免费观看30秒视频久久| 久久久福利视频| 国产精品午夜国产小视频| 日韩午夜电影| 日韩一区二区高清| 欧美mv日韩mv国产网站| 欧美不卡高清| 91久久久在线| 欧美成人精品1314www| 欧美成黄导航| 亚洲国产日韩精品| 欧美大片一区二区| 亚洲国产经典视频| 99国产精品国产精品毛片| 老司机凹凸av亚洲导航| 免费亚洲一区| 亚洲国产精品va在线看黑人| 久久免费少妇高潮久久精品99| 久久免费高清视频| 亚洲国产精品美女| 欧美黄色小视频| 99国产精品国产精品毛片| 一区二区三区av| 国产精品另类一区| 香蕉久久久久久久av网站| 久久精品动漫| 亚洲高清自拍| 亚洲精品午夜| 国内外成人在线视频| 欧美日韩精品是欧美日韩精品| 久久久www成人免费毛片麻豆| 国产欧美va欧美va香蕉在| 亚洲欧美日韩综合国产aⅴ | 亚洲欧美日韩在线高清直播| 国产精品国产三级国产aⅴ浪潮| 一区二区不卡在线视频 午夜欧美不卡在| 正在播放亚洲一区| 国产欧美日韩精品丝袜高跟鞋| 欧美一区二区三区精品电影| 欧美mv日韩mv国产网站app| 老司机午夜免费精品视频| 欧美国产日本| 亚洲一级黄色| 黑人极品videos精品欧美裸| 欧美风情在线观看| 亚洲在线国产日韩欧美| 老牛国产精品一区的观看方式| 在线视频欧美日韩| 亚洲国产婷婷综合在线精品 | 久久精品在线| 亚洲精品久久久久久久久久久| 在线视频免费在线观看一区二区| 国产精品一区毛片| 欧美成人国产一区二区| 亚洲制服欧美中文字幕中文字幕| 鲁大师成人一区二区三区| 在线视频一区二区| 在线观看欧美日韩国产| 国产精品xnxxcom| 免费观看一区| 久久精品亚洲乱码伦伦中文| 亚洲久久一区| 美女性感视频久久久| 翔田千里一区二区| 99re成人精品视频| 亚洲成色777777在线观看影院| 国产精品久久777777毛茸茸| 欧美激情女人20p| 久久人人97超碰精品888| 亚洲自拍偷拍一区|