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

[SFML] Problem z przechodzeniem w menu

Ostatnio zmodyfikowano 2014-06-13 15:09
Autor Wiadomość
kamilall234
Temat założony przez niniejszego użytkownika
[SFML] Problem z przechodzeniem w menu
» 2014-06-13 03:00:02
Witam. Tworze pierwszy raz menu, W moimi kodzie przechodze między menu, a tworzeniem graczy. Jednak powrotu z tworzenia graczy do głównego menu nie moge uzyskąc. Prosze o podpowiedź. Co robie źle itd.
C/C++
.Dlaczego mimo tego i ż klikam na powr ó t do menu, Nie przechodzi mi z powrotem ?



int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Kurs SFML 2.0 - http://cpp0x.pl" );
    .
    .
    .
    sf::Texture przycisk;
    przycisk.loadFromFile( "Grafika/button.png" );
   
   
    bool menu_jest = 1;
    bool przycisk_granie = false;
    menu_jest = 1;
   
    while( oknoAplikacji.isOpen() )
    {
       
        bool przycisk_klik = false;
        sf::Event zdarzenie;
        oknoAplikacji.setPosition( sf::Vector2i( 300, 50 ) );
       
       
        if( menu_jest == true )
       
        {
            //oknoAplikacji.clear();
           
            while( oknoAplikacji.pollEvent( zdarzenie ) )
           
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                 oknoAplikacji.close();
           
           
           
            while( menu_jest == true )
            {
                //
                //przycisk_granie=true;
                oknoAplikacji.clear();
                oknoAplikacji.draw( menuglowne );
                sf::Sprite przycisk1; // tworzy przycisk strartu
                przycisk1.setTexture( przycisk );
                przycisk1.setPosition( sf::Vector2f( 300, 300 ) );
                sf::Text graj( "GRAJ", font );
                graj.setPosition( sf::Vector2f( 360, 300 ) );
               
                oknoAplikacji.draw( przycisk1 );
                oknoAplikacji.draw( graj );
                oknoAplikacji.display();
               
                while( przycisk_klik == false )
                {
                    while( oknoAplikacji.pollEvent( zdarzenie ) )
                   
                    if( zdarzenie.type == sf::Event::Closed )
                         oknoAplikacji.close();
                   
                    if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                         oknoAplikacji.close();
                   
                    if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                         oknoAplikacji.close();
                   
                    if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) && sf::Mouse::getPosition( oknoAplikacji ).x >= 300
                    && sf::Mouse::getPosition( oknoAplikacji ).x <= 460 && sf::Mouse::getPosition( oknoAplikacji ).y >= 297
                    && sf::Mouse::getPosition( oknoAplikacji ).y <= 337 )
                    {
                        przycisk_klik = true;
                        menu_jest = false;
                    }
                }
               
               
                oknoAplikacji.clear();
                menu_jest = false;
                przycisk_granie = true;
                przycisk_klik = false;
               
               
               
            }
           
           
        }
        bool wczytanie_graczy = false;
       
        while( przycisk_granie == true )
        {
           
           
            oknoAplikacji.clear();
            oknoAplikacji.draw( menuglowne );
           
            sf::Sprite przycisk2; // tworzy przycisk strartu
            przycisk2.setTexture( przycisk );
            przycisk2.setPosition( sf::Vector2f( 200, 300 ) );
            przycisk2.scale( 0.6, 1 );
            sf::Text text( "Gracz :", font );
            text.setPosition( sf::Vector2f( 205, 300 ) );
            oknoAplikacji.draw( text );
            //oknoAplikacji.draw(przycisk2);
            sf::Sprite przycisk3; // tworzy przycisk strartu
            przycisk3.setTexture( przycisk );
            przycisk3.setPosition( sf::Vector2f( 300, 550 ) );
            oknoAplikacji.draw( przycisk3 );
            sf::Text menu( "Menu", font );
            menu.setPosition( sf::Vector2f( 300, 550 ) );
            oknoAplikacji.draw( menu );
            oknoAplikacji.display();
            oknoAplikacji.clear();
           
            while( wczytanie_graczy == false )
            {
                while( oknoAplikacji.pollEvent( zdarzenie ) )
               
                if( zdarzenie.type == sf::Event::Closed )
                     oknoAplikacji.close();
               
                if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                     oknoAplikacji.close();
               
                if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                     oknoAplikacji.close();
               
                if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) && sf::Mouse::getPosition( oknoAplikacji ).x >= 300
                && sf::Mouse::getPosition( oknoAplikacji ).x <= 460 && sf::Mouse::getPosition( oknoAplikacji ).y >= 550
                && sf::Mouse::getPosition( oknoAplikacji ).y <= 590 ) // to odpowiada za powrot do menu
                {
                    //przycisk_klik=true;
                    menu_jest = true;
                    przycisk_granie = false;
                    wczytanie_graczy == true;
                    oknoAplikacji.draw( przycisk2 );
                   
                }
            }
           
            //oknoAplikacji.draw(graj);
            //rzycisk_klik=false;
            //oknoAplikacji.display();
        }
        oknoAplikacji.display();
    }
   
   
    return 0;
}
P-112020
maly
» 2014-06-13 07:37:34
C/C++
while( oknoAplikacji.isOpen() )
while( menu_jest == true )
     while( przycisk_klik == false )
Coś za bardzo zakręcone.

C/C++
while( oknoAplikacji.pollEvent( zdarzenie ) )

if( zdarzenie.type == sf::Event::Closed )
     oknoAplikacji.close();

if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
     oknoAplikacji.close();

if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
     oknoAplikacji.close();
To bierze pod uwagę tylko sf::Event::Closed dwa kolejne teoretycznie przy odrobinie pecha mogłyby nawet zamknąć aplikację.

C/C++
if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) && sf::Mouse::getPosition( oknoAplikacji ).x >= 300
&& sf::Mouse::getPosition( oknoAplikacji ).x <= 460 && sf::Mouse::getPosition( oknoAplikacji ).y >= 550
&& sf::Mouse::getPosition( oknoAplikacji ).y <= 590 ) // to odpowiada za powrot do menu
Bardziej pewny, zrozumiały i czytelny sposób:
C/C++
sf::Vector2f MousePos = oknoAplikacji.mapPixelToCoords( sf::Mouse::getPosition( oknoAplikacji ) );
if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) && przycisk1.getGlobalBounds().contains( MousePos ) )
{
    // klik w przycisk
}

Podziel kod na funkcje bo im dłuższy kod w kupie tym łatwiej się pogubić.
A co do pytania to niewiem bo jak wspomniałem na początku kod jest za bardzo zakręcony.
P-112022
kamilall234
Temat założony przez niniejszego użytkownika
» 2014-06-13 15:09:10
OK wszystko jest już jak należy. ALe teraz pytanie nr 2. Stworzyłem sobie funkcje do tworzenia Sprite i funkcje do tworzenia Text.

W sprite wszystko łądnie działa, tylko teraz problem z text. Otóż chciałbym aby text przybierał współrzędne już stworzonego Sprite. Próbuje ciągle zrobić to za pomocą getGlobalBounds(). Ale nie wiem jak przypasować setPosition text do tego.


C/C++
sf::Text tekst( sf::Sprite przycisk, std::string n )
{
    sf::Font font;
    font.loadFromFile( "Grafika/arial.ttf" );
    sf::Text teks( n, font ); //(300,300)
    teks.setPosition( sf::Vector2f( przycisk.getGlobalBounds() ) ) // tutaj chce przypasowac pozycje text do pozycji przycisku
    return teks;
   
}

Edit:

Problem zażegnany. Vector2f robi co trzeba :)
P-112031
« 1 »
  Strona 1 z 1