几乎在每一个游戏里都需要在屏幕上面显示一些文字.在游戏中,字体从头到尾都应该有一个整体的风格.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,来防止这种情况的发生.
|