[翻译]XNA 3.0 Game Programming Recipes之fifteen

PS:自己翻译的,转载请著明出处
                                             3-5 显示文本文字
问题
    你想显示一写文字,例如,想显示一些信息或者当前分数。
解决方案
    SpriteBatch类,在这章的前四节第一次被说明,它也有渲染文本的能力。它和纹理一样用几乎相同方式被渲染。而不是导入一个texture2D,应该导入一个SpriteFont,它包含了你想使用的字体的类型和字体大小。下一步,你能可以使用SpriteBatch.DrawString方法来绘制你的文本。
它是如何工作的
       首先,您需要创建一个SpriteFont文件。在你的XNA工程中点击你的Content选择Add-New item添加进去。选择精灵字体的对话框,给字体添加一个名字(如ourFont),然后点击Add.
    你应该呈现一个XML页面。那最重要的一行是设置FontName的属性。改变字体使你想要呈现在里面。下一个字体允许你选择字体的大小,同样也可以缩放字母。
注意:你可以指定任何存在于你电脑上的字体。打开C:\WINDOWS\FONTS(如,电击开始按钮,选择运行,输入上述路径名)查看安装过的字体列表。字体的名字列显示了所有你可以指定的字体。如,如果字体的名字是Times New Roman,你可以指定Times New Roman作为FontName属性。
注意:在别的PC机上编译你的代码,字体必须已经安装在这台电脑上了,否则会报错。
提示:如同所有的艺术资产,一定要检查的字体版权在您开始你的项目之前。
    随着SpriteFont文件被创建,应该在你的类中添加一个SpriteFont变量到你的类中:
1 SpriteFont myFont;
    它应该在LoadContent方法中被初始化:
1 myFont=Content.Load<SpriteFont>("ourFont");
    确保你指定文件名你刚才创建在括号之间的。随着你的SpriteFont对象的加载,你已经可以使用你的Draw方法绘制一些文本内容了:
1 spriteBatch.Begin();
2 string myString="Elapsed seconds:"+gameTime.TotalGameTime.Seconds.ToString();
3 spriteBatch.DrawString(myFont,myString,new Vector2(50,20),Color.Tomato);
4 spriteBatch.End();
提示:如果你使用另外一个SpriteBatch.Begin方法的重载,确定指定SpriteBlendMode.AlphaBlend作为第一个参数。换句话说,字母周围的象素不会被改变,绘制你的字母作为你指定颜色实心块。
字符串长度
     你可能有疑问,一个spriteFont它在屏幕上会占多少个象素。这些信息可以用来缩放或者截取太长的字符串。你可以得到字符串的水平和垂直的大小。
1 Vector2 stringSize=myFont.MeasureString(myString);
重载
   SpriteBatch.DrawStringSpriteBatch.Draw方法中有一些别的被接收的重载版本。参看3-2节解释说明。
1 spriteBatch.DrawString(myFont,secondString,new Vector2(50,100),Color.White,0,new Vector2(0,0),0.5f,SpriteEffects.None,0);
StringBuilder
    代替刚刚接收的字符串,spriteBatch.DrawString方法同样接收一个StringBuilder对象。StringBuilder对象应该使用,如果你对字符串做了修改,如追加一些字符到字符串末尾。首先在你的代码顶上添加一个StringBuilder变量,这样你在每一祯就不需要重新创建一个了。
1 StringBuilder stringBuilder=new StringBuilder();
    当你想使用这个方法,首先设置它的长度为0。然后,创建字符串,传递StringBuilderSpriteBatch.DrawString方法中:
1 stringBuilder.Length=0;
2 stringBuilder.Append("StringBuilder example:");
3 for(int i=0;i<10;i++)
4    stringBuilder.Append(i);
5 stringBatch.DrawString(myFont,stringBuilder,new Vector2(50,180),Color.White,0,new Vector2(0,0),0.5f,SpriteEffects.None,0);
代码
 1 //   你的SpriteFont对象在LoadContent方法中被初始化,与SpriteBatch一起被默认加载:
 2 protected override void LoadContent()
 3 {
 4     device=graphics.GraphicsDevice;
 5     spriteBatch=new SpriteBatch(GraphicsDevice);
 6     myFont=Content.Load<SpriteFont>("ourFont");
 7 }
 8 //这2个你需要的对象用Draw方法绘制一些文本内容
 9 protected override void Draw(GameTime gameTime)
10 {
11     device.Clear(ClearOptions.Target|ClearOptions.DepthBuffer,Color.CornflowerBlue,1,0);
12     spriteBatch.Begin();
13     string myString="Elapsed seconds:"+gameTime.TotalGameTime.Seconds.ToString();
14     spriteBatch.DrawString(myFont,myString,new Vector2(50,20),Color.Tomato);
15     spriteBatch.End();
16     base.Draw(gameTime);
17 }

posted on 2009-07-25 15:53  一盘散沙  阅读(286)  评论(0编辑  收藏  举报

导航