C#字符串.Format和SpriteBatch.DrawString间距问题

本文关键字:问题 DrawString SpriteBatch 字符串 Format | 更新日期: 2023-09-27 18:28:50

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

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为中心…

发生了什么事?

C#字符串.Format和SpriteBatch.DrawString间距问题

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

您将必须使用单空格字体,必须分别绘制字符串-绘制每个字符串以适应相关区域。我对XNA一无所知,但我希望您在绘制字符串之前必须测量字符串的宽度(例如,这样您就可以从右侧边缘减去它),或者指定某种布局值,指示"将此字符串与特定点右对齐"。

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

由于我没有回复权限(或者一些类似的东西,因为没有回复按钮可以回复),但我想贡献一份力量,我会发布这个答案。

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 );