DanielSC Temat założony przez niniejszego użytkownika |
[SFML] Błędne rysowanie figur geometrycznych » 2013-01-09 17:42:50 Chciałbym was się zapytać czemu po otoworzeniu tej Aplikacji i nacisnieciu lewego przycisku myszy rysuje mi czerwone paski zamiast kwadratow takich jak w rogu? #include <SFML/Graphics.hpp> #include <iostream> using namespace sf; using namespace std;
int main() { RenderWindow Aplikacja( VideoMode( 900, 900, 32 ), "Aplikacja" ); Shape kwadrat1[ 5 ]; while( Aplikacja.IsOpened() ) { Event zdarzenie; while( Aplikacja.GetEvent( zdarzenie ) ) { if( zdarzenie.Type == Event::Closed ) Aplikacja.Close(); if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape ) Aplikacja.Close(); } const Input & sterowanie = Aplikacja.GetInput(); sterowanie.GetMouseX(); sterowanie.GetMouseY(); float x1[ 5 ], y1[ 5 ]; while( sterowanie.IsMouseButtonDown( Mouse::Left ) ) { int i = 0; x1[ i ] = sterowanie.GetMouseX(); y1[ i ] = sterowanie.GetMouseY(); i++; if( i < 5 ) break; } for( int i = 0; i < 5; i++ ) { kwadrat1[ i ].AddPoint( x1[ i ], y1[ i ], Color::Red, Color::Red ); kwadrat1[ i ].AddPoint( x1[ i ], y1[ i ] + 100, Color::Red, Color::Red ); kwadrat1[ i ].AddPoint( x1[ i ] + 100, y1[ i ] + 100, Color::Red, Color::Red ); kwadrat1[ i ].AddPoint( x1[ i ] + 100, y1[ i ], Color::Red, Color::Red ); } Aplikacja.Clear( Color( 0, 0, 0 ) ); for( int i = 0; i < 5; i++ ) { Aplikacja.Draw( kwadrat1[ i ] ); } Aplikacja.Display(); } return 0; }
|
|
Mrovqa |
» 2013-01-09 20:06:29 while( sterowanie.IsMouseButtonDown( Mouse::Left ) ) { int i = 0; x1[ i ] = sterowanie.GetMouseX(); y1[ i ] = sterowanie.GetMouseY(); i++; if( i < 5 ) break; }
Szukam, patrzę i szukam, a sensu tego kawałku kodu znaleźć nie potrafię. Wiesz co to robi? Dodaj sobie cout/printf, który wypisze przed ifem wartość zmiennej i. Potem pomyśl, dlaczego tak jest. |
|
DejaVu |
» 2013-01-09 20:24:11 Na temat rysowania wielokątów za pomocą OpenGL znajdziesz całą masę tematów, że jest to 'problematyczne' i są ku temu uzasadnione powody. Jeżeli koniecznie chcesz rysować poprawnie wielokąty to sprawdź czy SFML 2.0 nie ma już z tym problemów lub poszukaj jakiegoś algorytmu/biblioteki, która ma wsparcie rysowania wypełnionych wielokątów. |
|
DanielSC Temat założony przez niniejszego użytkownika |
» 2013-01-09 21:32:50 Ok pobawie się tym aż nie rozwiaże problemu :)Dzięki za wszelkie wsazówki . --- O a jak tak napisze bez tablic program działa zgodnie z moim założeniem. Ale chciałbym aby można było rysować 5 takich kwadratow np: naciskam lewy przycisk mysz rysuje się kwadrat naciskam 2 raz lewy przycisk myszy rysuje się 2 kwadrat i tak dalej aż do 5 A to ten kod bez tablic z 1 kwadratem: #include <SFML/Graphics.hpp> #include <iostream> using namespace sf; using namespace std;
int main() { RenderWindow Aplikacja( VideoMode( 900, 900, 32 ), "Aplikacja" ); Shape kwadrat1; while( Aplikacja.IsOpened() ) { Event zdarzenie; while( Aplikacja.GetEvent( zdarzenie ) ) { if( zdarzenie.Type == Event::Closed ) Aplikacja.Close(); if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape ) Aplikacja.Close(); } const Input & sterowanie = Aplikacja.GetInput(); sterowanie.GetMouseX(); sterowanie.GetMouseY(); float x1, y1; x1 = sterowanie.GetMouseX(); y1 = sterowanie.GetMouseY(); if( sterowanie.IsMouseButtonDown( Mouse::Left ) ) { kwadrat1.AddPoint( x1, y1, Color::Red, Color::Red ); kwadrat1.AddPoint( x1, y1 + 100, Color::Red, Color::Red ); kwadrat1.AddPoint( x1 + 100, y1 + 100, Color::Red, Color::Red ); kwadrat1.AddPoint( x1 + 100, y1, Color::Red, Color::Red ); } Aplikacja.Clear( Color( 0, 0, 0 ) ); Aplikacja.Draw( kwadrat1 ); Aplikacja.Display(); } return 0; }
----- Jedyne jakie widze narazie rozwiązanie to przypisanie każdej figurze jednego przycisku np: lewy przycisk myszy rysuje kwadrat1 prawy przycisk myszy rysuje kwadrat2 i tak dalej. Macie może pomysł jak rozwiązać ten problem inaczej? |
|
Wasilek |
» 2013-01-14 11:25:37 Poczytaj sobie np. o vectorach w STL to będziesz mógł sobie dynamicznie tworzyć i usuwać tyle kwadratów ile ci tylko komp uciągnie ;) A jak interesuję cię tylko dodawanie tych kilku kwadratów to możesz dać zmienną, którą określasz ile jest kwadratów aktualnie(-1 aby z tablicą się zgadzało :) ) i co każde kliknięcie przycisku dodaje się kwadrat i zmienna zwiększa się. #include <SFML/Graphics.hpp> #include <iostream> using namespace sf; using namespace std;
int main() { RenderWindow Aplikacja( VideoMode( 900, 900, 32 ), "Aplikacja" ); Shape kwadrat[ 5 ]; int liczba_kwadratow = 0; while( Aplikacja.IsOpened() ) { Event zdarzenie; while( Aplikacja.GetEvent( zdarzenie ) ) { if( zdarzenie.Type == Event::Closed ) Aplikacja.Close(); if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape ) Aplikacja.Close(); } const Input & sterowanie = Aplikacja.GetInput(); sterowanie.GetMouseX(); sterowanie.GetMouseY(); float x1, y1; x1 = sterowanie.GetMouseX(); y1 = sterowanie.GetMouseY(); if( sterowanie.IsMouseButtonDown( Mouse::Left ) ) { kwadrat[ liczba_kwadratow ].AddPoint( x1, y1, Color::Red, Color::Red ); kwadrat[ liczba_kwadratow ].AddPoint( x1, y1 + 100, Color::Red, Color::Red ); kwadrat[ liczba_kwadratow ].AddPoint( x1 + 100, y1 + 100, Color::Red, Color::Red ); kwadrat[ liczba_kwadratow ].AddPoint( x1 + 100, y1, Color::Red, Color::Red ); liczba_kwadratow++; } Aplikacja.Clear( Color( 0, 0, 0 ) ); Aplikacja.Draw( kwadrat1 ); Aplikacja.Display(); } return 0; }
Oprócz tego nie rozumiem np. do czego jest to const Input & sterowanie = Aplikacja.GetInput(); sterowanie.GetMouseX(); sterowanie.GetMouseY();
A :D I zapomniałem dodać, że to moje wywali błąd jak dojdziesz do 5 kwadratów :) Możesz dać albo blokadę w ifie, albo zastosować własnie vectory z STL'a |
|
DanielSC Temat założony przez niniejszego użytkownika |
» 2013-01-14 19:43:41 Aha dzieki wielkie. |
|
« 1 » |