Как центрировать sf :: Text в sf :: RectangleShape

Есть ли простой способ центрировать sf::Text объект в sf::RectangleShape объект?

Текст имеет переменную длину, но не изменяется после создания.

Я использую SFML 2.4.

0

Решение

Центрирование одного объекта над другим обычно является тривиальной задачей: просто определите разницу в размерах между объектами и используйте его как смещение, разделив его на 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 объект.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector