Есть ли простой способ центрировать sf::Text
объект в sf::RectangleShape
объект?
Текст имеет переменную длину, но не изменяется после создания.
Я использую SFML 2.4.
Центрирование одного объекта над другим обычно является тривиальной задачей: просто определите разницу в размерах между объектами и используйте его как смещение, разделив его на 2.
Однако, как только вы используете рендеринг шрифтов (True Type), все становится немного сложнее, потому что происхождение этих глифов шрифтов не обязательно находится в верхнем левом углу фактического глифа. Это может быть где угодно, в зависимости от шрифта и символа / глифа, который будет отображаться (засечками и другими элементами оформления являются типичным примером для этого).
Возвращаясь к основной формуле:
offset = (shape.size() - text.size()) / 2
Теперь давайте добавим смещение текста:
offset = (shape.size() - text.size()) / 2 - text.offset()
Есть несколько способов сделать это с помощью SFML. Лично я бы, наверное, создал свой кастом sf::Drawable
Производный класс, рисующий как поле, так и текст.
Для автономного рисования (как вы делаете), я на самом деле предпочитаю устанавливать происхождение текста для учета смещения. Таким образом, вы сможете одинаково установить как форму, так и положение текста, и они будут идеально выровнены, не затрагивая источник / смещение снова (если вы не измените текст).
const sf::FloatRect bounds(text.getLocalBounds());
const sf::Vector2f box(shape.getSize());
text.setOrigin((bounds.width - box.x) / 2 + bounds.left, (bounds.height - box.y) / 2 + bounds.top);
Обратите внимание, что я в основном менял операнды, так как я устанавливаю источник, а не смещение. Например, чтобы переместить текст на 5 единиц вправо, я должен установить начало координат на -5
скорее, чем 5
,
Константа на самом деле просто для того, чтобы сделать всю строку немного более читабельной. Вы могли бы также делать все встроенное, но я предпочитаю более чистый способ.
Вот все, что в действии, используя Arial и Lucida Handwriting:
Обратите внимание, что «Hello World» выравнивается по-разному в зависимости от того, занимают ли глифы шрифта больше места вниз. Если вы не хотите такого поведения, вам придется использовать некоторую фиксированную высоту строки, а не полагаться на высоту sf::Text
объект.
Других решений пока нет …