Mitu Temat założony przez niniejszego użytkownika |
Jak zaprogramować kliknięcia na obiekty w graficznym interfejsie? » 2013-11-25 22:09:40 Załóżmy, że tworzę grę lub program, polegającą np. na układaniu puzzli. Jaki jest najlepszy sposób do zaprogramowania wydarzeń związanych z przeciąganiem jednego z wielu elementów po planszy lub klikaniu na nie? Do każdego z obiektów po kolei wysłać typ wydarzenia i pozycję kursora i każdy z nich stwierdzałby, czy jest tym kliknięciem zainteresowany? |
|
DejaVu |
» 2013-11-26 01:16:08 W zasadzie to nie ma najlepszego sposobu... wszystko zależy od implementacji jaką posiadasz w swojej aplikacji do obsługi myszy. W przypadku przeciągania obiektów to wystarczy zapamiętać puzzla w chwili, w której nastąpiła zmiana stanu przycisku myszy na wciśnięty i przyjąć, że ten zapamiętany puzzel ma tak długo podążać za myszą, dopóki klawisz myszy jest wciśnięty. |
|
Mitu Temat założony przez niniejszego użytkownika |
» 2013-11-26 01:24:09 Chodzi mi właśnie o to, jak zapamiętać puzzla. Czy to dobre rozwiązanie - wysłać każdemu pozycję myszy i każdy z nich przyrówna ją do swojego położenia i rozmiaru i wtedy da znać czy jest zainteresowany. Tak samo ze zwykłymi kliknięciami na elementy menu. |
|
DejaVu |
» 2013-11-26 01:47:44 Dla każdego puzzla sprawdzaj czy mysz jest nad nim. W końcu raczej nie masz dużo puzzli. SFML ma np. metodę intersects w klasie sf::FloatRect. Jeżeli używasz innej biblioteki to możesz sobie ją w bardzo prosty sposób zaimplementować. |
|
pekfos |
» 2013-11-26 12:26:24 SFML ma np. metodę intersects w klasie sf::FloatRect |
Do sprawdzania punktu lepsze jest contains() i to dotyczy wszystkich rectów. |
|
braders |
» 2013-11-27 20:01:57 Zrób klase puzel i pola "x,y,szerokosc,wysokosc" i sprawdzaj czy został wciśnięty guzik myszki jeśli tak sprawdzaj czy mysz znajduję się nad którymś puzzlem jeśli tak to przesuwaj puzzel za myszką. |
|
skovv |
» 2013-11-27 20:12:49 Ja zazwyczaj robię tak: struct Rectangle { int X, Y, W, H; Rectangle( int x, int y, int w, int h ) { X = x; Y = y; W = w; H = h; } };
bool CollisionPoint( Rectangle * rc, int x, int y ) { if( x >= rc->X && x < rc->X + rc->W && y >= rc->Y && y < rc->Y + rc->H ) return true; else return false; }
Rectangle * Puzel = new Rectangle( 100, 100, 64, 64 );
if( MousePressLeft ) { if( CollisionPoint( Puzel, MouseX, MouseY ) ) cout << "Kliknąłeś!"; }
|
|
braders |
» 2013-11-27 20:24:51 @up Poco mu tablica dynamiczna? Puzzle zazwyczaj mają znaną liczbę części. Ja bym zrobił na dwuwymiarowej tablicy, np. tablica[9][9] i wtedy może sobie przyciągać puzzle do siatki. |
|
« 1 » 2 |