首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> 专家专栏 >> 剑走偏锋 >> 正文
Graphics(3)
作者:剑走偏锋    文章来源:本站原创    更新时间:2005-8-9 15:29:04
    几乎在每一个游戏里都需要在屏幕上面显示一些文字.在游戏中,字体从头到尾都应该有一个整体的风格.Symbian系统提供了一个标准的字体设置,但是开发者也可以根据情况,使用自己的比特图字体.每一个字体都只能有一个实例存在与系统中,而且他被所有的系统线程所共享,因此,他被保存在主内存中.

    当你使用一个特定的字体时,应该注意:
    1.创建CFront的一个对象来获得屏幕设备给定的一个参数(CGraphicsDevice::GetNearestFontInTwips).
    2.在开始画Text之前,在图形连接里面建立一个字体.(CWindowGc::UseFont)
    3.当一个字体不再被使用时,他应该被释放掉.释放的步骤首先在图形连接里使用CWindowGc:iscardFont释放,然后在CGraphicsDevice::ReleaseFont释放.下面示例代码演示了如何创建新字体,显示一些文本,和释放字体:
以下内容为程序代码:

void CMyGameView:[img]/images/biggrin.gif[/img]raw( const TRect& /*aRect*/ [img]/images/wink.gif[/img] const

   {

   CWindowGc& gc = SystemGc();

 

   // Get smallest possible arial font

   _LIT(KMyFontName,"Arial"[img]/images/wink.gif[/img];

   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"[img]/images/wink.gif[/img];

   gc.DrawText(KMyText, TPoint(40, 40) [img]/images/wink.gif[/img];

 

   // Discard and release the font

   gc.DiscardFont();

   screenDevice->ReleaseFont(myFont);

   }

    在实际运用过程中,字体通常使用ConstructL来创建,然后用爆破装置(C4炸弹)Boom!!!一下就会被炸的稀巴烂,哈哈.使用TFontSpec来指定字体的一些特性:字体高度,字体(宋体,仿宋,罗马等),字体样式(加粗,黑体等).当你使用相关方法查询当前字体的相关描述时,将会返回一个最接近的描述.

    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:"[img]/images/wink.gif[/img];

      text.Format(KMyText, t, iNumTypefaces);

      iEikonEnv->InfoWinL(text, myFontName);

      }

   }

    特别是在游戏中,有时候,你需要创建一个属于自己的字体.你自己的字体必须含有所有你要显示的字的样式,这样做的好处是你可以在游戏里显示多个字体,但是自己做一个这样的字体比较浪费时间.所以你也可以创建一个新的Symbian OS字体,使用已经存在的字体和图片API,把你想要使用的字体包含进来.创建一个自定义字体,你需要:
    1.建立一个字体定义文件,例如MyFont.gd
    2.创建Adobe BDF (Bitmap Distribution Format)字体比特图;例如MyFont.bdf.
    3.使用fnttran工具建立一个Symbian OS字体储存文件,例如 MyFont.gdr(例如fnttran MyFont.bdf MyFont.gd MyFont.gdr)
    4.拷贝MyFont.gdr到指定的\system\fonts文件夹下面,然后在建立软件安装包的时候,要修改.pkg文件,模拟器会自动拷贝字体文件到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格式被广泛使用后,他的多种格式可以被用来创建字体.BDF文件可以以多种方法来创建,例如windows比特图,字体编辑器等,或者也可以手动创建.因为字体文件的基础就是一个文本文件,但是手动创建会很困难.

    当创建了BDF文件以后,经常性的会需要一些修正,这些属性存在于BDF文件里(在STARTPROPERTIES和ENDPROPERTIES之间).
以下内容为程序代码:

Uid uid  (并不是和收集的Uid一样.)

MaxNormalWidth width.

MaxConsecutiveFillChars max.

Bold [1/0].

Italic [1/0].

FONTASCENT ascent.

FONTDESCENT descent.

    通常情况下Uid和MaxNormalWidth是BDF文件中缺失的,fnttran将会在某些属性缺失的情况下通知你.当你创建字体储存文件MyFont.gdr的时候,他就已经被拷贝到\system\fonts下面了,他也会和其他字体一样在手机或模拟器里使用.示例:
以下内容为程序代码:

CFont* CMyGameView::GetMyOwnFont() 

   {

   _LIT(KMyFontName,"MyFont"[img]/images/wink.gif[/img];

   CFont* myFont;

   TFontSpec myFontSpec(KMyFontName,1);

 

   CGraphicsDevice* screenDevice = iCoeEnv->ScreenDevice();

   screenDevice->GetNearestFontInTwips(myFont,myFontSpec);

   return myFont;

   }

    字体文件可以被拷贝到任意驱动器的文件夹下,如C:\system\fonts, E:\system\fonts,但是一旦被移动了,在字体被应用程序使用之前需要重启动一下.你也可以使用CWsScreenDevice::AddFile,来防止这种情况的发生.
相关文章:
使用开发者平台为S90系列手机开发移动应用程序
处理文字的换行
 

站点地图 | 加入收藏 | 联系站长 | 广告服务 |
QQ:280529124  Tel:0592-8271361 辽ICP备05021703号