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と何度も比較しています。

時間タイプは特定の時点を表すため、静的です。

コードは次のようになります。

...
while(renderWindow.pollEvent(event)) 
{
    elapsed = clock.getElapsedTime(); 
    // Rest of the loop code
    ...
}
于 2013-03-22T23:05:06.237 に答える
1

浮動小数点の比較はそれほど正確にはできません。 == 4.0fほとんど真実ではありません。試してみてください>=

于 2013-03-22T22:18:36.787 に答える
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 に答える