2013-03-22 55 views
1

我在SFML中有一個時鐘和計時器,它測量秒數。我試圖讓後幾秒鐘內一定量的經過下一個動作發生(特別是4)這裏是我的代碼在經過的時間後做些事情C++ SFML 2

#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

你確定,你想要4秒嗎?不只是4秒鐘過去了? – Skeen 2013-03-22 22:17:44

+0

那麼,我希望返回值發生在4秒後,我不確定是否理解你的問題。 – freemann098 2013-03-22 22:19:20

+0

那麼你現在擁有的代碼只會在if語句已經過去4秒的時候纔會運行(並且如果它的二進制表示與if語句中的表達式完全相同(相同的數字可以並且會有不同二進制表示在浮動)),而不是如果3.9999或4.00001秒已經過去,所以我認爲你想要的是> = 4.0秒 – Skeen 2013-03-22 22:22:01

回答

1

你的代碼現在看起來很好,除了你應該更新循環內的elapsed變量(從你的時鐘讀取它)。

目前你只是讀它一次,並比較靜態值4很多次。

時間類型代表一個時間點,因此是靜態的。

你的代碼應該是;

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

無法精確地進行浮點比較。 == 4.0f幾乎可能永遠不會是真的。試試>=

+0

試過了,沒有發生工作。 – freemann098 2013-03-22 22:20:57

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 */ 
    } 

    /* ... */ 
} 

簡要說明,您可以設置電磁無損檢測到當前的時間,直到它從先前設定的beginT不同的整整4秒。

+0

謝謝,現在這很好用。 – freemann098 2013-03-22 22:58:38

+0

使用Ctime也是一個很好的解決方案 – Skeen 2013-03-22 23:13:36

相關問題