Visual Studio 2010 — что-то делать по прошествии времени C ++ SFML 2

У меня есть часы и таймер в SFML, и он измеряет секунды. Я пытаюсь сделать следующее действие по прошествии определенного количества секунд (в частности, 4) Вот мой код

    #include "stdafx.h"#include "SplashScreen1.h"
using namespace std;

void SplashScreen1::show(sf::RenderWindow & renderWindow)
{
sf::Clock clock;
sf::Time elapsed = clock.getElapsedTime();

sf::Texture splash1;
sf::SoundBuffer buffer;
sf::Sound sound;

if(!buffer.loadFromFile("sounds/splah1.wav"))
{
cout << "Articx-ER-1C: Could not find sound splah1.wav" << endl;
}

sound.setBuffer(buffer);

if(!splash1.loadFromFile("textures/splash1.png"))
{
cout << "Articx-ER-1C: Could not find texture splash1.png" << endl;
}

sf::Sprite splashSprite1(splash1);

sound.play();
renderWindow.draw(splashSprite1);
renderWindow.display();

sf::Event event;

while(true)
{
while(renderWindow.pollEvent(event))
{
//if(event.type == sf::Event::EventType::KeyPressed
if(elapsed.asSeconds() >= 4.0f)
{
//|| event.type == sf::Event::EventType::MouseButtonPressed)
//|| event.type == sf::Event::EventType::Closed
return;
}

if(event.type == sf::Event::EventType::Closed)
renderWindow.close();
}
}
}

Ничего не происходит после 4 секунд. Я полагаю, что неправильно собираю прошедшее время. Я знаю, что мой возврат работает, потому что я попробовал его с помощью мыши, и он работал нормально.

1

Решение

Теперь ваш код выглядит нормально, за исключением того, что вы должны обновить свою прошедшую переменную внутри цикла (читать ее с часов).

В настоящее время вы просто читаете его один раз и много раз сравниваете это статическое значение с 4.

Тип времени представляет собой момент времени и, следовательно, является статическим.

Ваш код должен быть;

...
while(renderWindow.pollEvent(event))
{
elapsed = clock.getElapsedTime();
// Rest of the loop code
...
}
1

Другие решения

Сравнения с плавающей точкой не могут быть сделаны так точно. == 4.0f почти никогда не может быть правдой. Пытаться >=,

1

Если по какой-то причине вы не можете заставить работать таймер SFML, вы можете рассмотреть возможность использования ctime (time.h).

#include <ctime>
/* ... */
time_t beginT = time(NULL), endT = time(NULL);
while(renderWindow.pollEvent(event)) {

if(difftime(endT, beginT) < 4.0f) {
endT = time(NULL);
}
else {
beginT = time(NULL);
endT = time(NULL)

/* do the after-4-seconds-thingy */
}

/* ... */
}

Вкратце, вы устанавливаете endT на текущее время, пока оно не отличается на полные 4 секунды от ранее установленного beginT.

0
По вопросам рекламы [email protected]