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

[SFML 2.0] Menu gry

Ostatnio zmodyfikowano 2014-02-26 15:52
Autor Wiadomość
PCS
Temat założony przez niniejszego użytkownika
[SFML 2.0] Menu gry
» 2014-02-25 21:04:58
Czołem, mam kolejny problem, mianowicie po kliknięciu w menu "Wyjdź" bądź ESC na klawiaturze, menu się zcina i jedyna rada to wyłączenie procesu. O to kod źródłowy:

C/C++
void Menu::menuRun()
{
    sf::Text tytul( "asde", czcionka, 80 );
    tytul.setStyle( sf::Text::Bold );
   
    tytul.setPosition( 1280 / 2 - tytul.getGlobalBounds().width / 2, 20 );
   
    const int ileNapisow = 2;
    sf::Text tekst[ ileNapisow ];
   
    std::string napisy[] = { "Graj", "Wyjdz" };
   
    for( int i = 0; i < ileNapisow; i++ )
    {
        tekst[ i ].setFont( czcionka );
        tekst[ i ].setCharacterSize( 65 );
       
        tekst[ i ].setString( napisy[ i ] );
        tekst[ i ].setPosition( 800 / 2 - tekst[ i ].getGlobalBounds().width / 2, 250 + i * 120 );
    }
   
   
    int selected = 0;
   
    while( status == MENU )
    {
        sf::Event event;
       
       
        while( oknoGry.pollEvent( event ) )
        {
           
           
            //esc i wciśnięcie "wyjdź"
            if( event.type == sf::Event::Closed ||( event.type == sf::Event::KeyReleased &&
            event.key.code == sf::Keyboard::Escape ) )
            {
                status = WYJDZ;
               
            }
           
            if( event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Up )
            {
                selected--;
                if( selected == - 1 )
                     selected = 1;
               
            }
           
            if( event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Down )
            {
                selected++;
                if( selected == 2 )
                     selected = 0;
               
            }
           
            //gdy wciœniemy spacje dokonujemy wyboru co chcemy zrobic
            if( event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Space )
            {
                switch( selected )
                {
                case 0:
                    //rozpoczynamy gre
                    break;
                case 1:
                    status = WYJDZ;
                    break;
                   
                }
            }
        }
       
        for( int i = 0; i < 2; i++ )
        {
            if( i == selected )
                 tekst[ i ].setString( ">>" + napisy[ i ] + "<<" );
            else
                 tekst[ i ].setString( napisy[ i ] );
           
        }
       
        oknoGry.clear( sf::Color( 255, 0, 0 ) );
       
        for( int i = 0; i < 2; i++ )
             oknoGry.draw( tekst[ i ] );
       
        oknoGry.display();
       
    }
   
   
}

Tak uruchamiam menu:
C/C++
void Klasag::petlaGlowna()
{
    while( status != WYJDZ )
    {
        switch( status )
        {
        case MENU:
            menu.menuRun();
            break;
           
        case GRA:
            ///
            break;
        }
    }
}

Zastosowałem tutaj listę enum, o to ona:
C/C++
#include <SFML\Graphics.hpp>
#include <Windows.h>
#include <string>

enum StatusGry { MENU, GRA, WYJDZ };


class Menu
{
public:
   
    Menu( void );
    ~Menu( void );
   
    StatusGry status;
   
   
    void petlaGlowna();
   
    void gramy();
   
    void menuRun();
   
private:
    sf::Font czcionka;
   
};

Dzięki z góry.
P-105264
hincu
» 2014-02-25 21:50:35
przekombinowales z enumami, tutaj musi byc blad skoro apka sie crashuje
P-105267
colorgreen19
» 2014-02-25 22:04:06
moze nie mam w tym doswiadczenia, bo sam zaczolem dopiero nie dawno pisac gre ale szybko odkrylem ze bez dobrego gui nie zajdziesz daleko.
polecam ci "napisac" chociaz klase przycisk, a ktorym bedziesz mogl wyswietlac tekst, a nie robic to tak jak teraz ty
P-105268
SeaMonster131
» 2014-02-25 22:10:28
Nie wiem co masz źle w kodzie, ale ja robię to podobny sposób i jestem zadowolony:
C/C++
while( 1 )
{
    if( GameState == menu )
         rysujMenu();
   
    if( GameState == opcje )
         rysujOpcje();
   
}
P-105269
hincu
» 2014-02-25 22:16:13
swoja droga co robisz jesli status == wyjdz? wychodzisz z petli i co dalej? zadnego zamkniecia okna?
P-105270
PCS
Temat założony przez niniejszego użytkownika
» 2014-02-25 22:22:13
Nie jestem pewien, ale chyba wiem w czym problem, mianowicie w klasie "Menu" nie ma dojścia do klasy "Klasag" gdzie jest funkcji petlaGlowna() i tam powinno zamknąć tę petlę, lecz status == WYJDZ tam nie dochodzi. Próbowałem dodać nagłówek "#include "Klasag.h" do klasy właśnie "Menu" lecz wyskakuje szereg błędów zapewne spowodowane tym, że w klasie Klasag już dałem nagłówek "Menu.h". Jest jakaś rada, aby dostać się do funkcji z innej klasy bez nadawania nagłówka?
P-105271
hincu
» 2014-02-25 22:25:23
dziedziczenie + metoda wirtualna lub zmien ograniczenie dostepu zapewne z protected na public
P-105272
PCS
Temat założony przez niniejszego użytkownika
» 2014-02-25 22:35:36
Próbowałem za pomocą dziedziczenia lecz wyskakuje błąd:

error: expected class-name before '{' token
P-105273
« 1 » 2
  Strona 1 z 2 Następna strona