Мне нужна помощь с моим кодом 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();
Скорее всего, это связано с тем, что вы не вызываете метод отображения для вашего окна. Если изменить текст, просто подготавливает следующий фреймбуфер для отображения нового текста, но поскольку вы никогда не укажете окну, чтобы обновить его отображение перед сном, он никогда не отображает новый фреймбуфер.
Вот краткий пример простой программы, использующей SFML. Обратите внимание на метод window.display() в конце основного игрового цикла.
Вы действительно хотите это делать:
if(win)
{
window.display();
Sleep(5000);
play = false;
}
Причина, по которой вам нужно обновить дисплей перед рукой снова, - это Sleep (5000); блокирует поток, по существу означая, что он сидит при этом вызове на 5000 мс. Кроме того, если вы хотите сохранить предыдущие элементы на экране, вы захотите перерисовать их перед window.display(); а также, поскольку они не будут в следующем фреймбуфере.