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

[SFML] System wykrywania stanów gry nie działa

Ostatnio zmodyfikowano 2014-08-03 00:49
Autor Wiadomość
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):
C/C++
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ę (
C/C++
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?
P-114913
MrPoxipol
» 2014-08-02 00:24:51
Podałeś za mało kodu, nie wiadomo jaka jest kolejność (a to najczęściej jest problem).
P-114914
Wrzud
» 2014-08-02 11:58:51
Źle wykrywasz kliknięcie w komponent.
P-114926
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:
C/C++
#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;
        }
       
    }
}
 
P-114933
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ę
C/C++
while( StatusGry != Exiting )
To to powinna być twoja pętla główna, a nie robisz nową do każdego stanu osobno.
P-114934
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.
P-114960
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
P-114961
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.
P-114965
« 1 »
  Strona 1 z 1