jaupl Temat założony przez niniejszego użytkownika |
[SFML, C++] Obsługa zdarzeń w funkcji » 2011-08-15 10:44:14 Chodzi mi tu o bezpośredni dostęp do klawiatury i myszy. Jak stworzyć funkcje która będzie umiała przyjąć od użytkownika liczbę ?? Jak na razie wyszło mi coś takiego : int odczyt( int liczba, sf::Sprite podswietlenie, const sf::Input & menu ) { cout << endl << "czytam" << endl; int y = 768; int warunek = 0; while( warunek != 1 ) { if( menu.IsKeyDown( sf::Key::Up ) ) cout << "ueaggg"; for( int o = 0; o < 7; o += 3 ) { int x = 832; for( int z = 1; z <= 3; z++ ) { cout << "sprawdzam." << endl; if((( menu.GetMouseX() > x && menu.GetMouseX() <( x + 99 ) ) &&( menu.GetMouseY() > y && menu.GetMouseY() <( y + 24 ) ) && menu.IsMouseButtonDown( sf::Mouse::Left ) ) &&( warunek != 1 ) ) { warunek = 1; liczba = z + o; podswietlenie.SetPosition( x, y ); } if( warunek != 1 ) podswietlenie.SetPosition( - 200, - 200 ); x += 105; } y += 30; } if( menu.IsKeyDown( sf::Key::Num0 ) ) liczba = 0, warunek = 1; if( menu.IsKeyDown( sf::Key::Num1 ) ) liczba = 1, warunek = 1; if( menu.IsKeyDown( sf::Key::Num2 ) ) liczba = 2, warunek = 1; if( menu.IsKeyDown( sf::Key::Num3 ) ) liczba = 3, warunek = 1; if( menu.IsKeyDown( sf::Key::Num4 ) ) liczba = 4, warunek = 1; if( menu.IsKeyDown( sf::Key::Num5 ) ) liczba = 5, warunek = 1; if( menu.IsKeyDown( sf::Key::Num6 ) ) liczba = 6, warunek = 1; if( menu.IsKeyDown( sf::Key::Num7 ) ) liczba = 7, warunek = 1; if( menu.IsKeyDown( sf::Key::Num8 ) ) liczba = 8, warunek = 1; if( menu.IsKeyDown( sf::Key::Num9 ) ) liczba = 9, warunek = 1; } return liczba; } Cout'y dodane tylko po to oczywiście żeby sprawdzić jak funkcja działa (poprawnie czy nie) i na razie wnioskuje że jest w niej nieskończona pętla, tylko teraz pytanie : czy dlatego że program nie przyjmuje żadnej liczby przekazanej przez użytkownika ? czy dlatego że gdzieś się machnąłem ?? (w sumie wychodzi na to samo) :P funkcję wywołuje tak : liczba[ i ] = odczyt( liczba[ i ], podswietlenie, okno.GetInput() ); Kod się kompiluje. problemem jest to ze gdy kliknę na ekran w miejsce gdzie jest button to aplikacja przestaje odpowiadać :( (kiedy używałem tej instrukcji która sprawdza położenie myszki bezpośrednio w kodzie - działała, nie używałem tylko wtedy tej pętli while( warunek != 1 ) ) |
|
RoinarN |
» 2011-08-15 14:54:53 jeżeli dobrze Cię zrozumiałem, to wnioskuję że tak. 1. Jest to nieskończona pętla, tak jak by, dopóty, dopóki nie uzyska wydarzenia, które rozkaże programowi zakończyć swoje działanie, np. ESC. 2. Nie możesz używać cout, jeżeli chcesz coś wyświetlić w oknie, cout-skrót od Console OUT, czyli wyświetla w konsoli, w tym przypadku musisz używać printf i scanf, ale pamiętaj że musisz dodać odpowiednią bibliotekę- cstdlib(chyba) |
|
malan |
» 2011-08-15 15:44:07 @RoinarN: Za pomocą printf da się wyświetlić tekst w oknie SFML? |
|
jaupl Temat założony przez niniejszego użytkownika |
» 2011-08-15 16:19:26 oczywiście że nic (chodzi mi o cout'y) nie wyświetla się w oknie sfml ^^ ale okno konsoli jest w tle i widzę te komunikaty. tylko problem polega na tym że nawet gdy wciskam miejsce w którym znajduje się button nic się nie dzieje - w dodatku program przestaje odpowiadać. a kiedy używam przycisków num0 itd też nic się nie dzieje. najgorsze jest to że nie wiem co robię źle. :/
|
|
malan |
» 2011-08-16 03:43:38 Zdarzenia same się nie odbiorą - są na tyle bezczelne, że trzeba po nie samemu iść ;/ |
|
jaupl Temat założony przez niniejszego użytkownika |
» 2011-08-17 08:28:15 Bezpośredni dostęp można uzyskać poprzez metodę GetInput klasy window |
(którą podaję jako argument do funkcji odczyt). metoda zwraca referencję na stały obiekt typu sf::Input. | const sf::Input & menu który tworze przy deklaracji funkcji, tak ?? Tak mi się wydawało i myślałem że to wystarczy... ale widać się myliłem. Nie ogarniam tego zabardzo ... i nie wiem jak mam to dokładnie zrobić ... zapis : const sf::Input & menu = okno.GetInput() a potem podanie menu jako argument też mi nic nie dało ... ;/ Więc problem ni mniej ni więcej polega na tym że nie mam bladego pojęcia JAK po nie pójść. |
|
imralav |
» 2011-08-17 15:04:32 Może niech parametrem funkcji będzie wskaźnik na obiekt klasy RenderWindow, argumentem adres tego obiektu i wewnątrz funkcji wykorzystasz metodę .GetInput() tego obiektu? RenderWindow okno(...); ... void xxx( RenderWindow * okno,...) { if( okno->GetInput()...) ... } ... |
|
jaupl Temat założony przez niniejszego użytkownika |
» 2011-08-18 08:48:31 Chodzi mniej więcej o to ? : Funkcja: int odczyt( int liczba, sf::Sprite podswietlenie, sf::RenderWindow * okno, int & warunek ) { const sf::Input & menu = okno->GetInput(); int y = 768; if( menu.IsKeyDown( sf::Key::Up ) ) cout << "ueaggg"; for( int o = 0; o < 7; o += 3 ) { int x = 832; for( int z = 1; z <= 3; z++ ) { cout << "sprawdzam." << " " << warunek << endl; if((( menu.GetMouseX() > x && menu.GetMouseX() <( x + 99 ) ) &&( menu.GetMouseY() > y && menu.GetMouseY() <( y + 24 ) ) && menu.IsMouseButtonDown( sf::Mouse::Left ) ) &&( warunek != 1 ) ) { warunek = 1; liczba = z + o; podswietlenie.SetPosition( x, y ); } if( warunek != 1 ) podswietlenie.SetPosition( - 200, - 200 ); x += 105; } y += 30; } if( okno->GetInput().IsKeyDown( sf::Key::Num0 ) ) liczba = 0, warunek = 1; if( menu.IsKeyDown( sf::Key::Num1 ) ) liczba = 1, warunek = 1; if( menu.IsKeyDown( sf::Key::Num2 ) ) liczba = 2, warunek = 1; if( menu.IsKeyDown( sf::Key::Num3 ) ) liczba = 3, warunek = 1; if( menu.IsKeyDown( sf::Key::Num4 ) ) liczba = 4, warunek = 1; if( menu.IsKeyDown( sf::Key::Num5 ) ) liczba = 5, warunek = 1; if( menu.IsKeyDown( sf::Key::Num6 ) ) liczba = 6, warunek = 1; if( menu.IsKeyDown( sf::Key::Num7 ) ) liczba = 7, warunek = 1; if( menu.IsKeyDown( sf::Key::Num8 ) ) liczba = 8, warunek = 1; if( menu.IsKeyDown( sf::Key::Num9 ) ) liczba = 9, warunek = 1; if( menu.IsKeyDown( sf::Key::Escape ) ) okno->Close(); return liczba; }
wywołanie : liczba[ i ] = odczyt( liczba[ i ], podswietlenie, & okno, warunek );
P.s. jak widać próbowałem też podać zdarzenie jako argument funkcji i potem umieszczać je w warunkach z marnym skutkiem - program się kompilował, ale jak coś zrobiłem w oknie to przestawał odpowiadać (zawieszał się) z resztą dalej jest tak samo ;/ |
|
« 1 » 2 |