SFML窗口无响应

3
我是一名初学者C++程序员,正在制作贪吃蛇游戏,并尝试使用SFML库。我想要将我的贪吃蛇控制台应用程序显示分数到SFML窗口中。但我不知道如何在窗口中显示分数,即使我已经搜索了整整一晚上也没有找到解决方案。此外,我的SFML窗口一直无响应。
我使用以下代码渲染窗口:
sf::RenderWindow window(sf::VideoMode(200, 75), "Score");


sf::Font font;
if (!font.loadFromFile("font.tff"))
    cout << "ERROR LOADING FONT" << endl;
sf::Text text;
text.setFont(font);
text.setString("hello");
//  sf::String scoredis;

while (window.isOpen()) {

    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
    }

然后我尝试在游戏循环中显示分数:
do{ 
    ...
    window.clear();
    window.draw(text);
    window.display();
    ...
}while()

main()函数内的完整代码:

{
ShowConsoleCursor(false);//nastavimo da ne kaze kurzorja
                         //Nalozimo zvok ki ga bomo predvajali ko pojemo sadez

sf::SoundBuffer buffer;
if (!buffer.loadFromFile("sound.wav"))//v buffer vstavimo zvok
{
    cout << "ERROR LOADING SOUND" << endl;//ce je kaksna napaka se prikaze to
}
sf::Sound sound;
sound.setBuffer(buffer);//nastavimo nas zvok na to kaj je v bufferju

/*sf::Font font;
if (!font.loadFromFile("font.tff"))
    cout << "ERROR LOADING FONT" << endl;
sf::Text text;
text.setFont(font);
text.setString("hello");
//  sf::String scoredis;*/

sf::RenderWindow window(sf::VideoMode(200, 75), "Score");



while (window.isOpen()) {

    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
    }
}

    int score = 0;
    int weight = 0;
    srand(time(0));
    narisi(); //draw map
    setup();

    thread NitZaVnos(spremembaSmeri);   //ustvari in zažene se nova nit, ki opravlja delo funkcije spremembaSmeri

    do
    {
        if (weight>50)
        {
            changed = false;
            premik(preberiSmer());
            weight = 0;
        }
        if (fruitPickup())//Funkcija ki pogleda ce je glava kace na sadezu
        {
            genFruit();//generira novi sadez
            score += 10;//dodamo tocke
            sSize++;//povecamo velikost kace
            sound.play();//predvajamo zvok
        }

        weight++;
        if (zalet())// Pogledamo ce se glava zaleti v telo ce vrne funkcija true skocimo izben zanke
            break;
        //stringstream ss;
        //  ss << score;
        //scoredis.SetText(ss.str().c_str());

        window.clear();
        //window.draw(text);
        window.display();

        Sleep(5); //program pocaka 5 ms

    } while (!gameOver());



    gotoxy(0, visinaM + 1);
    run = false;    //nastavi se vrednost spremenljivke run na false, da se lahko stranska nit zakljuci
    NitZaVnos.join();   //stranska nit ze sedaj sinhronizira z glavnim programom
    return 0;
}

do{ /*...*/ }while() 不是有效的 C++ 语法。请提供一个 MVCE - Borgleader
3
do{}while() 是有效的 C++ 语法。 - informant09
2个回答

5
SFML中窗口无响应与您不再轮询事件有关。确保在主循环中未修改事件循环,并且它仍在游戏运行时运行。如果您发布完整代码,将会更加有帮助。

0

在这种情况下,while(window.isOpen()) {} 应该是你的主游戏循环。事件轮询是在主循环期间完成的,而不仅仅是在开始时完成一次。重构你的代码,不要有三个循环,让你的 main() 是线性的,在你的主循环之前完成加载和其他工作。然后,在主循环中,你应该有你的事件轮询循环,所有更新都在那之后,最后是你的绘制。


不,不是这个部分。多线程的一个好用途是在后台加载资源和物理计算(如果需要)。当你认为需要使用多线程(最有可能的是你的第一个“加载”屏幕)时要小心。SFML使用openGL进行渲染,而渲染上下文无法被不同过程线程访问或提供内容,它不喜欢那样。为了解决这个问题,保持主线程负责所有渲染,并只使用工作线程将文件等内容读入可传递给SFML / OpenGL函数的格式。 - ErnieB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接