[SFML] Wykonywanie zdarzenia po upływie określonego czasu
Ostatnio zmodyfikowano 2011-10-04 19:00
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:
#include <SFML/Window.hpp> #include <SFML/Graphics.hpp> #include <SFML/System.hpp>
int main() { sf::RenderWindow mainWindow( sf::VideoMode( 800, 600, 32 ), "Immortal Gortat" ); sf::Image ball; ball.LoadFromFile( "ball.png" ); sf::Sprite spriteBall; spriteBall.SetImage( ball ); spriteBall.SetPosition( 400, 300 ); 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(); } 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?? |
|
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). |
|
marc_xxx Temat założony przez niniejszego użytkownika |
» 2011-10-04 13:34:11 Czyli jak to naprawić? |
|
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 ) |
|
DejaVu |
» 2011-10-04 15:16:08 To dalej oznacza to samo. Musisz zrobić warunek:
bool bPierwszyRaz = true;
if( czas > 2.0f && bPierwszyRaz ) { bPierwszyRaz = false; }
|
|
marc_xxx Temat założony przez niniejszego użytkownika |
» 2011-10-04 16:31:46 U mnie wygląda to tak: #include <SFML/Window.hpp> #include <SFML/Graphics.hpp> #include <SFML/System.hpp>
int main() { sf::RenderWindow mainWindow( sf::VideoMode( 800, 600, 32 ), "Immortal Gortat" ); sf::Image ball; ball.LoadFromFile( "ball.png" ); sf::Sprite spriteBall; spriteBall.SetImage( ball ); spriteBall.SetPosition( 400, 300 ); 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(); } 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 ); 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ś |
|
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 :) |
|
« 1 » |