Wirtualne kursory

0

Witam,

Mam pewien problem do którego nie wiem jak podejść. Otóż w mojej aplikacji pisanej głownie w javascript z użyciem jquery w pewnym momencie chciałbym, żeby było dostępnych kilka kursorów i kliknięcie w myszkę powodowało click event na elementach pod nimi (pod zwykłym kursorem i tymi 'wirtualnymi'). Na razie jest to zrobione tak, że obliczam pozycje zwykłego kursora, wyświetlam absolutnie pozycjonowanego diva i na event mousemove aktualizuje wartości top, left tego diva. Wirtualne kursory okalaja ten standardowy i 'podążają' za nim.

http://iv.pl/images/18710569775418278858.jpg

Powyżej podsyłam screena żeby zobrazować mój problem. Kursor (a raczej topór ;) ) w czerwonej obwódce to ten standardowy. Zaś kursor poniżej to ten div podążający. Teraz chciałbym żeby klik działał nie tylko na elementy pod standardowym kursorem ale też tymi wirtualnymi. Próbowałem coś robić z metodą trigger, ale nie wychodzi. Może powinienem pobrać pozycje x y aktualnego kliknięcia i wywoływać kolejne z offsetem ? Coś takiego jest możliwe w js ?

Dzięki za pomoc i sugestie.

1

To trudny temat i nie wiem na ile da się go wykonać w miarę wydajnie.

Potrzebujesz X, Y miejsca w które chcesz kliknąć. Następnie skanujesz drzewo DOM w taki sposób, że zaczynasz od najgłębszych elementów każdej gałęzi (powinno być najszybciej i najpewniej). Na tym elemencie pobierasz getBoundingClientRect (albo getClientRects jeżeli masz nie-prostokątne elementy) i jeżeli X, Y zawiera się w tym, to symulujeszclick na tym elemencie (to chyba nie problem). Jeżeli X, Y nie zawiera się w elemencie to sprawdzasz rodzica. Jak znajdziesz jeden element to zatrzymujesz poszukiwania, jak dotrzesz do body albo już sprawdzanego elementu pośredniego to przeskakujesz do kolejnego najgłębszego elementu.

Jak ktoś ma lepszy pomysł to zapraszam do dyskusji :P

1

...

$(document.elementFromPoint(x, y)).click();
0

ale jeżeli robisz grę (a na to wygląda) to powyższe jest troszkę lamerskim podejściem.
Prawdopodobnie masz mapę przedmiotów i obraz generuje się na ich podstawie a nie na odwrót. W związku z tym wiesz jaki element jest na jakiej pozycji i jaka akcja ma się wykonać
W związku z tym powinieneś po prostu wyjąć z mapy przedmiot i wykonać na nim bezpośrednio akcję bez angażowania w to DOM

0

@dzek69
Wydajność nie gra przesadnej roli, kwestia żeby tylko nie było widocznych przycięć ;)

@pijany terrorysta
Właśnie nie wiem na jakiej pozycji jest jakiś element, bo są one generowane w losowych miejscach w kontenerze, nie ma, przynajmniej na razie żadnej mapy przedmiotów.

EDIT
Wcześniej miałem kilka set interval w tle, click wykonywał kilka funkcji each i dochodziły do tego jeszcze efekty dzwiekowe, muzyka i nie powiem, chodziło to zaskakująco płynnie, ale jak dowaliłem document.elementFromPoint to mimo prostej struktury dom, zaczęła się robić kaszanka.

Mam jeszcze pomysł żeby elementy pozycje elementów generowanych dynamicznie trzymać w jakiejś tablicy i po każdym kliknięciu sprawdzać czy pozycja danego wirtualnego kursora mieści się w tych zakresach, jak tak to akcja. Może będzie to wydajniejsze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1