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

SFML - dwa okna - jedno do menu drugie do gry?

Ostatnio zmodyfikowano 2012-10-12 23:55
Autor Wiadomość
Wojtek_X
Temat założony przez niniejszego użytkownika
SFML - dwa okna - jedno do menu drugie do gry?
» 2012-10-12 22:53:54
Hey. Mam pytanie. Uczę się biblioteki SFML.
Jestem na etapie planowania całej aplikacji/gry. Na początku chciałbym stworzyć menu z ustawieniami etc. po wciśnięciu start powinna się odpalić gra - tzn. otworzyć nowe okno(?).
Czy w takim razie kod powinien wyglądać mniej więcej tak:
C/C++
int main()
{
    sf::Window oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Okno główne" );
    while( oknoAplikacji.IsOpened() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji.GetEvent( zdarzenie ) )
        {
            //...
            if( zdarzenie.Type ==...) //warunek potwierdzający wciśnięcie startu
            {
                sf::Window oknoDoGry( sf::VideoMode( 800, 600, 32 ), "Okno w którym będzie toczyła się gra" );
                while( oknoDoGry.IsOpened() )
                {
                    sf: Event zdarzenie_podczas_gry
                    while( oknoDoGry.GetEvent( zdarzenie_podczas_gry )
                    {
                       
                        ...//obsługa zdarzeń w trakcie gry
                       
                    }
                    //...
                }
               
            }
        }
       
        oknoAplikacji.Display();
    }
    return 0;
}

A może wszystko powinno się dziać w tym jednym głównym oknie?
Jak powinna wyglądać organizacja takiej gry?

Drugie pytanie jest takie: jeśli w oknie 1 wprowadzę sobie jakieś ustawienia gry to jak je przekazać do okna drugiego odpowiedzialnego za wyświetlanie gry?

Z góry dzięki za wyjaśnienie.
P-66720
pawajoro
» 2012-10-12 23:01:41
Okno SFML to jest OKNO, a nie APLIKACJA. Więc wszystkie zmienne dostępnie oknu pierwszemu, będą widoczne drugiemu (oczywiście zachowując logikę programistyczną, jak w "asefemelowskich" przypadkach)
Czy się opłaca. Zależy. Od strony programisty - jak najbardziej tak. Masz podział na dwie grupy obiektów: do okna ustawień i do okna gry. Dla gracza - to zależy od tego jak wygląda program. Jeżeli ustawienia to okno, a reszta to FullScreen, to tak. Wtedy jest wygodniej, gdyż ustawienia wybieramy w prostym oknie, a gramy z fajną rozdzielczościa.
P-66722
Wojtek_X
Temat założony przez niniejszego użytkownika
» 2012-10-12 23:08:14
@pawajoro dzięki za odpowiedź :).

A czy mógłbyś (lub ktoś inny) potwierdzić, że taki zapis jak podałem jest prawidłowy. Martwi mnie ta ilość pętli (łącznie 4 - a w przypadku większej ilości okien będzie ich jeszcze więcej...).
Czy nie powinno się tego jakoś oddzielić? tzn. po włączeniu start odpala się zupełnie niezależne okno etc?
Jeśli okno główne nie będzie wykorzystywane w trakcie gry to można byłoby je jakoś "odłączyć" - żeby pętla z metodą isOpened się nie wykonywała -> po co ma nam opóźniać grę :P
P-66723
pawajoro
» 2012-10-12 23:25:34
Zakładając, że wyłączamy "guziczkiem" okiemkowym tylko z poziomu ustawień, można to zrobić tak:
C/C++
int main()
{
    int status = 1;
    sf::Window oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Okno główne" );
    sf::Window oknoDoGry;
    while( oknoAplikacji.IsOpened() && i > 0 )
    {
        sf::Event zdarzenie;
        bool next = false
        do
        {
            if( zdarzenie.Type ==...) // jeżeli wciśnięto klawisz "startowy"
            {
                status = 2;
                oknoDoGry.Create( sf::VideoMode( 800, 600, 32 ), "Okno w którym będzie toczyła się gra" );
            }
            if( oknoDoGry.GetEvent( zdarzenie ) )
                 next = true;
            else
            {
                if( oknoAplikacji.GetEvent( zdarzenie ) )
                     next = true;
                else
                     next = false;
               
            }
        } whlie( next == true );
        if( status == 2 ) //warunek potwierdzający wciśnięcie startu
        {
            // Tu gra ...
        }
        oknoAplikacji.Display();
    }
    return 0;
}
I są tylko 2 pętle
P-66725
Wojtek_X
Temat założony przez niniejszego użytkownika
» 2012-10-12 23:47:12
Ponownie dziękuję za pomoc :)
W kodzie jest chyba mały błąd - nie wiem co chciałeś wstawić w warunku pętli while, ale zmienna "i" mi tam nie pasuje :)

Tak teraz sobie uświadomiłem, że jak zrobimy tą moją wersję to i tak będzie się wykonywać pętla dot. okna z grą - aż do momentu jej przerwania. Bo ja się wcześniej obawiałem, że będą się na zmianę wykonywać raz jedna pętla od głównego okna raz druga ta od gry. Ale przecież tak nie będzie więc ta moja wersja również chyba nie jest zła - nieprawdaż? :D

pozdrawiam!
P-66726
pawajoro
» 2012-10-12 23:49:59
Aaa, sorry, w whlie zamiast "i" ma być "status"
Twój sposób nie jest zły, jeżeli zakładamy, iż gracz nie będzie korzystał z menu podczas pracy gry. Mój sposób pozwala na dalsze wybieranie opcji w menu
P-66727
Wojtek_X
Temat założony przez niniejszego użytkownika
» 2012-10-12 23:55:46
Superowo! Dzięki! :)
pozdrawiam
P-66728
« 1 »
  Strona 1 z 1