【问题标题】:C# String.Format and SpriteBatch.DrawString spacing issuesC# String.Format 和 SpriteBatch.DrawString 间距问题
【发布时间】:2012-03-24 22:45:09
【问题描述】:

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

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 上居中...

发生了什么事?

【问题讨论】:

  • 如果它使用固定间距字体渲染,其中每个字符占用相同数量的空间,这将起作用。但是,如果您不明确控制 SpriteFont,则可能性很小。不清楚你是否这样做,你可能不这样做。也不是很漂亮。

标签: c# string xna formatting drawing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      由于我没有回复权限,(或诸如此类的事情,因为没有回复按钮来回答问题),但我想贡献,我会发布这个答案。

      乔恩的回答提到了测量字符串,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 );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多