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

讓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>
            精品成人久久| 欧美精品三级日韩久久| 亚洲第一黄网| 亚洲图片欧美日产| 亚洲曰本av电影| 国内偷自视频区视频综合| 亚洲人成绝费网站色www| 欧美人成在线| 亚洲日本在线观看| 久久中文精品| 欧美淫片网站| 国产精品一区二区你懂得| 在线午夜精品| 日韩一级精品视频在线观看| 欧美久久久久久| 夜夜嗨av色综合久久久综合网| 欧美激情一区二区三区在线| 久久久成人精品| 精品av久久707| 久久精品国产一区二区三| 亚洲欧美久久久久一区二区三区| 国产精品日韩精品欧美精品| 亚洲视频一区二区在线观看| 制服丝袜亚洲播放| 国产欧美一区二区精品秋霞影院 | 亚洲高清色综合| 久久蜜桃资源一区二区老牛| 久久久免费精品| 亚洲第一偷拍| 亚洲狠狠丁香婷婷综合久久久| 米奇777在线欧美播放| 最新国产拍偷乱拍精品| 亚洲欧洲精品一区二区| 国产精品h在线观看| 午夜日韩av| 亚洲少妇中出一区| 亚洲影视九九影院在线观看| 国产欧美一区二区三区在线老狼| 欧美在线欧美在线| 猫咪成人在线观看| 亚洲专区免费| 久久国产精品电影| 亚洲国语精品自产拍在线观看| 亚洲国产欧美一区| 国产精品99免费看| 麻豆av一区二区三区久久| 亚洲人人精品| av成人老司机| 乱人伦精品视频在线观看| 老司机精品视频一区二区三区| 日韩视频不卡中文| 久久久999精品视频| 久久狠狠婷婷| 亚洲欧美国产三级| 欧美精品性视频| 欧美国产精品劲爆| 国语自产精品视频在线看| 亚洲精品日韩综合观看成人91| 国产一区久久久| 久久免费一区| 亚洲精品美女久久久久| 亚洲精品小视频| 国产亚洲精品bt天堂精选| 亚洲激情网站免费观看| 狠狠色2019综合网| 99视频精品| 亚洲国产精品一区在线观看不卡| 亚洲午夜精品网| 在线综合欧美| 免费日韩av| 久久影院亚洲| 国产精品美女诱惑| 99视频在线观看一区三区| 亚洲第一福利视频| 亚洲免费影视| 午夜精品久久久99热福利| 欧美日韩精品在线观看| 男人插女人欧美| 国产亚洲欧美日韩在线一区| 亚洲一区二区三区在线看| 99精品视频免费观看视频| 久久综合久久88| 久久综合久久久久88| 国产欧美亚洲精品| 亚洲欧美日本国产专区一区| 在线中文字幕不卡| 欧美日韩色一区| 亚洲黄色三级| 亚洲电影第1页| 久久久.com| 久久久www| 国产九色精品成人porny| 美女999久久久精品视频| 欧美一区视频| 国产精品免费视频xxxx| 国产精品99久久久久久人| 一区二区三区日韩欧美精品| 一区二区三区欧美成人| 久久久精品日韩| 国产精品午夜电影| 亚洲一区在线播放| 午夜影院日韩| 国产亚洲福利| 久久精品国产亚洲一区二区三区| 久久精品国产精品亚洲综合| 国产日韩欧美综合一区| 久久精品国产久精国产爱| 六月婷婷久久| 亚洲国产精品123| 美女图片一区二区| 亚洲蜜桃精久久久久久久| 中文国产亚洲喷潮| 国产精品久久网站| 久久av红桃一区二区小说| 欧美成人免费在线视频| 日韩视频免费看| 亚洲电影免费观看高清完整版| 亚洲一区二区三区影院| 亚洲综合久久久久| 国产欧美日韩三区| 久久精品中文字幕一区二区三区| 久久最新视频| 99国产精品久久久久久久成人热| 黄色成人精品网站| 国产精品蜜臀在线观看| 99re6这里只有精品| 欧美亚洲自偷自偷| 娇妻被交换粗又大又硬视频欧美| 蜜臀99久久精品久久久久久软件| 亚洲国产天堂久久国产91| 亚洲欧美日韩网| 亚洲国产精品尤物yw在线观看| 欧美日韩精品免费观看| 欧美自拍偷拍午夜视频| 亚洲黄色在线视频| 午夜精品偷拍| 亚洲美女一区| 激情小说亚洲一区| 国产精品高潮久久| 久久综合九色99| 亚洲网在线观看| 免费在线观看成人av| 亚洲自拍偷拍麻豆| 亚洲激情在线观看视频免费| 国产精品性做久久久久久| 欧美jizz19性欧美| 亚洲欧美高清| 99re66热这里只有精品3直播| 久久久久国色av免费看影院 | 亚洲视频在线观看免费| 一色屋精品视频在线观看网站| 欧美日精品一区视频| 久久亚洲电影| 欧美一区1区三区3区公司| 夜夜嗨av一区二区三区网站四季av| 女仆av观看一区| 久久成人人人人精品欧| 夜夜嗨av一区二区三区| 91久久夜色精品国产九色| 国产婷婷色一区二区三区| 国产精品久久久久久久浪潮网站| 亚洲精品久久久久久久久久久| 在线观看中文字幕不卡| 国产精品一区二区久久久久| 欧美日韩国产综合视频在线观看中文| 久久大综合网| 亚洲欧美激情一区| 亚洲一区二区三区国产| 一本久道久久综合狠狠爱| 亚洲第一成人在线| 欧美大胆a视频| 欧美www视频| 欧美成年人在线观看| 可以看av的网站久久看| 久久久女女女女999久久| 久久国产精品久久久| 欧美一区二区免费观在线| 午夜精品久久久久久久| 在线一区欧美| 国产亚洲综合性久久久影院| 国产精品永久免费在线| 国产精品日韩高清| 国产午夜精品久久| 激情综合电影网| 在线免费观看日韩欧美| 精品动漫3d一区二区三区免费| 国产一区二区三区视频在线观看| 国产精品亚洲成人| 国产一区在线播放| 一区二区三区在线免费播放| 亚洲国产高清自拍| 亚洲区免费影片| 9人人澡人人爽人人精品| 日韩亚洲国产欧美| 亚洲专区欧美专区| 久久免费国产精品1| 亚洲国产99| 99精品欧美一区| 亚洲欧美日韩爽爽影院| 欧美一区二区日韩|