我使用下面的代码格式化了字符串
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为中心...
发生了什么事?
答案 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 );