Подтвердить что ты не робот

Центрирование текста на экране с помощью SFML

Я использую библиотеки SFML 2.0 на Ubuntu 12.10, используя

sudo apt-get install libsfml-dev

чтобы получить их. Теперь я пытаюсь получить sf:: Text в центре экрана. Для этого я устанавливаю исходный текст (место, которое используется для преобразования, например, положение установки, поворот и т.д.) В центр ограничивающего прямоугольника sf:: Text, а затем устанавливают положение центра экрана, например:

//declare text
sf::Font font;
sf::Text text;
font.loadFromFile("helvetica.ttf");
text.setFont(font);
text.setString("RANDOMTEXT");
text.setCharacterSize(100);
text.setColor(sf::Color::White);
text.setStyle(sf::Text::Regular);

//center text
sf::FloatRect textRect = text.getLocalBounds();
text.setOrigin(textRect.width/2,textRect.height/2);
text.setPosition(sf::Vector2f(SCRWIDTH/2.0f,SCRHEIGHT/2.0f));

Это не работает, текст отключен на некоторую величину, например 3 по оси x и 25 по оси y. Как ни странно, если вы настроили sf:: RectangleShape для представления ограничивающего прямоугольника текста, этот прямоугольник IS центрирован и имеет правильный размер, чтобы он соответствовал тексту. Но тогда текст вытягивается из этого поля с ранее упомянутым смещением.

На этом изображении я выделил центр экрана, нарисовал sf:: RectangleShape вместо ограничивающего прямоугольника текста и sf:: Text.

http://i.imgur.com/4jzMouj.png

Это изображение было сгенерировано этим кодом:

const int SCRWIDTH = 800; 
const int SCRHEIGHT = 600;

int main() {
sf::RenderWindow window;
window.create(sf::VideoMode(SCRWIDTH,SCRHEIGHT), "MYGAME" ,sf::Style::Default);
window.setMouseCursorVisible(false);
window.setVerticalSyncEnabled(true);

sf::Font font;
sf::Text text;
font.loadFromFile("helvetica.ttf");
text.setFont(font);
text.setString("RANDOMTEXT");
text.setCharacterSize(100);
text.setColor(sf::Color::White);
text.setStyle(sf::Text::Regular);

sf::FloatRect textRect = text.getLocalBounds();

text.setOrigin(textRect.width/2,textRect.height/2);
text.setPosition(sf::Vector2f(SCRWIDTH/2.0f,SCRHEIGHT/2.0f));

sf::RectangleShape rect(sf::Vector2f(textRect.width,textRect.height));
rect.setFillColor(sf::Color::Blue);
rect.setOrigin(rect.getSize().x/2,rect.getSize().y/2);
rect.setPosition(text.getPosition());

sf::RectangleShape RectW;
RectW.setSize(sf::Vector2f(SCRWIDTH, 0.0));
RectW.setOutlineColor(sf::Color::Red);
RectW.setOutlineThickness(1);
RectW.setPosition(0, SCRHEIGHT / 2);
sf::RectangleShape RectH;
RectH.setSize(sf::Vector2f(0.0, SCRHEIGHT));
RectH.setOutlineColor(sf::Color::Red);
RectH.setOutlineThickness(1);
RectH.setPosition(SCRWIDTH / 2, 0);

while(window.isOpen()) {
    window.clear();
    window.draw(rect);
    window.draw(text);
    window.draw(RectW);
    window.draw(RectH);
    window.display();
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) {
        window.close();
    }
}
return 1;
}

Как я могу заставить его быть центрированным и внутри него ограничивающим прямоугольником, как и должно быть?

4b9b3361

Ответ 1

sf::Text::getLocalBounds() имеет ненулевые значения для полей top и left, поэтому вы не можете игнорировать их при центрировании начала координат.

Попробуйте это вместо:

//center text
sf::FloatRect textRect = text.getLocalBounds();
text.setOrigin(textRect.left + textRect.width/2.0f,
               textRect.top  + textRect.height/2.0f);
text.setPosition(sf::Vector2f(SCRWIDTH/2.0f,SCRHEIGHT/2.0f));

Ответ 2

Я думаю, что это проблема с обработкой текста SFML. Направляйтесь к их трекеру по проблеме и посмотрите эту проблему.

Также вы можете задать вопрос на форуме по развитию. Разработчики их всегда очень дружелюбны и полезны.