作者:clayman
仅供个人学习使用,请勿转载,勿用于任何商业用途。
由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。
Blog:http://blog.csdn.net/soilwork
在XNA中绘制字体是一件很麻烦的事。由于XNA是跨平台的,而在Xbox 360中,并不存在系统字体,所以,目前的xna并不支持绘制字体。虽然我们仍然可以使用一些方法,在xna中调用GDI+来绘制字体,但这样你的程序就失去了跨平台性,同时,调用GDI+也会影响绘图的效率,因此,这不是一个推荐的方法。那应该如何来做呢?
目前较好的解决方案是使用位图字体(Bitmap Font)。所谓位图字体,其实就是预先把字体制作为一张位图,之后,就可以把位图当作字体来使用了。需要注意,由于字体已经制作为了位图,因此,大小是固定,所以应该根据需要,创建不同大小版本。当然,位图字体也提供了我们为游戏创建独一无二字体的能力。为了方便使用,通常把很多字体绘制到一张位图中,这就带来了另一个问题: 如何从一张图片中识别某个字符呢?很简单,常见的位图字图创建工具在创建位图的同时,还会创建一个xml文件。在这个文件中,记录了每个字符在位图中的位置,大小,下面是某个xml文件中,标示字母“A”的代码:
<glyph ch="A" code="0041" bm="0" origin="95,27" size="15x27" aw="14" lsb="0" />
就像查字典一样,通过这个xml文件,我们就能定位所要的字符。
(一张Bitmap Font)
和都是创建位图字图不错的工具。特别是Bitmap Font Generator,会根据字体大小来排列字体,尽量减少位图尺寸。但这两个工具都不能很好的支持Unicode,也就是说,如果需要创建中文,那么可能会遇到一些问题。这里推荐使用XNAExtras工具包。XNAExtras是XNA Diares提供的一系列助手程序和类。包含了BMFontGen,一个用于创建位图字体的,支持Unicode的小工具;BitmapFont,可以使用BMFontGen创建的位图字体,方便的绘制字体的类。此外,他还包含了一些Demo,和一些用于绘制sprite的工具。如果有时间,最好仔细研究一下BitmapFont的源码,能让你对使用位图字体有更加深入的认识。万一觉得代码太复杂,那么不妨先看看 上另外一篇创建和绘制字体的教程。
--------------------------------------------------------------------------------上古分割线------------------------------------------------------
上一次提到把Game类的AllowUserResizing设置为true就能改变窗口大小。不知你发现没有,缩放窗口时会出现一个bug,当前窗口会跑到桌面上所有窗口之下(如果你开了很多窗口)。解决方法是添加System.Windows.Forms;引用,接下来在程序初始化代码中为this.Window.ClientSizeChanged事件添加一个eventhandler,然后在eventhandler中添加如下代码:
((System.Windows.Forms.Form)System.Windows.Forms.Form.FromHandle(Window.Handle)).BringToFront();
ps:10月分的DirectX SDK中,将不再包含MDX 2.0,纪念一下~~~