C#String.Format和SpriteBatch.DrawString间距问题

时间:2012-03-24 22:45:10

标签: c# string xna formatting drawing

我使用下面的代码格式化了字符串

String.Format("{0,-10} {1,10}", "Kills:", kills);
String.Format("{0,-10} {1,10}", "Points:", points);
String.Format("{0,-10} {1,10}", "$:", currency);

根据我的理解,字符串的第一部分应该用10空格缓冲区左对齐,然后整数变量应该用10空格缓冲区右对齐打印。

但是,当尝试使用SpriteBatch.DrawString绘制字符串时,没有任何对齐正确。

左对齐侧打印正确,但右对齐侧以某个点为中心,例如,如果kills = 50且points = 5002,则50将在5002中以00为中心...

发生了什么事?

3 个答案:

答案 0 :(得分:3)

很简单,我怀疑你没有使用monospaced font。当不同的字符具有不同的宽度时,您不能使用空格来排列。 (例如,使用Console.WriteLine时,您的示例有效,因为默认情况下控制台具有固定宽度的字体。)

要么必须使用等宽字体,你必须单独绘制字符串 - 绘制每个字符串以适合相关区域。我对XNA一无所知,但是我希望你要么在绘制之前测量字符串的宽度(例如,你可以从右边缘减去它),或者指定某种类型的布局值,表示“将此字符串与特定点右对齐”。

答案 1 :(得分:3)

您最有可能使用比例字体绘制文本。请记住字符的宽度不同,因此您无法将文本与空格对齐。

答案 2 :(得分:1)

由于我没有回复权限,(或某些此类事情,因为没有回复的回复按钮),但我想做出贡献,我会发布此答案。

Jon的回答提到了测量字符串,这可以通过spriteFont.MeasureString(string s);来实现。这将返回一个Vector2,其中X部分是渲染文本的宽度。 (Y是高度,这可能对其他事情有帮助)这允许您使用等宽字体以外的字体。

以下是使用MeasureString

的示例

我不确定问题是什么,但是如果你想要一行类似于“Kills:50 Points:5002”的文字但宽度两个不同的spritebatch调用你可以做以下(注意我键入了这个直接进入stackoverflow,因此可能存在轻微的语法错误):

    float killStringWidth = spriteFont.MeasureString(killString).X;
    spriteBatch.DrawString(spriteFont, killString, new Vector2(0,0), Color.White );
    spriteBatch.DrawString(spriteFont, pointString, new Vector2(killStringWidth + 10, 0), Color.White );