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

[SFML] Błąd , z zaznaczaniem jednego kwadratu (z 9 )

Ostatnio zmodyfikowano 2013-08-02 18:33
Autor Wiadomość
domin568
Temat założony przez niniejszego użytkownika
[SFML] Błąd , z zaznaczaniem jednego kwadratu (z 9 )
» 2013-08-02 17:26:30
Witam , robię grę kółko i krzyżyk , rozmieściłem moją tablice sf::RectangleShape na całym ekranie , stworzyłem funkcje która wyróżnia kwadrat na którym akurat jest myszka , tak samo jak się kliknie to też innego koloru , do tego używam funkcji setOutlineThickness i setOutlineColor . Niby mi wszystko działa , jednak mam jeden niedopuszczalny błąd , mianowicie : plansza gry to 9 kwadratów , i kiedy najade z kwadratu obok na pierwszy w tablicy kwadrat , to zaznaczają się oba , jednak w drugą stronę to nie działa tzn . jeżeli przejade myszką z pierwszego kwadratu na te obok to ten pierwszy znowu przechodzi do stanu normalnego , czyli tak jak być powinno . Tutaj kod :

pole.cpp
C/C++
bool Pole::inPole( sf::Vector2f pozycja_myszki )
{
    for( int i = 0; i < 9; i++ )
    {
        if( pole[ i ].getGlobalBounds().contains( pozycja_myszki ) && isMouseKeyDown() == true )
        {
            setThickness( pole[ i ], 3, sf::Color( 60, 100, 255 ) );
            return true;
        }
        else if( pole[ i ].getGlobalBounds().contains( pozycja_myszki ) == true )
        {
           
            setThickness( pole[ i ], 3, sf::Color( 255, 0, 0 ) );
           
            return true;
        }
        else if( pole[ i ].getGlobalBounds().contains( pozycja_myszki ) == false )
        {
            for( int i = 0; i < 9; i++ )
            {
                setThickness( pole[ i ], 3, sf::Color( 180, 255, 80 ) );
            }
        }
       
    }
   
}

void Pole::setThickness( sf::RectangleShape & kwadrat, float thickness, const sf::Color & kolor )
{
    for( int i = 0; i < 9; i++ )
    {
        kwadrat.setOutlineThickness( thickness );
        kwadrat.setOutlineColor( kolor );
    }
}
Konstruktor
C/C++
Pole::Pole( sf::RenderWindow & okno )
{
    setSizePole( sf::Vector2f( 260, 194 ) );
    setFillColor( sf::Color( 250, 255, 220 ) );
    for( int i = 0; i < 9; i++ )
    {
        setThickness( pole[ i ], 3, sf::Color( 180, 255, 80 ) );
    }
    pole[ 0 ].setPosition( 3, 3 );
    pole[ 1 ].setPosition( 269, 3 );
    pole[ 2 ].setPosition( 535, 3 );
    pole[ 3 ].setPosition( 3, 203 );
    pole[ 4 ].setPosition( 269, 203 );
    pole[ 5 ].setPosition( 535, 203 );
    pole[ 6 ].setPosition( 3, 402 );
    pole[ 7 ].setPosition( 269, 402 );
    pole[ 8 ].setPosition( 535, 402 );
   
   
}

Wykonanie konstruktora oraz funkcja główna .
C/C++
Pole pole( okno );


while( okno.isOpen() )
{
   
   
    while( okno.pollEvent( zdarzenie ) )
    {
        sf::Vector2f posMouse( sf::Mouse::getPosition( okno ).x, sf::Mouse::getPosition( okno ).y );
       
        if( zdarzenie.type == sf::Event::Closed )
        {
            okno.close();
            return true;
        }
        if( pole.inPole( posMouse ) == true )
        {
            //zaznacz krzyżyk
        }
       
       
    }
    okno.clear();
   
    pole.rysujPole( okno );
    okno.display();
}


}
P-89297
pekfos
» 2013-08-02 17:31:02
Metoda inPole() jest zła. Jeśli wykryjesz najechanie na dany prostokąt, kończysz działanie funkcji, bez modyfikowania reszty elementów.
P-89299
domin568
Temat założony przez niniejszego użytkownika
» 2013-08-02 18:15:24
No to w jak inny sposób można to napisać ??
P-89312
domin568
Temat założony przez niniejszego użytkownika
» 2013-08-02 18:33:02
Zrobiłem sprawdzanie na początku w innej pętli (raczej zoptymalizowane nie będzie , ale innego pomysłu naprawde nie mam :) ) , dzięki pefkos że mnie naprowadziłeś :)
C/C++
bool Pole::inPole( sf::Vector2f pozycja_myszki )
{
    for( int i = 0; i < 9; i++ )
    {
        if( pole[ i ].getGlobalBounds().contains( pozycja_myszki ) == false )
        {
            for( int i = 0; i < 9; i++ )
            {
                setThickness( pole[ i ], 3, sf::Color( 180, 255, 80 ) );
            }
        }
       
    }
   
    for( int i = 0; i < 9; i++ )
    {
        if( pole[ i ].getGlobalBounds().contains( pozycja_myszki ) && isMouseKeyDown() == true )
        {
            setThickness( pole[ i ], 3, sf::Color( 60, 100, 255 ) );
            return true;
        }
        else if( pole[ i ].getGlobalBounds().contains( pozycja_myszki ) == true )
        {
            setThickness( pole[ i ], 3, sf::Color( 255, 0, 0 ) );
            return true;
        }
       
       
       
       
    }
}
P-89317
« 1 »
  Strona 1 z 1