文本和字体
实际上,在每个游戏中,开发者都需要在屏幕上显示文本。在游戏里面,通常使用自定义字体以适合整个游戏的风格。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动态安装,那样不用重启就可以用了。
实际上,在每个游戏中,开发者都需要在屏幕上显示文本。在游戏里面,通常使用自定义字体以适合整个游戏的风格。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动态安装,那样不用重启就可以用了。
浙公网安备 33010602011771号