伯乐共勉

讨论。NET专区
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
文本和字体
实际上,在每个游戏中,开发者都需要在屏幕上显示文本。在游戏里面,通常使用自定义字体以适合整个游戏的风格。Symbian操作系统提供了标准的字符集,也能够创造你自己的位图字体。在系统中每种字体只有一个实例由所有线程共同分享,这样做是为了节省主存。

当使用某一特定字体显文本的时候,你必须:
        通过screen device所给的参数查询字体创建一个CFont对象(CGraphicsDevice::GetNearestFontInTwips)。
        在显文本之前,为创建的对象设置graphics context的字体。(CWindowGc::UseFont)
        当字体不再需要,它能够使用CGraphicsDevice::ReleaseFont释放。释放字体之前,必须先被graphics context释放(CWindowGc:iscardFont)。

下面的例子创建了一个新的字体,显文本,然后释放字体:
void CMyGameView:raw( const TRect& /*aRect*/ ) const
   {
   CWindowGc& gc = SystemGc();

   // Get smallest possible arial font
   _LIT(KMyFontName,"Arial";
   CFont* myFont;
   TFontSpec myFontSpec(KMyFontName,1);

   CGraphicsDevice* screenDevice = iCoeEnv->ScreenDevice();
   screenDevice->GetNearestFontInTwips(myFont,myFontSpec);

   // Use new font
   gc.UseFont(myFont);

   // Draw some text
   _LIT(KMyText,"My text";
   gc.DrawText(KMyText, TPoint(40, 40) );

   // Discard and release the font
   gc.DiscardFont();
   screenDevice->ReleaseFont(myFont);
   }

在实际应用中,字体是在ConstructL中创建,在析构函数中释放。

TFontSpec明确了字体的属性:
        字体的高度。
        字体类型(TFontFace);例如,“Roman”,“Courier”。每种字体都有符号,衬线,比例等属性。
        字体风格(TFontStyle);姿势(斜体),力度(加粗)和打印位置(下标,上标。)

注意到当用特定的属性查询字体时,返回与所给属性最匹配的字体。

CEikonEnv也包含了获取环境所使用的典型字体的方法集,例如,CEikonEnv::TitleFont返回标准标题字体。这会在使程序看起来与整个系统更加协调。

查出字体集中可供使用的字体,可以使用CGraphicsDevice ::NumTypeFaces来获得可用字体的数量,用CGraphicsDevice ::TypeFaceSupport来获得字体的细节:
void CMyGameView::ListMyFontsL()
   {
   // Find out the number of typefaces
   TInt iNumTypefaces = iCoeEnv->ScreenDevice()->NumTypefaces();

   // Show name of each available font
   TBuf<64> myFontName;
   TBuf<128> text;
   for(TInt t = 0; t < iNumTypefaces; t++)
      {
      // Get font name
      TTypefaceSupport myTypefaceSupport;
      iCoeEnv->ScreenDevice()->TypefaceSupport(myTypefaceSupport, t);
      myFontName = myTypefaceSupport.iTypeface.iName.Des();

      _LIT(KMyText, "Font %d/%d:";
      text.Format(KMyText, t, iNumTypefaces);
      iEikonEnv->InfoWinL(text, myFontName);
      }
   }
特别地,有时在游戏中需要创建自定义字体。自定义显文本例程,复制包含在位图中的每一个字符图形,是显文本和使任何类型的文本显示出来的最有效最快的方法,但是这实现起来是需要花费一些时间。

你也可以使用现有的字体和图形API来创建Symbian操作系统新的字体,就像其它任何自已一样。创造自定义字体需要:
        创建一个字体定义文件;例如,MyFont.gd
        创建Adobe BDF(位图分类格式)字体位图;例如,MYFont.bdf。
        如果缺少,还要加入必须的Symbian操作系统特定的属性到BDF文件中。
        使用fnttran工具来创建Symbian操作系统字体存储文件,例如,MyFont.gdr。(例如,fnttran MyFont.bdf MyFont.gd MyFont.gdr)
        通过在创建安装包时定义pkg文件,拷贝创建的字体文件,MyFont.gdr,到设备的\system\fonts目录,对于模拟器来说只要拷贝到fonts目录就可以了。

字体定义文件(MyFont.gd)如下:
Typeface tf_MyFont
   Name "My Font" Proportional
   FontBitmaps
      MyFont   // Name of the font in BDF file
   EndFontBitmaps
EndTypeface

FontStoreFile
   CollectionUid 123456789 // Uid of the font; must be unique
   KPixelAspectRatio 1000
   CopyrightInfo
      "MyCopyrightInfo"
   EndCopyrightInfo
   Typefaces
      tf_MyFont
   EndTypefaces
EndFontStoreFile

因为BDF格式(Adobe提供技术规范)通用,很多不同的软件都能用来创建字体。BDF文件能够用像Windows bitmaps或者特定的字体编辑器,或仅仅依靠手工来创建文件,因为基本上它只是一个文本文件,但是手工创建一种新的字体还是会花费很多努力的。

创建了BDF文件,通常还需要一点修改。这些属性必须在BDF文件中存在(在STARTPROPERTIES和ENDPROPERTIES之间):
        Uid uid  (和CollectionUid不同)
MaxNormalWidth width
MaxConsecutiveFillChars max
Bold [1/0]
Italic [1/0]
FONTASCENT ascent
FONTDESCENT descent

特别地,BDF文件缺少Uid和MaxNormalWidth属性。如果一些值缺少,fnttran会有提醒。

当创建字体存储文件MyFont.gdr,拷贝到设备(或模拟器)\system\fonts目录下后,它就可以像其他字体那样使用了:
CFont* CMyGameView::GetMyOwnFont()
   {
   _LIT(KMyFontName,"MyFont");
   CFont* myFont;
   TFontSpec myFontSpec(KMyFontName,1);

   CGraphicsDevice* screenDevice = iCoeEnv->ScreenDevice();
   screenDevice->GetNearestFontInTwips(myFont,myFontSpec);
   return myFont;
   }

字体文件可以拷贝到任何一个驱动器(C:\system\fonts, E:\system\fonts),要软重启后字体才能被使用。也可以使用CWsScreenDevice::AddFile动态安装,那样不用重启就可以用了。