Кастомный текст sfml
Я пытаюсь создать кастомный текст на основе sfml, но не могу получить ориджин для буквы из-за чего они устанавливаются криво.
Вот пример кода:
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::Sprite sprite, sprite1;
sf::Font font;
font.loadFromFile("segoeui.ttf");
sf::Glyph glyph0 = font.getGlyph('a', 20, false);
sf::Glyph glyph1 = font.getGlyph('F', 20, false);
sprite.setTexture(font.getTexture(20));
sprite.setTextureRect(glyph0.textureRect);
sprite.setPosition(0, 20);
sprite1.setTexture(font.getTexture(20));
sprite1.setTextureRect(glyph1.textureRect);
sprite1.setPosition(glyph1.advance, 20);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(sprite);
window.draw(sprite1);
window.display();
}
return 0;
}
Ответы (1 шт):
У класса sf::Glyph есть поле bounds типа sf::FloatRect. Этот объект содержит такие параметры: высота, ширина и координаты крайней левой точки объекта (не забываем, что это прямоугольник). Поэтому можно выставить буквы в одну строку относительно нижней границы:
Для этого нужно получить высоту символа, а после отнимать от нижней границы строки. В вашем коде это будет выглядеть так:
float height = glyph0.bounds.height;
float height1 = glyph1.bounds.height;
<код>
sprite.setPosition(0, 20 - height);
<код>
sprite1.setPosition(glyph1.advance, 20 - height1);
И вот тут уже сразу же появляется решение проблемы: можно знать высоту необходимой строки, что даст и нижнюю её границу - просто добавив высоту к y компоненте позиции, а это и есть origin для букв. То есть, чтобы сделать другой origin, достаточно добавлять(отнимать) вектор смещения для строки.
И как было сказано выше поле bounds содержит ширину буквы, что также можно использовать для горизонтального смещения букв в строке.
