Проблемы с пробелами в C# String.Format и SpriteBatch.DrawString
У меня есть строки, отформатированные с использованием кода ниже
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 будет центрировано по 00 в 5002...
Что здесь происходит?
3 ответа
Проще говоря, я подозреваю, что вы не используете моноширинный шрифт. Когда разные символы имеют разную ширину, вы не можете использовать пробелы для выравнивания. (Ваш образец работает при использовании Console.WriteLine
например, поскольку консоль имеет шрифт фиксированной ширины по умолчанию.)
Вам придется либо использовать моноширинный шрифт, либо вам придется рисовать строки отдельно - нарисовать каждую строку, чтобы она соответствовала соответствующей области. Я ничего не знаю о XNA, но я ожидаю, что вам придется либо измерить ширину строки, прежде чем нарисовать ее (например, вы можете вычесть ее из правого края), либо указать какой-то вид значение макета, которое указывает "выровнять эту строку вправо с определенной точкой".
Скорее всего, вы рисуете текст пропорциональным шрифтом. Помните, что символы не имеют одинаковую ширину, поэтому вы не можете выровнять текст по пробелам.
Поскольку у меня нет прав на ответ (или что-то подобное, поскольку нет кнопки ответа для ответов), но я хотел бы внести свой вклад, я опубликую этот ответ.
В ответе Джона упоминается измерение строки, это возможно spriteFont.MeasureString(string s);
, Это возвращает Vector2, X часть которого является шириной визуализированного текста. (Y - высота, которая может быть полезна для других целей). Это позволяет использовать шрифт, отличный от моноширинного.
Вот пример использования MeasureString
:
Я не совсем уверен, о чем спрашивает вопрос, но если вы хотели одну строку текста, похожую на "Kills:50 Points:5002", но ширину двух разных вызовов spritebatch, вы могли бы сделать следующее (заметьте, я набрал это непосредственно в stackru, поэтому могут быть незначительные синтаксические ошибки):
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 );