Проблемы с пробелами в C # String.Format и SpriteBatch.DrawString - PullRequest
3 голосов
/ 25 марта 2012

У меня есть строки, отформатированные с использованием кода ниже

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, а точки = 5002, 50 будет центрировано по 00 в 5002 ...

Что происходит?

Ответы [ 3 ]

3 голосов
/ 25 марта 2012

Скорее всего, вы рисуете текст с пропорциональным шрифтом. Помните, что символы имеют разную ширину , поэтому вы не можете выровнять тексты с пробелами.

3 голосов
/ 25 марта 2012

Проще говоря, я подозреваю, что вы не используете моноширинный шрифт .Когда разные символы имеют разную ширину, вы не можете использовать пробелы для выравнивания.(Ваш пример работает, например, при использовании Console.WriteLine, поскольку консоль по умолчанию имеет шрифт фиксированной ширины.)

Вам придется либо использовать моноширинный шрифт, или вам придется рисовать строки отдельно - рисуйте каждую строку, чтобы она соответствовала соответствующей области.Я ничего не знаю о XNA, но я ожидаю, что вам придется либо измерить ширину строки, прежде чем нарисовать ее (например, вы можете вычесть ее из правого края), либо указать какой-то видзначение макета, которое указывает «выровнять эту строку вправо с определенной точкой».

1 голос
/ 26 марта 2012

Поскольку у меня нет привилегий для ответа (или чего-то подобного, поскольку нет кнопки ответа для ответов), но я хотел бы внести свой вклад, я опубликую этот ответ.

В ответе Джона упоминается измерениестрока, это возможно с помощью spriteFont.MeasureString(string s);.Это возвращает Vector2, X часть которого является шириной отображаемого текста.(Y - высота, которая может быть полезна для других целей). Это позволяет вам использовать шрифт, отличный от моноширинного.

Вот пример использования MeasureString:

I 'Я не совсем уверен, о чем идет речь в вопросе, но если вам нужна отдельная строка текста, похожая на «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 );
...