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 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 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 . 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 ) { } } okno.clear(); pole.rysujPole( okno ); okno.display(); }
}
|
|
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. |
|
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ć ?? |
|
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ś :) 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; } } }
|
|
« 1 » |