• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Js Onclick na rysowanym obiekcie? (canvas)

Object Storage Arubacloud
0 głosów
649 wizyt
pytanie zadane 15 października 2017 w JavaScript przez shy_fox Gaduła (4,320 p.)

Witam, przykladowo rysując takim kodem w canvas kulkę


ctx.beginPath();
    ctx.arc(20, 20, 10, 0, Math.PI*2);
    ctx.fillStyle = "#0095DD";
    ctx.fill();
    ctx.closePath();

Istnieje możliwość aby po jej kliknięciu wykonywała się funkcja? jak to zrobić? może coś z onlick, nie mam pojęcia, byłbym bardzo wdzięczny za odpowiedź

3 odpowiedzi

+2 głosów
odpowiedź 15 października 2017 przez Frozenfroggie Użytkownik (990 p.)
wybrane 15 października 2017 przez shy_fox
 
Najlepsza

Musisz użyć addEventListener który przy kliknięciu będzie pobierał dane dotyczące miejsca kliknięcia, a następnie przy pomocy twierdzenia pitagorasa liczysz czy dystans między środkiem okręgu a miejscem kliknięcia jest mniejszy niż promień, jeśli tak to wywołujesz swoją funkcję. Np:

const x = 20; 
const y = 20; 
const radius = 10;

ctx.beginPath();
ctx.arc(x, y, radius, 0, Math.PI*2);
ctx.fillStyle = "#0095DD";
ctx.fill();
ctx.closePath();

function yourFunction() {
  console.log("Inside!");
}

addEventListener("click", (event) => {
  const mouseX = event.clientX;
  const mouseY = event.clientY;
  const distance = Math.sqrt(Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2));
  if(distance < radius) {
    yourFunction();
  }
});

 

+1 głos
odpowiedź 15 października 2017 przez obl Maniak (51,280 p.)
Rysując po canvas-ie nie tworzysz elementu html więc zdarzenie onclick samego obiektu rysowanego odpada. Dało by się to w ten sposób zrobić, gdybyś używał grafiki svg.

Na canvas-ie też można jednak wykonywać takie operacje, jednak wymaga to znajomości programowania obiektowego, gdyż taki obiekt (okrąg) musi być opisany i zapisany w klasie (a w zasadzie to najlepiej by było, żeby tak był opisany), później odpowiednia metoda tego obiektu byłaby wywoływana w celu sprawdzenia, czy kliknięto obszar, w którym znajduje się ten obiekt. To wywołanie musiało by zostać wykonane w funkcji podpiętej pod zdarzenie onclick samego canvas-u. Tak w ogóle to takich obiektów na canvas-ie może być więcej więc powinieneś mieć listę utworzonych elementów rysowanych na danym canvas-ie.
+1 głos
odpowiedź 15 października 2017 przez Comandeer Guru (600,810 p.)
Jeśli do rysowanych figur chcemy podpiąć obsługę zdarzeń, to zastanowiłbym się, czy aby nie byłoby wygodniej wykorzystać do tego SVG, który pozwoliłby do każdego kształtu dopiąć dowolne zdarzenie.
komentarz 15 października 2017 przez obl Maniak (51,280 p.)
Pewnie, że to by było wygodniejsze bo odchodzi ci cała obsługa tego, który obiekt kliknięto i nie musisz się tym już martwić.
komentarz 10 lutego 2020 przez belg2020 Nowicjusz (100 p.)

@Comandeer,

witam, nie gniewajcie się że stary temat odkopuję, ale nie chcę zakładać kolejnych tematów, mam jedno pytanie apropo canvasa. Myślę że JQuery html css mam na poziomie zaawansowanym, canvasem sie zainteresowałem niedawno, ale szybko chwytam i jestem nim zafascynowany i udalo mi się zrobić juz kilka ciekawych efektów. Nie pojmuję jednak obsługi zdarzeń. Jeśli ja dobrze rozumiem to jedyną opcją jest sprawdzić pozycję kursora i porównać z pozycją prostokąta i jego szerokością - podobnie koło. No ale jak są bardziej skomplikowane figury?

jest na przykład taka gra (TUTAJ) i wyświetlana jest jako canvas, i klikanie na róże obiekty jest nieproblemem - zatem o co tu chodzi - niby canvas a działa - jakie są na to sposoby?

komentarz 10 lutego 2020 przez Comandeer Guru (600,810 p.)

Znając kształt rysowanego przedmiotu, wiesz też, jakie dokładnie koordynaty zajmuje na canvasie. Zasada jest dokładnie taka sama, jak przy prostych figurach.

komentarz 10 lutego 2020 przez belg2020 Nowicjusz (100 p.)
no powiedzmy, że przygotuję grafikę w png lub svg i nastepnie umieszcze w canvasie to jedyne co mi przychodzi do głowy to jakas tablica w ktorej umieszcze wszystkie współrzędne piksele co raczej nie wchodzi w gre bo przeglądarka by nie dała rady przy tej ilosci. Zatem podpowiedź mi proszę ...
komentarz 10 lutego 2020 przez Comandeer Guru (600,810 p.)

A po co Ci wszystkie piksele? Wystarczą tylko te z brzegu, tworzące obrys danego przedmiotu. Można też pobawić się tzw. hit regions. Swego czasu canvas miał nawet wbudowane addHitRegion, ale na razie standaryzacja utknęła w miejscu.

komentarz 12 lutego 2020 przez belg2020 Nowicjusz (100 p.)

Tylko takie rozwiaznie jak na tę chwilę mi przychodzi do głowy - skrypt w javascript który znajduje ostatni "biały" pixel (i ostatni biały od prawej) i dodaje to tablicy współrzędne - w ten sposób znam współrzędne - one są stałe do obrazka więc po wygenerowaniu mogę je użyć do statmentu - jeśli cursor jest pomiedzy ... 

Jedyne co mi przychodzi do głowy - jaki znasz innyc sposób? Bo ten wydaj mi się za bardzo wymagający jak dla przeglądarki - szczególnie jak takich obiektów (różnego kształu) będzie dużo więcej.

Podobne pytania

0 głosów
1 odpowiedź 427 wizyt
pytanie zadane 2 listopada 2016 w JavaScript przez niezalogowany
+1 głos
3 odpowiedzi 622 wizyt
pytanie zadane 20 października 2017 w HTML i CSS przez adrian588 Początkujący (470 p.)
0 głosów
2 odpowiedzi 286 wizyt
pytanie zadane 8 marca 2018 w JavaScript przez Yashe Dyskutant (7,720 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,941 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...