




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

Обратите внимание, как «Hello World» выравнивается по-разному в зависимости от того, занимают ли глифы шрифта больше места внизу. Если вам не нужно такое поведение, вам придется использовать некоторую фиксированную высоту строки, а не полагаться на высоту объекта sf::Text.
Не работай на меня. Мой результат: ссылка на сайт Мой код: ссылка на сайт
@Profiluefter Вы забыли установить позицию текста.
@Profiluefter См. Мой пример; в том же положении, что и фигура / коробка / что угодно.
О, на самом деле только что заметил, что я не включил полный исходный текст. Но в любом случае, если вы работаете с источником, в основном это так: установите оба в одну и ту же позицию. Вы также можете напрямую добавить фактическое смещение к своей позиции.
Обратите внимание, что я немного обновил код, так как вы не должны вдвое уменьшать смещение текста.