文谷首页 | 业界传真 | 网络技术 | 服务器 | 数据库 | 存储技术 | 系统安全 | 无线技术 | Cisco | .Net | Windows | Linux | Unix | Java
电子商务 | 网站工程 | 网页设计 | 平面设计 | 多媒体 | 编程语言 | Oracle | MSSQL | Photoshop | ASP | PHP | 实用技巧 | 进程查询 | 文谷论坛
编程语言
 C++   Visual Basic   PowerBuilder   Delphi   C#   Java
您现在的位置: IT文谷 >> 编程语言 >> C++ >> 文章正文
让OGRE支持中文(二) ----支持TTF字体了让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了
让OGRE支持中文(二) ----支持TTF字体了
让OGRE支持中文(二) ----支持TTF字体了让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了
让OGRE支持中文(二) ----支持TTF字体了让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了

让OGRE支持中文(二)

        ----支持TTF字体了

       

0.还是前言

        如果你希望能看懂这篇文章,请先确定你已经看到了《让OGRE支持中文》,因为本文是在上一篇文章的基础上写的,并且假设文件都已经按照上一篇文章进行了手术。但是如果你只想简单的使用TTF字体,只要下载本文附带的文件,重新编译就可以了。

       

       

1.检讨

        正如上回说的,我们已经实现了一个位图的字体。但是当冷静下来思考时,就能发现这种方法的诸多缺陷。读入一个2048*2048的位图,等于在显存中保存一个2048*2048的贴图,不说是否所有显卡都支持这么大的贴图,单是每个Font字体类吃显存的胃口,就足以令人心惊肉跳。如果定义足够多的字体类,我想你的游戏的配置要求,在某些方面足以超过《DOOM3》了。

        而且这并不是唯一的缺陷,文字大小相对于位图大小比例相差太大,导致浮点数的文字位置误差很大,你可以在一个文字旁边看到其他文字的影子。(虽然可以通过增加文字间距来解决。)还有点阵字体本身的缺陷,就是字形单一,不适合放大缩小,一些文字边缘的马赛克,足以熄灭任何玩家的投入感。

        似乎TTF是唯一的解决之道。

       

       

2.基本知识

 

(1)TTF字体。

        TTF是一种矢量字库。我们经常可以听到矢量这个词,像是FLASH中的矢量图形,在100*100分辨率下制作的flash,就算它放大为全屏,显示出的画面也不会出现马赛克。所谓矢量,其实说白了就是用点和线来描述图形,这样,在图形需要放大的时候,只要把所有这个图形的点和线放大相应的倍数就可以了。而且,在网站上有很多的TTF字库可以下载,或者你可以去买一些专门的字库光盘。然后在你发行你精心制作的游戏时,可以顺便捎上这些后缀为.ttf的文件就行了。包括Quake这样的惊世之作,也都是用的TTF字库。

 

(2)FreeType2库

        在http://www.freetype.org,有一个FreeType的免费库,而且是OpenSource的。它目前有2个版本:1.0和2.0。其区别在于,1.0只能读取TTF格式的,而2.0支持更多的文件格式,在使用它之前请详细阅读所要遵循的Licence,以下是摘自FreeType2.0对字库的支持列表:

 

        TrueType fonts (and collections)

        Type 1 fonts

        CID-keyed Type 1 fonts

        CFF fonts

        OpenType fonts (both TrueType and CFF variants)

        SFNT-based bitmap fonts

        X11 PCF fonts

        Windows FNT fonts

 

(3)“主体思想”

        请参照炎龙工作室的《游戏中汉字显示的实现与技巧》这篇文章,可惜使用的是Windows API,作者千里马肝,上网上搜一下吧。

        附带说一句,上面两条都是直接从这文章中剪切下来的,>_<  不要骂我啊,不知道算不算侵权呢。

       

       

3.动手术---比你想象的要麻烦

 

(1)

        首先要告诉字体类,我们下一次渲染需要哪些字。以便字体类可以在需要的时候释放不使用的字体。

        在Font类中~

        a.增加数据 bool mUsing[OGRE_NUM_GLYPHS]; 用来标记文字是否使用。

        b.增加函数

                inline void setUsing(std::vector<unsigned long>& caption)

                {

                        memset(this->mUsing,0,sizeof(this->mUsing));

                        std::vector<unsigned long>::iterator it;

                        for(it=caption.begin();it!=caption.end();++it)

                        {

                                if(OGRE_GLYPH_INDEX(*it)<OGRE_NUM_GLYPHS)

                                this->mUsing[OGRE_GLYPH_INDEX(*it)]=1;//标记文字为使用

                        }

                }

        并在 void TextAreaGuiElement::updateGeometry() 中调用这个函数。

 

(2)

        然后是修改void Font::createTextureFromFont(void);

        Font类是通过void Font::createTextureFromFont(void)来把通过FreeType2分析好的英文字画在一个2^n*2^n的贴图上,然后再保存英文字的位置。

        我们需要修改的是:

        a.从函数中分离并保存画字的FreeType2和辅助变量。我们通过一个类来保存和处理这些变量。

        class TTFMsg

                {

                        class Max//类中类,用来保存几个"最大",

                        {

                                int nothing;//这个是用来占位的,没意义,反正没他就运行出错,可能和数据对齐有关吧。

                        public:

                                int height;//文字最大高度

                                int width;//最大宽度

                                int bear;//最大空隙?

 

                        };

                public:

                        FT_Library ftLibrary;//FreeType2用

                        FT_Face face;//FreeType2接口?

                        uint char_spacer;//文字空隙

                        SDDataChunk ttfchunk;//数据块,用来保存ttf信息

                        FT_F26Dot6 ftSize;//FreeType2字体大小

                        std::pair<uint,uint> point;//在位图上画字的点

                       

                        SDDataChunk imgchunk;//数据块,用来保存位图信息

                        bool dirty;//标记,看是否需要更新贴图

                       

                        Max max;//几个最大

                        inline bool init(Font*  font) //这个是初始化函数在void Font::createTextureFromFont(void);中调用.

                        {      

                                //以下都是初始化,大部分都是从void Font::createTextureFromFont(void);移植过来的

                                dirty=false;

                                if( FT_Init_FreeType( &ftLibrary ) )

                                  Except( Exception::ERR_INTERNAL_ERROR, "Could not init FreeType library!",

                                "Font::Font");

               

                                char_spacer= 5;

                                FontManager::getSingleton()._findResourceData(font->mSource,ttfchunk);

                                if( FT_New_Memory_Face( ftLibrary, ttfchunk.getPtr(), (FT_Long)ttfchunk.getSize() , 0, &face ) )

                                         Except( Exception::ERR_INTERNAL_ERROR,

                                        "Could not open font face!", "Font::createTextureFromFont" );

                                ftSize = (FT_F26Dot6)(font->mTtfSize * (1 << 6));

                                if( FT_Set_Char_Size( face, ftSize, 0, font->mTtfResolution, 0 ) )

                                        Except( Exception::ERR_INTERNAL_ERROR,

                                        "Could not set char size!", "Font::createTextureFromFont" );

 

                                return true;

                        }

                        inline bool done()

                        {

                                //在Font的解构函数中调用的,本来应该调用下面两个函数,但是不知道为什么一调用就出错,不用倒没事。

                                //FT_Done_Face(face);

                                //FT_Done_FreeType(ftLibrary);

                                return true;

                        }

                        inline bool getRect(Image::Rect & rect)//让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了

  • 上一篇文章:

  • 下一篇文章:
  • 进入论坛讨论

    相关文章
    vc++学习精髓(收集,整理)
    谈无标题窗口的拖放
    VC6.0的若干实用小技巧
    模拟ctrl+alt+delete三键
    一种全新的软件界面设计方法
    ADO编程中ATL所遇到的定义问题
    进程之间数据的共享:共用内存
    规范化编程:ANSI和UNICODE的使用
    利用C++编写Windows服务程序的一般框架
    在RichEdit中插入Bitmap
    关于OPENCV的源代码资料以及链接(zz)
    如何快速检测PocketPC是否已经连接到PC上
    热门文章最新推荐

    版权与免责声明:
    ① 本网转载其他媒体稿件是为传播更多的信息,此类稿件不代表本网观点,版权归原作者所有,本网不承担此类稿件侵权行为的连带责任。
    ② 本站原创文章,转载时请注明出自文谷及作者姓名
    ③在本网BBS上发表言论者,文责自负。
    ④如您因版权等问题需要与本网联络,请在30日内联系 。
    让OGRE支持中文(二) ----支持TTF字体了让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了
    让OGRE支持中文(二) ----支持TTF字体了让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了2006-10-28 8:00:38让OGRE支持中文(二) ----支持TTF字体了

    全站热点
    最新推荐
    关于文谷 | 联系文谷 | 免责声明 | 文谷论坛
    Tel: 0577-65690019      E-mail: ichenjian@gmail.com    MSN:ichenjian@hotmail.com    QQ:2911194
    Copyright © 2004-2008 wengu.com 文谷 All Rights Reserved
    浙ICP备05000327号