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  阅读次数:6289

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号