Zdziwiony Temat założony przez niniejszego użytkownika |
[SFML 2.1] Sprawdzanie czy użytkownik kliknął w dany obszar ekranu(okna) lub w jakiegoś sprit'a. » 2013-12-06 15:04:42 Witam. Mam takie pytanie jak w temacie :), bo w polskich kursach nikt o tym nie wspomina ;/ Kod: #include <SFML/Graphics.hpp> #include <cmath> #include <windows.h>
int main() { FreeConsole(); sf::RenderWindow okno( sf::VideoMode( 500, 500 ), "Kurs SFML 2.1" ); sf::RenderWindow okno2; sf::Texture tekstura; tekstura.loadFromFile( "grafika\\tlo.jpg" ); sf::Sprite obrazek; obrazek.setTexture( tekstura ); while( okno.isOpen() ) { sf::Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.type == sf::Mouse::Left ) { okno2.create( sf::VideoMode( 800, 600, 32 ), "oknonr2" ); okno.close(); } if( zdarzenie.type == sf::Event::Closed ) { okno.close(); } if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape ) okno.close(); } okno.clear( sf::Color::Black ); okno.draw( obrazek ); okno.display(); } sf::Event zdarzenie2; while( okno2.isOpen() ) { sf::Event zdarzenie2; while( okno2.pollEvent( zdarzenie2 ) ) { if( zdarzenie2.type == sf::Event::Closed ) { okno2.close(); } if( zdarzenie2.type == sf::Event::KeyPressed && zdarzenie2.key.code == sf::Keyboard::Escape ) okno2.close(); } okno2.clear( sf::Color::Black ); okno2.draw( obrazek ); okno2.display(); } return 0; } To jest taki przykład, w którym chcę, żeby po kliknięciu na dany sprite, napis itp. otworzyło się nowe okienko, bo z takim zapisem jak wyżej, to apka otwiera drugie okienko po kliknięciu X, dlatego, że robi się to LPM... A jeśli zamiast if( zdarzenie.type == sf::Mouse::Left ) na if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left ) Nowe okno będzie się otwierać po kliknięciu w dowolną część ekranu. I tu leży mój problem, bo nie wiem jak zapisać to, żeby program uruchamiał okienko po kliknięciu w obiekt np. 10x10px lub po prostu w miejsce o kordach x,y. Pozdrawiam. |
|
pekfos |
» 2013-12-06 15:23:42 bo w polskich kursach nikt o tym nie wspomina ;/ |
Bo kursy zakładają, że znasz język i umiesz używać jego podstawowych struktur. No i, oczywiście, nie opisują całej biblioteki, bo ty by nie miało sensu. Gdybyś poszukał, znalazłbyś np coś takiego jak contains() z sf::Rect<>. A gdybyś nie poszukał, to pozycję myszki masz zapisaną w zdarzeniu, wystarczy prosty warunek. |
|
Zdziwiony Temat założony przez niniejszego użytkownika |
» 2013-12-06 16:07:30 Poprawiłem na coś takiego: #include <SFML/Graphics.hpp> #include <cmath> #include <windows.h>
int main() { FreeConsole(); sf::RenderWindow okno( sf::VideoMode( 500, 500 ), "Kurs SFML 2.1" ); sf::RenderWindow okno2; sf::Texture tekstura; tekstura.loadFromFile( "grafika\\tlo.jpg" ); sf::Sprite obrazek; obrazek.setTexture( tekstura ); int x; int y; x = 1; y = 1; while( okno.isOpen() ) { sf::Event zdarzenie; while( okno.pollEvent( zdarzenie ) ) { if( zdarzenie.mouseMove.x == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left ) if( zdarzenie.mouseMove.y == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left ) { okno2.create( sf::VideoMode( 800, 600, 32 ), "oknonr2" ); okno.close(); } if( zdarzenie.type == sf::Event::Closed ) { okno.close(); } if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape ) okno.close(); } okno.clear( sf::Color::Black ); okno.draw( obrazek ); okno.display(); } sf::Event zdarzenie2; while( okno2.isOpen() ) { sf::Event zdarzenie2; while( okno2.pollEvent( zdarzenie2 ) ) { if( zdarzenie2.type == sf::Event::Closed ) { okno2.close(); } if( zdarzenie2.type == sf::Event::KeyPressed && zdarzenie2.key.code == sf::Keyboard::Escape ) okno2.close(); } okno2.clear( sf::Color::Black ); okno2.draw( obrazek ); okno2.display(); } return 0; } Bardzo się zdziwiłem, że się skomplinowało... ale oczywiście nie działa jak należy :P (no cóż nic dziwnego..., bardziej dziwne, że się skomplinowało... Tak wiem, popełniłem jak zwykle podstawowe błędy itp, itd... Ale czy mógłbym poprosić o jeszcze jakąś podpowiedź ? (Jako argument za mogę powiedzieć, że chyba do końca życia zapamiętam, że trzeba użyć stringa i jak go użyć, żeby móc połączyć jakiś ciąg znaków, po tej batalii w moim pierwszym temacie na forum :P) (Tam w sumie nie miałem usprawiedliwienia, że sam sobie nie poradziłem, bo dopiero teraz niedawno przypadkiem zobaczyłem jak tego używać w jakimś polskim kursie C++ :P (ehh... po czasie :P) Jednak kursów SFML po polsku jest garstka i obszerne nie są... A dokumentacja na stronie SFML jest dla mnie bez dobrej znajomości angielskiego słabo zrozumiana... ;/ Pozdrawiam. EDIT: if( zdarzenie.mouseMove.x == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left ) if( zdarzenie.mouseMove.y == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left ) Dobra, dobra... tak wiem to są 2 różne ify :P (bardzo głupi błąd) dlatego się skomplinowało :P Sam nie wiem czemu to tak zapisałem :P |
|
pekfos |
» 2013-12-06 16:13:04 Znalazłeś pozycję myszki (co prawda złą, ale to wyjdzie później). Jaki masz problem w zapisaniu warunku, że pozycje zawierają się w jakimś przedziale? (no i oczywiście musisz dalej sprawdzać typ zdarzenia) |
|
Zdziwiony Temat założony przez niniejszego użytkownika |
» 2013-12-06 16:20:28 Coś takiego ? int x; int y; y =( rand() % 50 ) + 7; x =( rand() % 50 ) + 7; Nie wiem, czy dobrze, ale tak się robiło przy losowaniu liczb z przedziału... Oczywiście się komplinuje, ale nie działa ;/ A druga sprawa to, jak zapisać tu dwie osie X i Y ? if( zdarzenie.mouseMove.y == sf::Event::MouseButtonReleased && zdarzenie.mouseButton.button == sf::Mouse::Left ) { okno2.create( sf::VideoMode( 800, 600, 32 ), "oknonr2" ); okno.close(); } |
|
pekfos |
» 2013-12-06 16:26:00 Nie.. Masz sprawdzić, czy liczba należy do przedziału, a nie wylosować liczbę z przedziału.. A druga sprawa to, jak zapisać tu dwie osie X i Y ? |
Rozumiesz coś z tego, co piszesz? Bo ja nie. Zamiast dodać dodatkowy warunek, zmieniłeś zmienną i porównujesz z, bezsensowną w tym kontekście, wartością. |
|
Zdziwiony Temat założony przez niniejszego użytkownika |
» 2013-12-06 16:46:36 Rozumiesz coś z tego, co piszesz? Bo ja nie. |
Szczerze ? Średnio :E Chyba najmądrzejszą decyzją z mojej strony będzie darowanie sobie na razie bibliotek... Myślałem, że wiem już wystarczająco dużo o c++, żeby zacząć bawić się SFML'em(tym bardziej, że czytałem, że to prosta biblioteka), ale wychodzi na to, że chyba nie ... ;/ Zadziwia mnie jednak to, że pomimo tego, że ponoć WinAPI jest trudniejsze to i tak lepiej je ogarniam niż SFML'a :O (ale to chyba dlatego, że o WinAPI jest dużo więcej obszernych kursów po polsku :D)(dowód program zamieszczony na tym forum w odpowiednim dziale, którego wszyscy boją się pobrać :E) PS: Przeczytałem cały kurs C++ na tej stronie... (nie po kolei ale co tam :P) Jedyne tematy, których nie czytałem to te o programowaniu obiektowym... I tu pytanie: Czy ta obiektowość jest tak przydatna w SFML'u, czy jednak jestem aż tak tępy na tego C++ ?:E. No i inne pytanie... Mniej więcej ile czasu muszę siedzieć w konsoli, żeby móc stworzyć w końcu 'coś fajnego' :) ? (nie ukrywam ale się niecierpliwie :P i jak myślę, że już wystarczająco wszystko ogarniam to biorę się za takiego SFML'a czy WinAPI i wychodzi na to, że tak na prawdę nic nie umiem :P (no może nie zupełnie nic, bo prosty program w WinAPI jakoś tam zrobię, zresztą sam możesz zobaczyć jego screena...(albo już widziałeś)). |
|
czosnek17 |
» 2013-12-06 18:42:35 Przeczytałem cały kurs C++ na tej stronie |
Jak przeczytałeś, to napisz kilka nawet prostych programów dla treningu (np zadania z kursu). Czy ta obiektowość jest tak przydatna w SFML'u |
Jest potrzebna i to nie tylko w SFML, ale ogólnie w programowaniu. Ja mam taką obsługę kliknięcia na przycisk if( mouse.getPosition( okno ).x > spr.getPosition().x && mouse.getPosition( okno ).x < spr.getPosition().x + tsize.x && mouse.getPosition( okno ).y > spr.getPosition().y && mouse.getPosition( okno ).y < spr.getPosition().y + tsize.y ) { if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) ) { cout << "kliknięto\n"; } }
|
|
« 1 » 2 3 |