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

讓OGRE支持中文

Posted on 2008-07-14 14:27 RichardHe 閱讀(804) 評論(0)  編輯 收藏 引用 所屬分類: OGRE
0.前言:
本人非計算機專業,憑著愛好和一腔熱血混入游戲開發大軍候補小隊,平面尚未鉆透。為趕時髦,企圖叛變到3D陣營,慌亂之中撿起“OGRE”。學到如 今,亦可讓正方體飛機等不明物體在三次元空間胡亂打轉。但覺得本引擎不支持中文顯示而感到不爽,便四處尋求高人指教,但大部分高人指點說:“自己寫引擎算 了。”衡量了一下自己份量,覺得“自己寫”這件事十年內恐尚難做到。再后來找到3DCastle論壇,經過“bug王”以及“浪客☆龍貓” 兩位前輩的指點,也通過高手“renwind”遺留下來的教程,誤打誤撞竟然自己改出了中文支持,興奮之余便想寫點東西留點紀念。

1.準備工作
“bug王”已經通過WINAPI實現了OGRE在Direct7.0下的中文支持,也有高手說這樣效率不高,更因為本人基本上是不怎么熟悉 WINAPI的,所以就放棄了這種方法。企圖直接通過貼圖來實現中文顯示,畢竟OGRE本身文字輸出也是用的這種辦法,更好的是OGRE引擎除了普通的 “ttf”字體外還支持位圖字體(其實“ttf”在引擎中也被Ogre::Font::createTextureFromFont()轉換成位圖了), 基本上就是做一個很大很大的圖片,然后上面畫滿漢字,直接讀進去就可以了,問題也就變成了——如何找這個大圖片。
幸好GBA游戲的開發者們已經找到了很好的文字來源和取得方法,通過金山的16*16點陣字庫得到接近9000個字模,然后通過程序讀出并寫到2048*2048的單色位圖上,轉換成“png”格式圖片才221k。

2.基本知識
修改引擎之前,我們先要知道OGRE是如何顯示字體的。OGRE本身面向對象的設計和自帶文檔都做得非常規范漂亮,很容易就能找到關于顯示文字的類以及相關函數。在這里主要看一下關于位圖字體是如何顯示在畫面上。

(1)字體的讀取。
和這項功能相關的有兩個類,一個是Ogre::FontManager類,負責分析字體信息(*.fontdef)文件。然后用builder模式構 建一個Ogre::Font類。在Font類中最重要的數據莫過于mTexCoords_u1、mTexCoords_u2、 mTexCoords_v1、mTexCoords_v2這四個數組,他們分別用來儲存不同文字對應在圖片上的紋理坐標。 不過數組大小明顯不夠儲存9000個漢字的,一會兒要改的。

(2)字體的顯示。
好像字體顯示中用得較多的是Ogre::TextAreaGuiElement類,不過好像還有其他的,我們在這里只看這個吧,估計其他的也大同小異。看了看好像唯一和顯示字體有關的函數就是void TextAreaGuiElement::updateGeometry()了,基本上就是根據要寫到屏幕上的字串,在Ogre::Font類中得到相應的貼圖坐標和貼圖,然后畫上去,道理也不是很難。

3.動手術
目標鎖定到Ogre::Font,Ogre::FontManager,Ogre::TextAreaGuiElement三個類中,把所有文件備份一遍手術開始!

(1) Ogre::Font類。
首先是儲存文字貼圖坐標的數組的大小不夠,原來定義的是——寬字符集 (1024 - 32)、ASCII(256 - 32)。這點點大小怎么夠我近9000字大軍進入,索性都改成(9030 - 32)。還有就是set和get文字貼圖的id都是char類型數據,256個id也不夠分配給漢字,看來要都改成unsigned long形(其實大部分機器上int也是32位,不過long是固定32位的類型,感覺統用點)。

(2) Ogre::FontManager類。
里面從腳本文件中解析貼圖坐標的方法是根據單字符的方式,為支持漢字,改成同時可以分析int的。一個漢字對應數字是他的區位碼+161(前160個留給了半角字)。

(3) Ogre::TextAreaGuiElement類。
這個是相對比較麻煩的,他要從字串中分辨出到半角字和中文。在這里增加一個std::vector<unsigned long> caption,用來儲存分辨的結果。增加以下幾行:

   
std::vector<unsigned long> caption;
   
unsigned char nTemp;
   
String::iterator it=mCaption.begin();
   
for(;it!=mCaption.end();++it)
   
{
   
    if(unsigned char(*it)<=160)//如果是半角
   
    {
   
        caption.push_back((unsigned char)*it);
   
    }
   
    else//處理全角字符
   
    {
   
        nTemp=(unsigned char)(*it);
   
        ++it;
   
        if(it==mCaption.end())
   
            break;
   
        //下面是得到區位碼+161的公式。
   
        caption.push_back((94*(nTemp-0xa0-1)+((unsigned char)(*it)-0xa0-1))+161);
   
    }
   
}

然后后面所有關于mCaption的地方都用caption代替就ok了。

4.結果。
在OpenGL和DX9.0中成功的支持了中文,但是DX7.0中竟然出現了運行錯誤,具體問題還不清楚,還望各位高手指教。
因為字體本身原因,文字很扁平的不好看,索性又改了改Ogre::Font,Ogre::FontManager兩個類,實現腳本中支持修改文字縱橫比例的系數的proportion,當這個值設置為0.8的時候比較好看了。


    相關文件
    chinese.fontdef//字體信息文件 放在資源文件加中
    font.png//字體圖片 放在資源文件加中

    OgreFont.cpp
    OgreFont.h
    OgreFontManager.cpp
    OgreTextAreaGuiElement.cpp
    //上面文件覆蓋同名文件 就可以 先備份

這個是在ogre-win32-v0-13-1基礎上改的,請到ogre-win32-v0-13-1.zip下載

中文字體名字就叫 Chinese,以后能做中文游戲了!

免費打工仔QQ:1850070

posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区久久精品| 国产精品一区毛片| 亚洲国产一区二区三区在线播| 久久午夜视频| 久久大综合网| 久久精品国产99国产精品澳门| 欧美夜福利tv在线| 久久国产欧美精品| 欧美成人精品在线观看| 亚洲欧洲日本mm| 亚洲综合视频一区| 久久久久久有精品国产| 欧美黄色片免费观看| 久久精品国产视频| 亚洲午夜精品在线| 精品粉嫩aⅴ一区二区三区四区| 1024国产精品| 一区二区三区国产精华| 午夜视频在线观看一区| 卡一卡二国产精品| 亚洲精品久久久一区二区三区| 国产精品99久久久久久有的能看 | 在线观看视频一区二区| 在线精品福利| 亚洲调教视频在线观看| 久久精品国产96久久久香蕉| 欧美成人福利视频| 一区二区欧美在线| 久久久精品国产一区二区三区| 欧美黑人国产人伦爽爽爽| 国产精品女主播在线观看| 黄色亚洲网站| 亚洲欧美日韩专区| 欧美黄色大片网站| 亚洲欧美在线观看| 欧美日本国产| 亚洲国产精品ⅴa在线观看| 先锋影音久久久| 亚洲日本中文字幕| 久久久噜噜噜久久中文字幕色伊伊| 欧美日韩国产在线| 亚洲欧洲免费视频| 久久久女女女女999久久| 一区二区三区四区蜜桃| 欧美成人一区二区三区| 一区二区三区在线视频观看| 欧美一区二区三区在线观看| 亚洲精品综合| 欧美精品久久久久久久久老牛影院 | 亚洲大片av| 亚洲女人小视频在线观看| 欧美精品粉嫩高潮一区二区| 在线免费高清一区二区三区| 欧美日韩你懂的| 亚洲精品日韩一| 欧美激情二区三区| 久久综合久久久| 精品999网站| 久久精品夜夜夜夜久久| 亚洲欧美日韩国产综合精品二区| 欧美视频免费在线| 亚洲一区二区免费看| 一级日韩一区在线观看| 欧美视频一区二区三区| 亚洲一区二区三区四区五区午夜 | 99国产精品国产精品久久 | 久久人人爽爽爽人久久久| 亚洲一区日韩| 国产精品qvod| 性欧美长视频| 午夜精品www| 国产亚洲毛片在线| 久久在线91| 麻豆av福利av久久av| 亚洲激情另类| 日韩小视频在线观看| 国产精品久久久久久久久久久久久久| 亚洲私拍自拍| 欧美在线地址| 亚洲精品中文字幕在线| 一区二区三区高清在线| 国产中文一区二区| 亚洲电影天堂av| 国产精品久久福利| 久久米奇亚洲| 欧美精品久久久久久久免费观看| 宅男噜噜噜66国产日韩在线观看| 一本色道久久综合亚洲91| 国产欧美日韩精品a在线观看| 久久久美女艺术照精彩视频福利播放 | 亚洲欧美亚洲| 亚洲国产精品一区在线观看不卡 | 中文高清一区| 午夜欧美精品久久久久久久| 狠狠久久婷婷| 日韩午夜av| 国产亚洲视频在线观看| 蜜臀va亚洲va欧美va天堂| 欧美福利视频网站| 欧美诱惑福利视频| 免费试看一区| 久久国产精品99久久久久久老狼| 免费成人av资源网| 性娇小13――14欧美| 欧美91大片| 久久久久国产一区二区三区四区| 欧美伦理a级免费电影| 久久se精品一区二区| 欧美精品www在线观看| 久久久久久久综合日本| 欧美天堂亚洲电影院在线播放| 免费一级欧美片在线观看| 欧美午夜剧场| 亚洲精品小视频在线观看| 国产区二精品视| 一区二区三区久久久| 亚洲人成网站777色婷婷| 欧美中日韩免费视频| 亚洲综合成人在线| 欧美精品国产精品| 欧美激情精品久久久久久大尺度| 欧美全黄视频| 老牛国产精品一区的观看方式| 亚洲欧美日韩在线综合| 女女同性精品视频| 久久久久久亚洲精品杨幂换脸| 国产精品久久久久久久电影 | 亚洲图片你懂的| 亚洲精品在线电影| 久久人人超碰| 米奇777在线欧美播放| 黑人操亚洲美女惩罚| 欧美在线国产| 久久久精品动漫| 国产一区导航| 久久xxxx精品视频| 久久九九99视频| 国产日韩欧美一区二区三区四区| 亚洲性夜色噜噜噜7777| 亚洲自拍偷拍色片视频| 国产精品成人久久久久| 亚洲最黄网站| 欧美一区二区三区精品电影| 国产欧美日韩一区二区三区在线观看 | 在线观看日产精品| 久久久久国产一区二区| 欧美大秀在线观看| 日韩视频在线观看免费| 欧美全黄视频| 中国成人黄色视屏| 欧美亚洲综合另类| 国产资源精品在线观看| 久久露脸国产精品| 亚洲丰满少妇videoshd| 夜夜嗨av一区二区三区中文字幕| 欧美日产一区二区三区在线观看 | 亚洲欧美视频在线观看视频| 国产精品最新自拍| 久久久无码精品亚洲日韩按摩| 欧美二区不卡| 亚洲深夜福利| 国产午夜亚洲精品羞羞网站 | 国产精品久久久久久久第一福利| 亚洲午夜在线观看视频在线| 亚洲欧美一区二区三区极速播放| 国产乱码精品一区二区三区不卡| 久久精品国产亚洲高清剧情介绍| 欧美freesex8一10精品| 99在线精品视频| 国产精品尤物福利片在线观看| 久久精品视频网| 亚洲日本电影| 久久九九国产精品| 亚洲精品色婷婷福利天堂| 欧美日韩一二三四五区| 亚洲国产日韩欧美| 香蕉成人久久| 亚洲裸体俱乐部裸体舞表演av| 国产精品第一页第二页第三页| 亚洲视频第一页| 久久频这里精品99香蕉| 日韩一本二本av| 国产偷国产偷亚洲高清97cao| 美女尤物久久精品| 亚洲天堂av综合网| 欧美不卡在线视频| 亚洲欧美一区二区三区久久 | 欧美成人精品1314www| 亚洲视频播放| 1024国产精品| 国产一区二区三区精品久久久| 欧美国产日韩精品| 欧美一级免费视频| 一区二区三区免费观看| 欧美激情无毛| 美女爽到呻吟久久久久| 欧美影院一区| 亚洲欧美在线一区二区| 99视频在线观看一区三区| 在线色欧美三级视频|