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

[SFML 2.0] Różne przyciski ale ta sama akcja

Ostatnio zmodyfikowano 2013-08-22 22:55
Autor Wiadomość
tomasz
Temat założony przez niniejszego użytkownika
» 2013-08-20 15:16:10
Wklejam cały, bo nasunęło mi się drugie pytanie, a mianowicie zauważyłem jak by program trochę się ciął. Bardzo możliwe, że napaskudziłem w kodzie, sam oceń. Aha i chętnie przyjmę krytykę co do samego napisanego kodu, bo domyślam się, że mam jeszcze złe nawyki.

ps Zastanawiałem się, czy użycie wskaźników nie przyśpieszyło by pętli odpowiadającej za naciskanie przycisków.

C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <ctime>

//--------
//klikanie
//--------
bool click( sf::Mouse & mouse, sf::RectangleShape & object, sf::RenderWindow & window )
{
    if( mouse.getPosition( window ).x > object.getPosition().x && mouse.getPosition( window ).x < object.getPosition().x + object.getSize().x &&
    mouse.getPosition( window ).y > object.getPosition().y && mouse.getPosition( window ).y < object.getPosition().y + object.getSize().y &&
    mouse.isButtonPressed( mouse.Left ) )
         return true;
    else return false;
   
}
//-----------
//rysuje menu
//-----------
void menu( sf::RectangleShape & object1, sf::RectangleShape & object2, sf::RenderWindow & window )
{
    sf::Font font1;
    font1.loadFromFile( "fonts/comicbd.ttf" );
   
    sf::Font font2;
    font2.loadFromFile( "fonts/BRUSHSCI.ttf" );
   
    sf::Text text1( "1 Player", font1, 20 );
    sf::Text text2( "2 Players", font1, 20 );
   
    object1.setPosition( 350, 355 );
    object1.setSize( sf::Vector2f( 100, 50 ) );
    object1.setFillColor( sf::Color::Blue );
   
    object2.setPosition( 350, 420 );
    object2.setSize( sf::Vector2f( 100, 50 ) );
    object2.setFillColor( sf::Color::Blue );
   
    text1.setPosition( object1.getPosition().x + 10, object1.getPosition().y + 12 );
    text2.setPosition( object2.getPosition().x + 6, object2.getPosition().y + 12 );
   
    sf::Text text( "Memory", font2, 200 );
    text.setColor( sf::Color::Blue );
    text.setPosition( 110, 135 );
    text.rotate( - 15 );
   
    window.draw( object1 );
    window.draw( object2 );
    window.draw( text1 );
    window.draw( text2 );
    window.draw( text );
}
//--------------------------
//rysuje menu wyboru poziomu
//--------------------------
void levelMenu( sf::RectangleShape & object1, sf::RectangleShape & object2, sf::RectangleShape & object3, sf::RenderWindow & window )
{
    sf::Font font1;
    font1.loadFromFile( "fonts/comicbd.ttf" );
   
    sf::Font font2;
    font2.loadFromFile( "fonts/BRUSHSCI.ttf" );
   
    sf::Text text1( "Level I", font1, 20 );
    sf::Text text2( "Level II", font1, 20 );
    sf::Text text3( "Level III", font1, 20 );
   
    object1.setSize( sf::Vector2f( 100, 50 ) );
    object1.setPosition( 350, 315 );
    object1.setFillColor( sf::Color::Blue );
   
    object2.setSize( sf::Vector2f( 100, 50 ) );
    object2.setPosition( 350, 380 );
    object2.setFillColor( sf::Color::Blue );
   
    object3.setSize( sf::Vector2f( 100, 50 ) );
    object3.setPosition( 350, 445 );
    object3.setFillColor( sf::Color::Blue );
   
    text1.setPosition( object1.getPosition().x + 15, object1.getPosition().y + 12 );
    text2.setPosition( object2.getPosition().x + 10, object2.getPosition().y + 12 );
    text3.setPosition( object3.getPosition().x + 6, object3.getPosition().y + 12 );
   
    sf::Text text( "Level", font2, 200 );
    text.setColor( sf::Color::Blue );
    text.setPosition( 165, 115 );
    text.rotate( - 15 );
   
    window.draw( object1 );
    window.draw( object2 );
    window.draw( object3 );
   
    window.draw( text1 );
    window.draw( text2 );
    window.draw( text3 );
    window.draw( text );
}
/*
//------------------------------------
//mieszanie kolejności liczb w tablicy
//------------------------------------
int mixing()
{
int numbers[] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };

for (int i = 0; i < 16; i++)
{
int los = (rand() % 16);
int t = numbers[i];
srand(time(NULL));
numbers[i] = numbers[los];
numbers[los] = t;
}
return numbers[16];
}
*/
//----
//Main
//----
int main()
{
    sf::RenderWindow window( sf::VideoMode( 800, 600, 32 ), "SFML 2.0" );
   
    sf::Event zdarzenie;
    sf::Mouse mouse;
    sf::Font font;
   
    font.loadFromFile( "fonts/arial.ttf" );
   
    int choice = 0;
    int a = 0;
    int level = 0;
    bool won = true;
   
    sf::RectangleShape aTile;
    sf::RectangleShape bTile;
   
    int hitTile[ 2 ];
    std::string hitText[ 2 ] = { " ", " " };
   
    sf::RectangleShape tile1;
    sf::RectangleShape tile2;
    sf::RectangleShape tile3;
    sf::RectangleShape tile4;
    sf::RectangleShape tile5;
    sf::RectangleShape tile6;
    sf::RectangleShape tile7;
    sf::RectangleShape tile8;
    sf::RectangleShape tile9;
    sf::RectangleShape tile10;
    sf::RectangleShape tile11;
    sf::RectangleShape tile12;
    sf::RectangleShape tile13;
    sf::RectangleShape tile14;
    sf::RectangleShape tile15;
    sf::RectangleShape tile16;
   
    sf::Text tileText;
    sf::Text tileText1( "1", font, 20 );
    sf::Text tileText2( "1", font, 20 );
    sf::Text tileText3( "2", font, 20 );
    sf::Text tileText4( "2", font, 20 );
    sf::Text tileText5( "3", font, 20 );
    sf::Text tileText6( "3", font, 20 );
    sf::Text tileText7( "4", font, 20 );
    sf::Text tileText8( "4", font, 20 );
    sf::Text tileText9( "5", font, 20 );
    sf::Text tileText10( "5", font, 20 );
    sf::Text tileText11( "6", font, 20 );
    sf::Text tileText12( "6", font, 20 );
    sf::Text tileText13( "7", font, 20 );
    sf::Text tileText14( "7", font, 20 );
    sf::Text tileText15( "8", font, 20 );
    sf::Text tileText16( "8", font, 20 );
   
    sf::RectangleShape buttons[] = { tile1, tile2, tile3, tile4, tile5, tile6, tile7, tile8, tile9, tile10, tile11, tile12, tile13, tile14, tile15, tile16 };
    sf::Text texts[] = { tileText1, tileText2, tileText3, tileText4, tileText5, tileText6, tileText7, tileText8, tileText9, tileText10, tileText11,
        tileText12, tileText13, tileText14, tileText15, tileText16 };
   
    buttons[ 0 ].setPosition( 350, 250 );
    buttons[ 0 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 1 ].setPosition( 410, 250 );
    buttons[ 1 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 2 ].setPosition( 350, 310 );
    buttons[ 2 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 3 ].setPosition( 410, 310 );
    buttons[ 3 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 4 ].setPosition( 290, 190 );
    buttons[ 4 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 5 ].setPosition( 350, 190 );
    buttons[ 5 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 6 ].setPosition( 410, 190 );
    buttons[ 6 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 7 ].setPosition( 470, 190 );
    buttons[ 7 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 8 ].setPosition( 290, 250 );
    buttons[ 8 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 9 ].setPosition( 470, 250 );
    buttons[ 9 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 10 ].setPosition( 290, 310 );
    buttons[ 10 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 11 ].setPosition( 470, 310 );
    buttons[ 11 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 12 ].setPosition( 290, 370 );
    buttons[ 12 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 13 ].setPosition( 350, 370 );
    buttons[ 13 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 14 ].setPosition( 410, 370 );
    buttons[ 14 ].setSize( sf::Vector2f( 50, 50 ) );
   
    buttons[ 15 ].setPosition( 470, 370 );
    buttons[ 15 ].setSize( sf::Vector2f( 50, 50 ) );
   
    for( int i = 0; i < 16; i++ ) // miesza tablice texts
    {
        int los =( rand() % 16 );
        sf::Text t = texts[ i ];
        srand( time( NULL ) );
        texts[ i ] = texts[ los ];
        texts[ los ] = t;
        texts[ i ].setPosition( buttons[ i ].getPosition().x, buttons[ i ].getPosition().y ); // nadaje wartości pomieszanym elementom tablicy texts
        texts[ los ].setPosition( buttons[ los ].getPosition().x, buttons[ los ].getPosition().y ); // nadaje wartości pomieszanym elementom tablicy texts
    }
   
    sf::RectangleShape menuButton1;
    sf::RectangleShape menuButton2;
    sf::Text menuText1;
    sf::Text menuText2;
   
    sf::RectangleShape levelButton1;
    sf::RectangleShape levelButton2;
    sf::RectangleShape levelButton3;
   
    while( window.isOpen() )
    {
        while( window.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 window.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 window.close();
           
        }
        window.clear();
        menu( menuButton1, menuButton2, window );
       
        if( click( mouse, menuButton1, window ) && choice == 0 ) choice = 1;
       
        if( click( mouse, menuButton2, window ) && choice == 0 ) choice = 2;
       
        if( choice == 1 || choice == 2 )
        {
            window.clear();
           
            levelMenu( levelButton1, levelButton2, levelButton3, window );
           
            if( click( mouse, levelButton1, window ) && level == 0 ) level = 4;
           
            if( click( mouse, levelButton2, window ) && level == 0 ) level = 16;
           
            if( click( mouse, levelButton3, window ) && level == 0 ) level = 36;
           
        }
       
        if( choice == 1 && level != 0 )
        {
            window.clear();
           
            for( int i = 0; i < level; i++ )
            {
                window.draw( buttons[ i ] ); //rysuje kafelki zaleznie od poziomu gry
                window.draw( texts[ i ] ); //rysuje wartosci kafelkow zaleznie od poziomu gry
            }
            for( int i = 0; i < level; i++ )
            {
                if( click( mouse, buttons[ i ], window ) && buttons[ i ].getFillColor() != sf::Color::Magenta && buttons[ i ].getFillColor() != sf::Color::Black )
                {
                    buttons[ i ].setFillColor( sf::Color::Magenta );
                    hitText[ a ] = texts[ i ].getString();
                    hitTile[ a ] = i;
                    a++;
                    if( hitText[ 0 ] == hitText[ 1 ] && hitText[ 1 ] != " " )
                    {
                        window.clear( sf::Color::Green );
                        a = 0;
                        hitText[ 0 ] = " ";
                        hitText[ 1 ] = " ";
                        buttons[ hitTile[ 0 ] ].setFillColor( sf::Color::Black );
                        buttons[ hitTile[ 1 ] ].setFillColor( sf::Color::Black );
                    }
                    if( hitText[ 0 ] != hitText[ 1 ] && hitText[ 1 ] != " " )
                    {
                        window.clear( sf::Color::Green );
                        a = 0;
                        hitText[ 0 ] = " ";
                        hitText[ 1 ] = " ";
                        buttons[ hitTile[ 0 ] ].setFillColor( sf::Color::White );
                        buttons[ hitTile[ 1 ] ].setFillColor( sf::Color::White );
                    }
                }
                won = true;
            }
           
            for( int i = 0; i < 16; i++ )
            {
                if( buttons[ i ].getFillColor() != sf::Color::Black ) won = false;
               
            }
            if( won )
            {
                window.clear();
                sf::Text grat( "Gratulacje", font, 100 );
                grat.setPosition( 100, 100 );
                window.draw( grat );
            }
        }
       
        if( choice == 2 && level != 0 )
        {
            window.clear();
        }
       
        window.display();
    }
    return 0;
}
P-90619
MrPoxipol
» 2013-08-20 16:05:12
Co do cięcia to się nie dziw, jak w pętli tworzysz obiekty...Co do sprawdzania czy został kliknięty przycisk, masz sprawdzać w pętli zdarzeń..

PS Używaj tablic..
P-90628
ison
» 2013-08-20 17:04:54
Nie wczytuj zasobów w pętli.
Nie używaj isButtonPressed do przycisków. Eventy związane z interfejsem dotyczące wciśnięcia przycisku powinieneś odczytywać w pętli zdarzeń, po to ona właśnie tam jest. Będziesz musiał lekko przeorganizować swój kod.
C/C++
while( window.pollEvent( zdarzenie ) )
{
    if( zdarzenie.type == sf::Event::Closed )
         window.close();
   
    if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
         window.close();
   
    if( zdarzenie.type == wcisniety ) sprawdz czy nie zostal nacisniety jakis przycisk
}
P-90631
tomasz
Temat założony przez niniejszego użytkownika
» 2013-08-20 18:33:48
Czy chodzi o taką instrukcję?

C/C++
zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.key.code == sf::Mouse::Left &&
mouse.getPosition( window ).x > menuButton1.getPosition().x && mouse.getPosition( window ).x < menuButton1.getPosition().x + menuButton1.getSize().x &&
mouse.getPosition( window ).y > menuButton1.getPosition().y && mouse.getPosition( window ).y < menuButton1.getPosition().y + menuButton1.getSize().y

I tak dla każdego przycisku?
P-90637
ison
» 2013-08-20 18:43:55
tak, ale wygodniej Ci to raczej będzie trzymać w tablicy niż pisać milion warunków
P-90638
pekfos
» 2013-08-20 18:45:16
Krócej będzie tak:
C/C++
if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.key.code == sf::Mouse::Left )
{
    //i dla kazdego buttona (najlepiej tablica i pętla)
    if( menuButton1.getGlobalBounds().contains( mouse.getPosition( window ) ) //..
}
P-90639
tomasz
Temat założony przez niniejszego użytkownika
» 2013-08-21 00:15:21
Okej, wydaje mi się, że wiem o co chodzi. Wprowadzę zmiany i zobaczę czy nie będzie cięło. Dzięki za pomoc.
P-90662
tomasz
Temat założony przez niniejszego użytkownika
» 2013-08-21 19:33:28
Witam, jak na razie program działa prawidłowo jednak nasunęło mi się pewne pytanie. Zacząłem tworzyć dynamiczne tablice, w zależności od wybranego poziomy (rozmiar 4, 16 lub 36). Jednak wiąże się to z tworzeniem obiektów w pętli zdarzeń. Już nakrzyczano na mnie (nawet w tym temacie :)) aby tak nie robić, jednak w tej sytuacji nie widzę innego wyjścia. Zadbałem jednak aby do pętli tworzącej dynamiczne obiekty program wszedł raz, mimo dalszego działania pętli zdarzeń. Oto kod:

C/C++
while( window.isOpen() )
{
    while( window.pollEvent( zdarzenie ) )
    {
        if( zdarzenie.type == sf::Event::Closed )
             window.close();
       
        if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
             window.close();
       
        if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.key.code == sf::Mouse::Left )
        {
            if( menuButton1.getGlobalBounds().contains( mouse.getPosition( window ).x, mouse.getPosition( window ).y ) && choice == 0 ) choice = 1;
           
            if( menuButton2.getGlobalBounds().contains( mouse.getPosition( window ).x, mouse.getPosition( window ).y ) && choice == 0 ) choice = 2;
           
            if( levelButton1.getGlobalBounds().contains( mouse.getPosition( window ).x, mouse.getPosition( window ).y ) && level == 0 ) { level = 4; x = 350; y = 250; xx = 470; yy = 350; }
            if( levelButton2.getGlobalBounds().contains( mouse.getPosition( window ).x, mouse.getPosition( window ).y ) && level == 0 ) { level = 16; x = 290; y = 190; xx = 530; yy = 290; }
            if( levelButton3.getGlobalBounds().contains( mouse.getPosition( window ).x, mouse.getPosition( window ).y ) && level == 0 ) { level = 36; x = 230; y = 130; xx = 590; yy = 230; }
           
            if( a == - 1 && level != 0 )
            {
                tile = new sf::RectangleShape[ level ];
                text = new sf::Text[ level ];
               
                for( int i = 0; i < level; i++ ) // miesza tablice texts
                {
                    int los =( rand() % level );
                    sf::Text t = text[ i ];
                    srand( time( NULL ) );
                    text[ i ] = text[ los ];
                    text[ los ] = t;
                    text[ i ].setPosition( tile[ i ].getPosition().x, tile[ i ].getPosition().y ); // nadaje wartości pomieszanym elementom tablicy texts
                    text[ los ].setPosition( tile[ los ].getPosition().x, tile[ los ].getPosition().y ); // nadaje wartości pomieszanym elementom tablicy texts
                }
                a = - 2;
            }
            if( a == - 2 )
            {
                for( int i = 0; i < level; i++ )
                {
                    ostringstream ss;
                    ss << i;
                    string tileText = ss.str(); // zamiana i na string
                   
                    tile[ i ].setPosition( x, y );
                    tile[ i ].setSize( sf::Vector2f( 50, 50 ) );
                   
                    text[ i ].setFont( font );
                    text[ i ].setPosition( x, y );
                    text[ i ].setCharacterSize( 30 );
                    text[ i ].setString( tileText );
                   
                    x += 60;
                    if( x == xx ) { y += 60; x = yy; }
                }
                a = 0;
            }
            for( int i = 0; i < level; i++ )
            {
                if( tile[ i ].getGlobalBounds().contains( mouse.getPosition( window ).x, mouse.getPosition( window ).y ) && tile[ i ].getFillColor() != sf::Color::Magenta && tile[ i ].getFillColor() != sf::Color::Black )
                {
                    if( hitText[ 0 ] == hitText[ 1 ] && hitText[ 1 ] != " " )
                    {
                        a = 0;
                        hitText[ 0 ] = " ";
                        hitText[ 1 ] = " ";
                        tile[ hitTile[ 0 ] ].setFillColor( sf::Color::Black );
                        tile[ hitTile[ 1 ] ].setFillColor( sf::Color::Black );
                    }
                    if( hitText[ 0 ] != hitText[ 1 ] && hitText[ 1 ] != " " )
                    {
                        a = 0;
                        hitText[ 0 ] = " ";
                        hitText[ 1 ] = " ";
                        tile[ hitTile[ 0 ] ].setFillColor( sf::Color::White );
                        tile[ hitTile[ 1 ] ].setFillColor( sf::Color::White );
                    }
                    tile[ i ].setFillColor( sf::Color::Magenta );
                    hitText[ a ] = text[ i ].getString();
                    hitTile[ a ] = i;
                    a++;
                }
                won = true;
            }
        }
    }

Chciałem zapytać czy takie rozwiązanie jest dobre, czy raczej tylko poprawne lub po prostu złe.
P-90708
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona