我在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秒后无效。我相信我错误地收集了经过的时间。我知道我的回归是有效的,因为我用鼠标输入尝试了它并且工作正常。
答案 0 :(得分:1)
不能精确地进行浮点比较。 == 4.0f
几乎永远不会成真。试试>=
。
答案 1 :(得分:1)
你的代码现在看起来很好,除了你应该在循环中更新你经过的变量(从时钟中读取)。
目前您只需阅读一次,并将该静态值与4次进行比较。
时间类型代表一个时间点,因此是静态的。
您的代码应该是;
...
while(renderWindow.pollEvent(event))
{
elapsed = clock.getElapsedTime();
// Rest of the loop code
...
}
答案 2 :(得分:0)
如果由于某种原因无法使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设置为当前时间,直到它与先前设置的beginT完全相差4秒。