3.5 显示文字
问题
你想绘制一些文字,例如,显示一些操作说明或当前得分。
解决方案
本章前四个教程中学习的SpriteBatch类也可以绘制文字。做法和绘制纹理几乎是一样的,只不过不是导入一个Texture2D,这次导入的是一个SpriteFont,它包含了你想使用的文字大小和类型。然后就可以使用SpriteBatch . DrawString方法绘制文字了。
工作原理
首先需要创建一个SpriteFont文件。右击XNA项目的Content文件夹并选择Add→New item。从对话框中选择SpriteFont,起一个名称(比如ourFont),然后点击Add。
现在看到一个XML页面。最重要的一行是设置FontName属性,可以将这个属性改成你想要绘制的字体。接下去一行可以设置字体大小,你也可以在以后缩放字体大小。
注意:你可以使用任何安装在你的计算机上的TrueType字体。要看到已经安装的字体,可以打开C:\WINDOWS\FONTS目录(例如点击Start按钮,选择Run,并输入这个文件夹地址)。FontName列显示了可以指定的所有字体。例如,如果字体名称为Times New Roman (TrueType),你指定Times New Roman作为FontName 属性。
注意:当在另一台电脑上编译代码时,那台电脑上也必须装有这个字体,否则会报错。
当心:当发布你的程序时,请确保你检查了字体的版权。
创建了SpriteFont文件后,在类中添加一个SpriteFont变量:
SpriteFont myFont;
在LoadContent方法中进行初始化:
myFont = Content.Load<SpriteFont>("ourFont");
加载了SpriteFont对象后,就可以在Draw方法中绘制文本了:
spriteBatch.Begin(); string myString = "Elapsed seconds: " + gameTime.TotalGameTime.Seconds.ToString(); spriteBatch.DrawString(myFont, myString, new Vector2(50, 20), Color.Tomato); spriteBatch.End();
SpriteBatch.DrawString有一些重载方法接受与SpriteBatch.Draw方法相同的参数,可见教程3-1见到具体解释。
当心:如果你使用的是另一个SpriteBatch.Begin的重载方法,请确保指定 SpriteBlendMode.AlphaBlend作为第一个参数。否则,文字周围的像素会变得不透明,将以你指定的颜色绘制文字。
字符串长度
你可以使用spriteFont查询一个字符串实际占据的像素。这个信息对缩放和截取太长的字符串是很有用的。你可以同时获取字符串的水平和竖直大小:
Vector2 stringSize=myFont.MeasureString(myString);
重载方法
SpriteBatch.DrawString有一些重载方法可以可以接受与SpriteBatch.Draw方法相同的参数。解释可见教程3-2。
spriteBatch.DrawString(myFont, secondString, new Vector2(50,100), Color.White,0,new Vector2(0,0),0.5f,SpriteEffet.None,0);
StringBuilder
SpriteBatch.DrawString还可以使用一个StringBuilder对象代替string。如果你需要对字符串进行大量的修改应该使用StringBuilder对象,例如在一个循环中附加大量的字符串。首先在代码顶部添加一个StringBuilder变量,这样就无需每帧重新创建这个对象了:
StringBuilder stringBuilder =new StringBuilder();
当你想使用这个方法时,首先将长度设为0清空StringBuilder。然后创建字符串,将它StringBuilder传递到SpriteBatch.DrawString方法中:
stringBuilder.Length=0; stringBuilder.Append("stringBuilder Example:"); for(int i=0;i<10;i++) stringBuilder.Append(i); spriteBatch.DrawString(myFont, stringBuilder, new Vector2(50,180), Color.White,0,new Vector2(0,0),0.5f,SpriteEffet.None,0);
代码
SpriteFont对象和SpriteBatch在LoadContent方法中进行初始化:
protected override void LoadContent() { device = graphics.GraphicsDevice; spriteBatch = new SpriteBatch(GraphicsDevice); myFont = Content.Load<SpriteFont>("ourFont"); }
这两个对象用来在Draw方法中绘制一些文字:
protected override void Draw(GameTime gameTime) { device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.CornflowerBlue, 1, 0); spriteBatch.Begin(); string myString = "Elapsed seconds: " + gameTime.TotalGameTime.Seconds.ToString(); spriteBatch.DrawString(myFont, myString, new Vector2(50, 20), Color.Tomato); spriteBatch.End(); base.Draw(gameTime); }
发布时间:2009/10/9 下午2:24:40 阅读次数:6350