1

我在 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 秒后它什么也不做。我相信我错误地收集了经过的时间。我知道我的回报是有效的,因为我用鼠标输入尝试过它,它工作得很好。

4

3 回答 3

1

浮点比较不能如此精确。 == 4.0f几乎不可能是真的。试试>=

于 2013-03-22T22:18:36.787 回答
1

你的代码现在看起来很好,除了你应该在循环中更新你的 elapsed 变量(从你的时钟中读取它)。

目前您只阅读一次,并将该静态值与 4 进行多次比较。

时间类型代表一个时间点,因此是静态的。

你的代码应该是;

...
while(renderWindow.pollEvent(event)) 
{
    elapsed = clock.getElapsedTime(); 
    // Rest of the loop code
    ...
}
于 2013-03-22T23:05:06.237 回答
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 秒。

于 2013-03-22T22:51:47.703 回答