SFML окно не отвечает - PullRequest
       15

SFML окно не отвечает

0 голосов
/ 06 мая 2018

Я начинающий программист на C ++, я делаю игру в змею и пытаюсь использовать библиотеку SFML. Я хочу создать консольное приложение Snake, но хочу отобразить счет в окне 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;
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

while (window.isOpen ()) {} в этом случае должно быть вашим основным игровым циклом. Опрос событий выполняется таким образом во время основного цикла, а не только один раз в начале. Рефакторинг вашего кода, чтобы не было 3 циклов, чтобы ваш main () был линейным, с вашей загрузкой и прочим, выполненным до вашего основного цикла. Затем внутри этого основного цикла у вас должен быть цикл опроса событий со всеми вашими материалами для обновления после этого, а затем, наконец, ваш материал для рисования после этого.

0 голосов
/ 06 мая 2018

Окно, не отвечающее на SFML, связано с тем, что вы больше не опрашиваете события. Удостоверьтесь, что ваш цикл событий не затронут в основном цикле и что он все еще работает, пока игра делает. Было бы полезно, если бы вы опубликовали свой полный код.

...