[ALLEGRO] Wykrywanie podwójnego kliknięcia.
Ostatnio zmodyfikowano 2010-11-20 16:23
akwes Temat założony przez niniejszego użytkownika |
[ALLEGRO] Wykrywanie podwójnego kliknięcia. » 2010-11-20 11:31:48 Stworzyłem robocze podwójne kliknięcie jednak nie działa tak jakbym chciał. Zanim zacznę tutaj wchodzić z kodem, zapytam, czy Allegro nie udostępnia obsługi double click-a? Na takiej samej zasadzie jak mouse_b? [edit] Jeżeli nie ma to jak wykryć poprawnie double klik na obszarze x1,y1,x2,y2; do dyspozycji mam moje funkcje: bool KDrzwi::isin() { if (mx+x > x1 && mx+x < x2 && my > y1 && my < y2) return 1; else return 0;
}
// zwraca 1 jeżeli kursor jest w polu oraz bool KDrzwi::ispress(int ktory=1) { if (isin() == 1 && mb == ktory) return 1; else return 0; }
// zwraca 1 jeżeli został kliknięty (domyślnie) LPM. Starałem się współgrać to z timerem, jednak jedyne co osiągnąłem to rozpoznanie dwukliku ale bez patrzenia na obszar (czyli klikam poza np. buttonem, drugi klik na butonie, w czasie zanim timer wyzeruje zmienną trzymającą wartość dwukliku i wchodzi, jednak mnie to nie zadowala). |
|
McAffey |
» 2010-11-20 11:41:27 Nie spotkałem się z czymś takim w allegro, ale też nie szukałem, kiedyś jak do czegoś potrzebowałem podwójne kliknięcie (już nie pamiętam do czego) to sam to szybko oprogramowałem, to naprawdę nic trudnego. |
|
ison |
» 2010-11-20 11:53:34 sprawdź ile czasu upłynie między dwoma kliknięciami, zapamiętuj sobie w jakiejś zmiennej czas poprzedniego kliknięcia i w przypadku drugiego kliknięcia sprawdzaj ile upłynęło czasu możesz użyć do tego clock() z ctime (zwraca ilość milisekund od początku programu) albo GetTickCount() z windows.h (zwraca ilość milisekund od włączenia systemu) - nie są one super dokładne ale powinny wystarczyć int time1 = GetTickCount();
int time2 = GetTickCount(); printf( "Uplynelo %d milisekund\n", time2 - time1 );
|
|
akwes Temat założony przez niniejszego użytkownika |
» 2010-11-20 12:00:39 Jak pisałem wyżej, efekt dwukliku jako takiego osiągnąłem, jednak cały czas mi nie chce działać dwuklik na pewnym obszarze. Dlaczego na obszarze? Bo to nie fajne jak pierwsze kliknięcie jest na ścianie, a drugie na drzwiach i wyjdzie że dwuklik był na drzwiach. Liczyłem że jest jakaś wbudowana obsługa tego, no nic, trzeba będzie popróbować. |
|
McAffey |
» 2010-11-20 12:03:10 Nie możesz po prostu cały czas sprawdzać dla danego obszaru ? |
|
akwes Temat założony przez niniejszego użytkownika |
» 2010-11-20 12:14:37 Timer while(speed3 > 0 && mdc>=1) // TIMER OD DUBLE CLICK { mdc = 0; speed3 --; }
Timer ustawiony na 1 sekundę. Czyli jeżeli mdc będzie 1 lub więcej to po sekundzie go wyzeruje. Sekunda to czas na drugie kliknięcie. bool KDrzwi::ispress2() { if (mb==1 && isin() == 1) mdc ++; if (mdc == 3) mdc = 0; if (isin() == 0) mdc=0; if (mdc == 2) return 1; else return 0; }
Nie wiem czemu ta wersja w ogóle nie działa. bool KDrzwi::ispress2() { if (mb==1 && isin() == 1) mdc ++; if (mdc == 3) mdc = 0; if (isin() == 0) mdc=0; if (mdc == 2) return 1; else return 0;
return 0; }
Ta wersja już tak, nie mam pojęcia czemu, skoro wcześniejszy if zwraca wartość funkcji dla każdej możliwej kombinacji... Funkcja isin zwraca 1 jeśli jest w polu, 0 jeśli nie jest. Zakładam że podczas dwukliku nie można opuścić pola. Efekt? Zmienna od dwukliku cały czas ma wartość zero. Jeżeli badam czy wszystko jest ok z isin(); to tak, ładnie pokazuje kiedy kursor jest w obszarze a kiedy nie. Nie wiem gdzie jest błąd. Zapomniałem dodać mb to mouse_b |
|
lenrokskate |
» 2010-11-20 16:23:02 jest taka funkcja w allegro, która zwraca czas od ostatniego kliknięcia - była ona w artykule na starej stronie |
|
« 1 » |