Справка по SFML (Использование функции Sleep в <Windows.h>)

0

Мне нужна помощь с моим кодом SFML/C++ в Visual C++ 2010 Express Edition. Я пытаюсь получить текст (livesLeft) на "You Win!". Перед тем, как программа спит. Это заставляет игрока знать, что он победил. Но вместо этого программа переходит в режим сна и меняет текст вправо, поскольку он закрывается, поэтому вы видите только его изменение на несколько миллисекунд. Я даже не могу его прочитать.

    bool play = true;
    bool win = false;
    bool touchFinish = false;

    int lives = 3;

    sf::Font arial;
    if(arial.loadFromFile("Fonts/arial.ttf") == 0)
    {
            return 1;
    }

    sf::Text livesLeft;
    livesLeft.setFont(arial);
    livesLeft.setCharacterSize(30);
    livesLeft.setString("Lives: ");
    livesLeft.setPosition(0, 0);
    livesLeft.setColor(sf::Color::White);

    sf::RectangleShape finish;
    finish.setSize(sf::Vector2f(200, 600));
    finish.setPosition(700, 0);
    finish.setFillColor(sf::Color::Green);

Это мои переменные в использовании, и это мой код, где я пытаюсь изменить текст:

    if(player.getGlobalBounds().intersects(finish.getGlobalBounds()))
    {
        livesLeft.setString("You Win!");
        touchFinish = true;
    }

    if(touchFinish)
    {
        win = true;
    }

    if(win)
    {
        Sleep(5000);
            play = false;
    }

Я также забыл добавить, что у меня есть рендеринг в конце:

    window.clear();
    window.draw(livesLeft);
    window.draw(finish);
    window.draw(player);
    window.draw(obs1);
    window.draw(obs2);
    window.draw(obs3);
    window.draw(obs4);
    window.draw(obs5);
    window.draw(obs6);
    window.draw(obs7);
    window.draw(obs8);
    window.draw(obs9);
    window.draw(obs10);
    window.draw(obs11);
    window.draw(obs12);
    window.draw(obs13);
    window.display();
  • 0
    Поскольку вам нужно обновить экран, вы задали строку, но вы не обновили экран новой строкой. Данные есть, но вы спите и не отображаете их.
  • 0
    Извините, я новичок в этом, как бы вы сделали это, демон ночью?
Теги:
sleep
sfml

1 ответ

3
Лучший ответ

Скорее всего, это связано с тем, что вы не вызываете метод отображения для вашего окна. Если изменить текст, просто подготавливает следующий фреймбуфер для отображения нового текста, но поскольку вы никогда не укажете окну, чтобы обновить его отображение перед сном, он никогда не отображает новый фреймбуфер.

Вот краткий пример простой программы, использующей SFML. Обратите внимание на метод window.display() в конце основного игрового цикла.

Вы действительно хотите это делать:

if(win)
{
    window.display();
    Sleep(5000);
    play = false;
}

Причина, по которой вам нужно обновить дисплей перед рукой снова, - это Sleep (5000); блокирует поток, по существу означая, что он сидит при этом вызове на 5000 мс. Кроме того, если вы хотите сохранить предыдущие элементы на экране, вы захотите перерисовать их перед window.display(); а также, поскольку они не будут в следующем фреймбуфере.

  • 0
    Я уже использовал это: window.clear (); window.draw (livesLeft); window.draw (отделка); window.draw (игрок); window.draw (obs1); window.draw (obs2); window.draw (obs3); window.draw (obs4); window.draw (obs5); window.draw (obs6); window.draw (obs7); window.draw (obs8); window.draw (obs9); window.draw (obs10); window.draw (obs11); window.draw (obs12); window.draw (obs13); панель();
  • 0
    Вы должны поместить это определенно перед методом сна. Сон - это блокирующий вызов, означающий, что он не пройдет мимо этой точки и никогда не будет отображаться. Ваш метод должен выглядеть примерно так: if (win) {window.display (); Sleep (5000); play = false; } Смотрите мои обновления для лучшего форматирования.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню