Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[ALLEGRO] Wykrywanie podwójnego kliknięcia.

Ostatnio zmodyfikowano 2010-11-20 16:23
Autor Wiadomość
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).
P-24171
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.
P-24172
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ć

C/C++
int time1 = GetTickCount();
// ... jakies operacje
int time2 = GetTickCount();
printf( "Uplynelo %d milisekund\n", time2 - time1 );
P-24173
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ć.
P-24174
McAffey
» 2010-11-20 12:03:10
Nie możesz po prostu cały czas sprawdzać dla danego obszaru ?
P-24175
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
P-24176
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
P-24180
« 1 »
  Strona 1 z 1