2016-06-24 2 views
1


У меня проблемы с sf::Text и sf::Font. Текст не хочет рисовать. Значение std::wstring имеет правильное текстовое значение. sf::Font груз совершенно. Вот мой код:Проблема с рисунком sf :: Текст. C++

sf::Font mainGameFont; 
void drawText(const std::wstring& str, const int size, const float xposition, const float yposition, sf::RenderWindow& window, const sf::Font& mainGameFont) 
{ 
    std::wcout << str << std::endl; 
    source.setFont(mainGameFont); 
    source.setColor(color); 
    source.setCharacterSize(size); 
    source.setString(str); 
    source.setPosition(xposition, yposition); 
    window.draw(source); 
} 
int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(1024, 768), "test"); 
    mainGameFont.loadFromFile("futura.ttf"); 
    ... 
    //Other code, calling drawText(...), etc 
    ... 
} 

Может кто-нибудь помочь мне, пожалуйста? Извините за мой плохой английский.

Обновлено: Этот код не работает!

#include <string> 
#include <iostream> 
#include "SFML/Graphics.hpp" 

sf::Font mainGameFont; 
sf::Text source; 
void drawText(const std::wstring& str, const int size, const float xposition, const float yposition, sf::RenderWindow& window, sf::Font& mainGameFont) 
{ 
    mainGameFont.loadFromFile("futura.ttf"); 
    std::wcout << str << std::endl; 
    source.setFont(mainGameFont); 
    source.setColor(sf::Color::White); 
    source.setCharacterSize(size); 
    std::cout << "stat1" << std::endl; 
    source.setString(str); 
    source.setPosition(xposition, yposition); 
    window.draw(source); 
    std::cout << "ok" << std::endl; 
} 
int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(600, 400), "Test"); 
    while (window.isOpen()) 
    { 
     window.clear(sf::Color::Black); 
     drawText(L"Ok", 20, 90, 90, window, mainGameFont); 
     window.display(); 
    } 
     return 0; 
} 
+0

Помните, что вы вызываете «Window :: display» для переключения заднего буфера? Если вы не знакомы с этой концепцией [мой ответ здесь] (http://stackoverflow.com/a/28075043/1732865), это объясняет. – Conduit

+0

Вы слишком часто запрашиваете события? – user975989

+0

@Conduit Да, я написал window.display() в конце основного цикла. –

ответ

1

Итак, во-первых, весь ваш код попахивает плохой практики программирования:

Вы заявляете:

sf::Font mainGameFont; 
sf::Text source; 

Как глобалов, но затем нарушают затенения правила, используя те же имена переменных в функции:

void drawText(const std::wstring& str, const int size, const float xposition, const float yposition, sf::RenderWindow& window, sf::Font& mainGameFont) 

Главным образом путем обновления:

sf::Font& mainGameFont 

Вы тогда mindboggingly передать глобальную переменную, что функция может уже видеть ... в качестве ссылки на функции:

drawText(L"Ok", 20, 90, 90, window, mainGameFont); 

Вы также неправильно использовать зарезервированное ключевое слово «размер»:

source.setCharacterSize(size); 

Который вы не можете использовать.

#include <string> 
#include <iostream> 
#include <SFML/Graphics.hpp> 

sf::Text source; 
sf::Font mainGameFont; 

void drawText(const sf::String &str, const int Size, const float xposition, const float yposition, sf::RenderWindow& window) 
{ 
    source.setString(str); 
    source.setCharacterSize(Size); //only the lower cased word size is reserved. A capital S fixes that. 
    source.setPosition(xposition,yposition); 
    window.draw(source); 
} 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(600, 400), "Test"); 

    //This should only be called ONCE, not at every pass. 
    mainGameFont.loadFromFile("futura.ttf"); 
    source.setFont(mainGameFont); 

    while (window.isOpen()) 
    { 
     window.clear(sf::Color::Black); 
     drawText("Ok", 20, 90, 90, window); 
     window.display(); 
    } 

    return 0; 
} 

Переписан для работы.

+0

Thanx you very much! Теперь это работа и нарисуйте «Хорошо», но в конце концов потерпите крах. Но это не большая проблема, я исправлю это. –

+0

Lol, Я пытаюсь переписать этот код в свою игру, но это не подчеркивание! Затем я пытаюсь изменить source.setColor (цвет); до sourve.setColor (sf :: Color :: White); И это работайте отлично! Большое спасибо вам! –

+0

Правильно, предлагаемый код должен: 1) не использовать типы SFML в качестве глобальных и 2) периодически обрабатывать события. Обе эти проблемы заставляют этот код вводить неопределенное поведение. – Hiura

Смежные вопросы