JategoNwM Temat założony przez niniejszego użytkownika |
[SFML] System wykrywania stanów gry nie działa » 2014-08-02 00:21:39 Witam! Napisałem funkcję wykrywającą stany ( enum StanGry { Menu, Gra, Exiting }; ). Wygląda tak(jak wiele innych, które widziałem): while( StatusGry != Exiting ) { switch( StatusGry ) { case Menu: StanMenu(); break; case Gra: StanGra(); break; case Exiting: break; } }
Osobno Funkcje void StanGra(); oraz void StanMenu(); działają poprawnie, lecz po kliknięciu na napis "Play", gdzie kod ma uruchomić funkcję odpowiadającą za grę ( if( play.getGlobalBounds().contains( sf::Vector2f( sf::Mouse::getPosition( Okno ) ) ) && event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left ) { StatusGry = Gra; } ) , kod nie robi nic. Cały czas jest uruchomiona funkcja StanMenu(); . Moje pytanie: Dlaczego? Co, gdzie, kiedy, za jakie grzechy, jest tu złego? |
|
MrPoxipol |
» 2014-08-02 00:24:51 Podałeś za mało kodu, nie wiadomo jaka jest kolejność (a to najczęściej jest problem). |
|
Wrzud |
» 2014-08-02 11:58:51 Źle wykrywasz kliknięcie w komponent. |
|
JategoNwM Temat założony przez niniejszego użytkownika |
» 2014-08-02 14:30:44 Wrzud, aby sprawdzić czy dobrze wykrywa kliknięcie stworzyłem (na tej samej podstawie) klawisz "Exit", po którego kliknięciu program się wyłącza. Działa, z czego wnioskuje, iż to nie ten problem. Cały kod: #include <SFML/Graphics.hpp> #include <SFML/Window.hpp>
enum StanGry { Menu, Gra, Exiting };
StanGry StatusGry;
sf::RenderWindow Okno( sf::VideoMode( 800, 600, 32 ), "ProEloGra" );
sf::Clock frametime;
void StanMenu() { sf::Font fome; fome.loadFromFile( "Mecha.ttf" ); sf::Text nazwa( "Gra 1, 2, 3!", fome, 50 ); sf::Text play( "Graj", fome, 30 ); sf::Text koniec( "Exit", fome, 30 ); koniec.setPosition( 800 / 2 - koniec.getGlobalBounds().width / 2, 220 ); play.setPosition( 800 / 2 - play.getGlobalBounds().width / 2, 160 ); nazwa.setPosition( 800 / 2 - nazwa.getGlobalBounds().width / 2, 60 ); sf::Event event; while( Okno.isOpen() ) { sf::Vector2f mouse( sf::Mouse::getPosition( Okno ) ); while( Okno.pollEvent( event ) ) { if( play.getGlobalBounds().contains( mouse ) && event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left ) { Status = Gra; } if( koniec.getGlobalBounds().contains( mouse ) && event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left ) { Status = Exiting; Okno.close(); } if( event.type == sf::Event::Closed ) { Status = Exiting; Okno.close(); } } Okno.clear(); Okno.draw( nazwa ); Okno.draw( play ); Okno.draw( koniec ); Okno.display(); } }
void StanGra() { sf::Event eventgry; while( Okno.isOpen() ) { while( Okno.pollEvent( eventgry ) ) { if( eventgry.type == sf::Event::MouseButtonPressed && eventgry.mouseButton.button == sf::Mouse::Left ) { Status = Exiting; Okno.close(); } if( eventgry.type == sf::Event::Closed ) { Status = Exiting; Okno.close(); } } Okno.draw( Skala ); Okno.clear(); Okno.display(); } }
int main() { StatusGry = Menu; while( StatusGry != Exiting ) { switch( StatusGry ) { case Menu: StanMenu(); break; case Gra: StanGra(); break; case Exiting: break; } } } |
|
pekfos |
» 2014-08-02 14:43:49 Jak ma ci niby wykryć zmianę stanu, skoro nawet nie wychodzisz z StanMenu()? Jak masz już taką pętlę while( StatusGry != Exiting )
To to powinna być twoja pętla główna, a nie robisz nową do każdego stanu osobno. |
|
JategoNwM Temat założony przez niniejszego użytkownika |
» 2014-08-02 21:31:36 pekfos, jeżeli o to chodziło to usunąłem funkcję, a ich dane wrzuciłem centralnie pod odpowiednie case . I... nic... dalej to samo. |
|
1aam2am1 |
» 2014-08-02 21:42:40 Pewnie zrobiłeś to żle w każdej funkcji z stanów gry masz while(okno.is_open()) niewyjdzie z tych funkcji i nie przejdzie do innego stanu dopuki okno jest otwarte |
|
pekfos |
» 2014-08-03 00:49:05 pekfos, jeżeli o to chodziło to usunąłem funkcję, a ich dane wrzuciłem centralnie pod odpowiednie case . I... nic... dalej to samo. |
Wszystko rozbija się o to, czy rozumiesz co piszesz i co chcesz osiągnąć. Bez zrozumienia działania programu nie mamy o czym tu rozmawiać, a i ty nie masz po co brać się za biblioteki. Nie możesz mieć dwóch głównych pętli, jedna w drugiej. I nie dlatego, że to technicznie niemożliwe, lecz dlatego, że to nie ma sensu. Jeśli dajesz nam kod bez sensu, bo nie możesz znaleźć błędu, to albo masz braki w wiedzy, albo nie przemyślałeś projektu, albo cały ten temat to rodzaj żartu, wymagającego bardzo specyficznego poczucia humoru. |
|
« 1 » |