最近在做十字之门的文字输出,可是却发现了一个问题,文字的锯齿现象严重,回想到以前的很多游戏,似乎都有这个现象。查阅了一些资料,Windows本身就是没有抗锯齿功能,即便是开启了ClearType,也不会对图形游戏有效。在游戏中要使文字清晰,必须要找出一个类似于ClearType的方法。
Windows中跟字体相关的API函数有CreateFont、CreateFontIndirect和CreateFontIndirectEx,其中各个函数又分为A版和W版,也就是ASCII与Unicode的区别。以上几个函数的作用都是相同的,创建一种可供任何设备使用的逻辑字体。不同的是,CreateFont将字体特性直接作为参数传入函数,而CreateFontIndirect是将字体特性保存在LOGFONT结构中,再将该LOGFONT传入函数。在Windows.pas中LOGFONT被定义为等同于tgaLOGFONTA,其中tagLOGFONTA是这样定义的:
- tagLOGFONTA = packed record
- lfHeight: Longint;
- lfWidth: Longint;
- lfEscapement: Longint;
- lfOrientation: Longint;
- lfWeight: Longint;
- lfItalic: Byte;
- lfUnderline: Byte;
- lfStrikeOut: Byte;
- lfCharSet: Byte;
- lfOutPrecision: Byte;
- lfClipPrecision: Byte;
- lfQuality: Byte;
- lfPitchAndFamily: Byte;
- lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
- end;
我们要做的就是修改其lfQuality属性,该值决定了文字的输出质量,可取值为DEFAULT_QUALITY(默认质量)、DRAFT_QUALITY(草稿质量)、PROOF_QUALITY(正稿质量)、NONANTIALIASED_QUALITY(无抗锯齿质量)和ANTIALIASED_QUALITY(抗锯齿质量)。在这里,我们选用ANTIALIASED_QUALITY。
- procedure DrawText;
- var
- lf: LogFont;
- bmp: TBitmap;
- begin
- bmp := TBitmap.Create;
- bmp.SetSize(320, 240);
- with bmp.Canvas.Font do
- begin
- Name := '方正小标宋简体';
- Size := 14;
- GetObject(Handle, SizeOf(LogFont), @lf);
- lf.lfQuality := ANTIALIASED_QUALITY;
- Handle := CreateFontIndirect(lf);
- end;
- bmp.Canvas.TextOut(0, 0, '十字之门Preview2即将竣工');
- Canvas.Draw(50, 50, bmp);
- bmp.Free;
- end;
不过十字之门用的字体输出却不是这种方式,会把字体全部打包起来,免去了用户安装字体的麻烦。不过从这段代码中,应该可以看出关于十字之门的些什么吧。^_^