Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Wykonywanie zdarzenia po upływie określonego czasu

Ostatnio zmodyfikowano 2011-10-04 19:00
Autor Wiadomość
marc_xxx
Temat założony przez niniejszego użytkownika
[SFML] Wykonywanie zdarzenia po upływie określonego czasu
» 2011-10-04 13:11:22
Napisałem grę. Chcę aby po jakimś czasie tworzył się sprite na ekranie który się przemieszcza. Oto treść programu:

C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>

int main()
{
    sf::RenderWindow mainWindow( sf::VideoMode( 800, 600, 32 ), "Immortal Gortat" );
    //OBRAZEK
    sf::Image ball;
    ball.LoadFromFile( "ball.png" );
    //SPRITE
    sf::Sprite spriteBall;
    spriteBall.SetImage( ball );
    spriteBall.SetPosition( 400, 300 );
    //ZEGAR GŁÓWNY
    sf::Clock mainClock;
   
    while( mainWindow.IsOpened() )
    {
        sf::Event mainEvent;
        while( mainWindow.GetEvent( mainEvent ) )
        {
            if( mainEvent.Type == sf::Event::Closed )
            {
                mainWindow.Close();
            }
           
            if( mainEvent.Type == sf::Event::KeyPressed && mainEvent.Key.Code == sf::Key::Escape )
            {
                mainWindow.Close();
            }
           
            if( mainEvent.Type == sf::Event::MouseButtonPressed && mainEvent.MouseButton.Button == sf::Mouse::Middle )
            {
                mainWindow.Close();
            }
           
            //********************STEROWANIE**********************
           
            if( mainEvent.Type == sf::Event::KeyPressed && mainEvent.Key.Code == sf::Key::A )
            {
                spriteBall.Move( - 10, 0 );
            }
           
            if( mainEvent.Type == sf::Event::KeyPressed && mainEvent.Key.Code == sf::Key::D )
            {
                spriteBall.Move( + 10, 0 );
            }
           
            const sf::Input & directEvent = mainWindow.GetInput();
            if( directEvent.IsKeyDown( sf::Key::Space ) )
            {
                spriteBall.Move( 0, - 30 );
            }
        }
       
        if( mainClock.GetElapsedTime() == 2.0f )
        {
            sf::Sprite attacker;
            attacker.SetImage( ball );
            attacker.SetPosition( 400, 150 );
            sf::Clock moveClock;
            while( moveClock.GetElapsedTime() == 2.0f )
            {
                attacker.Move( - 0.5, 0 );
                moveClock.Reset();
               
            }
            mainWindow.Draw( attacker );
        }
        mainWindow.Clear( sf::Color( 0, 0, 0 ) );
        mainWindow.Draw( spriteBall );
       
        mainWindow.Display();
    }
    return 0;
}

Po 2 sekundach powinien stworzyć mi się sprite i przesuwać się co 2 sec. Czemu tak się nie dzieje??
P-41684
DejaVu
» 2011-10-04 13:14:57
Bo prawdopodobieństwo, że po przyroście czasu wartość mierzonego czasu będzie równa 2.0f jest bardzo mała (rzekłbym bliska zeru).
P-41685
marc_xxx
Temat założony przez niniejszego użytkownika
» 2011-10-04 13:34:11
Czyli jak to naprawić?
P-41687
marc_xxx
Temat założony przez niniejszego użytkownika
» 2011-10-04 14:06:34
Poprawiłem linijkę w której sprawdza czy minęło 2 s. I teraz wygląda tak i nadal nie działa: if( mainClock.GetElapsedTime() == 5.f )
P-41688
DejaVu
» 2011-10-04 15:16:08
To dalej oznacza to samo. Musisz zrobić warunek:
C/C++
bool bPierwszyRaz = true; // PRZED PĘTLĄ

if( czas > 2.0f && bPierwszyRaz ) //W PĘTLI
{
    bPierwszyRaz = false;
    //obsługa pierwszego razu
}
P-41689
marc_xxx
Temat założony przez niniejszego użytkownika
» 2011-10-04 16:31:46
U mnie wygląda to tak:

C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>

int main()
{
    sf::RenderWindow mainWindow( sf::VideoMode( 800, 600, 32 ), "Immortal Gortat" );
    //OBRAZEK
    sf::Image ball;
    ball.LoadFromFile( "ball.png" );
    //SPRITE
    sf::Sprite spriteBall;
    spriteBall.SetImage( ball );
    spriteBall.SetPosition( 400, 300 );
    //ZEGAR GŁÓWNY
    sf::Clock mainClock;
    float time = mainClock.GetElapsedTime();
    bool firstTime = true;
   
    while( mainWindow.IsOpened() )
    {
        sf::Event mainEvent;
        while( mainWindow.GetEvent( mainEvent ) )
        {
            if( mainEvent.Type == sf::Event::Closed )
            {
                mainWindow.Close();
            }
           
            if( mainEvent.Type == sf::Event::KeyPressed && mainEvent.Key.Code == sf::Key::Escape )
            {
                mainWindow.Close();
            }
           
            if( mainEvent.Type == sf::Event::MouseButtonPressed && mainEvent.MouseButton.Button == sf::Mouse::Middle )
            {
                mainWindow.Close();
            }
           
            //********************STEROWANIE**********************
           
            if( mainEvent.Type == sf::Event::KeyPressed && mainEvent.Key.Code == sf::Key::A )
            {
                spriteBall.Move( - 10, 0 );
            }
           
            if( mainEvent.Type == sf::Event::KeyPressed && mainEvent.Key.Code == sf::Key::D )
            {
                spriteBall.Move( + 10, 0 );
            }
           
            const sf::Input & directEvent = mainWindow.GetInput();
            if( directEvent.IsKeyDown( sf::Key::Space ) )
            {
                spriteBall.Move( 0, - 30 );
            }
        }
       
        if( time > 2.0f && firstTime )
        {
            firstTime = false;
            sf::Sprite attacker;
            attacker.SetImage( ball );
            attacker.SetPosition( 400, 300 );
            /*sf::Clock moveClock;
            while( moveClock.GetElapsedTime() == 5.f )
            {
            attacker.Move( - 0.5, 0 );
            moveClock.Reset();
           
            }*/
            mainWindow.Draw( attacker );
        }
        mainWindow.Clear( sf::Color( 0, 0, 0 ) );
        mainWindow.Draw( spriteBall );
        mainWindow.Display();
    }
    return 0;
}

A i tak nie działa "/ Zrobiłem tak jak mówiłeś
P-41695
DejaVu
» 2011-10-04 19:00:34
Wiesz... jak ustawiasz wartość zmiennej time przed pętlą i oczekujesz, że się ona sama będzie zmieniała to się mylisz :)
P-41701
« 1 »
  Strona 1 z 1