Komme i gang med Paper.js Brukerinteraksjon

Etter å ha lest de to første veiledningene, bør du kunne lage stier og noen grunnleggende forhåndsdefinerte former. Du bør også kunne forenkle eller flate dine stier, samt tegne dem på forskjellige lag og blande dem sammen. 

Selv om vi har kommet langt, er det fortsatt en ting mangler. Opptil dette punktet har det ikke vært noen interaksjon mellom lerretet og brukeren. Det ville være fint om vi kunne gi brukerne muligheten til å samhandle med ulike baner eller tegne noe alene. Denne opplæringen vil dekke alle grunnleggende om brukerinteraksjon, som starter med verktøy variabel.

Verktøy og ToolEvent

Det er et globalt verktøy variabel som bare finnes i skript som inneholder handlerfunksjoner for å samhandle med enten musen eller tastaturet. Denne variabelen gir deg tilgang til egenskaper som minDistance, som er den minste avstanden hvoretter musen igjen kan brenne onMouseDrag hendelsen, siden den ble sist avfyrt. Tilsvarende eiendommen maxDistance lar deg angi maksimal avstand etter hvilken onMouseDrag arrangementet må brann igjen.

Paper.js har også a ToolEvent gjenstand. Det er en forlengelse av hendelsesobjektet og den eneste parameteren som overføres til alle hendelser for mushendelse. Den inneholder all relevant informasjon om disse museventilene som:

  • type, som forteller deg om hendelsen er mouseup, mousedown, mousemove eller mousedrag.
  • punkt, som gir deg posisjonen til musen når hendelsen ble sparket.
  • delta, som gir deg avstanden mellom nåværende og siste museposisjon når hendelsen ble avfyrt.
  • telle, som gir deg antall ganger musen hendelsen ble sparket.
  • punkt, som gir deg elementet som var tilstede på stedet for musen. Hvis varen er en del av a gruppe eller forbindelse sti da det øverste nivået av gruppe eller forbindelse  banen returneres.
  • lastPoint, som gir posisjonen til musen når hendelsen ble sist avfyrt.
  • downpoint, som gir deg posisjonen til musen i prosjektkoordinater når den ble sist klikket.
  • middlePoint, som gir deg poenget i midten av lastPoint og punkt

Du bør holde alle disse i tankene fordi de vil bli brukt ofte i de fleste av prosjektene dine.

Musinteraksjoner

Paper.js har ulike håndteringsfunksjoner som kalles automatisk for å håndtere ulike museventiler. De tre musen håndteringsfunksjonene er oppført nedenfor.

funksjon onMouseDown (event) // Gjør noe console.log ('Mouse pressed!');  funksjon onMouseDrag (event) // Gjør noe annet console.log ('Mouse dragged!');  funksjon onMouseUp (event) // Gjør noe console.log ('Mouse released!'); 

La oss lage en grunnleggende demo basert på onMouseDown og onMouseUp handlers. Hver gang en bruker trykker på en museknapp, vil vi opprette en ny Sti og merk det punktet som begynnelsen på vår Sti

Hver gang brukeren slipper museknappen, legger vi til et nytt punkt som slutten av vår Sti. Dette vil skape en rett linje fra det punktet der museknappen ble trykket til det punktet hvor det ble utgitt. Her er koden:

var aPath; funksjon onMouseDown (hendelse) aPath = new path (); aPath.strokeColor = 'purple'; aPath.strokeWidth = event.point.x / 10; aPath.add (event.point);  funksjon onMouseUp (event) aPath.add (event.point); 

Jeg har også satt strokeColor til lilla og strokeWidth til en tiendedel av verdien av x-koordinat ved hjelp av event.point eiendom. Hvis du prøver å tegne noen vertikale linjer i det grå området under, vil du legge merke til at alle har en bredde som er direkte proporsjonal med avstanden fra venstre side.

La oss nå lage noen sirkler ved hjelp av onMouseDrag begivenhet. Hver gang en draghendelse blir sparket, trekker vi en sirkel med sitt midtpunkt i midtpunktet for det siste og nåværende drappunktet. Radius av sirkelen vil avhenge direkte av drahastigheten til brukeren. 

For å finne sentrum av sirkelen, kan vi bruke middlePoint eiendom som vi diskuterte i forrige del. For å bestemme radiusen til sirkelen, kan vi bruke delta eiendom og del resultatet med 2. Her er koden vi trenger:

tool.maxDistance = 50; tool.minDistance = 4; funksjon onMouseDrag (event) varcirkel = ny Path.Circle (senter: event.middlePoint, radius: event.delta.length / 2); circle.fillColor = 'rosa'; circle.strokeColor = 'black'; 

Hvis brukeren skulle dra musen for raskt eller for sakte, ville sirklene bli for store eller for små. 

Dette problemet kan løses ved å bruke maxDistance og minDistance eiendommer. Hvis brukeren drar for fort, vil maxDistance eiendom vil brenne dra hendelsen hver 50 piksler. Hvis brukerens drahastighet er for treg, vil den minDistance Eiendommen vil ikke bli avfyrt før minimumsgrenseverdien som vi oppgav er nådd. Du kan teste koden ovenfor ved å dra musen i det grå området under:

Tastaturinteraksjoner

De begivenhet objektet har tre egenskaper som du kan bruke til samspill med tastaturet. De event.key egenskapen vil fortelle deg hvilken tast som ble trykket, og event.character eiendom vil fortelle deg tegnet som ble generert på nøkkelpress. For å avgjøre om det var en keyup eller keydown arrangement, kan du bruke event.type eiendom.

La oss bruke disse egenskapene sammen for å lage små sirkler og flytte dem rundt. Ta en titt på koden nedenfor:

var trinn = 10; var centerPoint = nytt punkt (100, 100); funksjon onKeyDown (event) var sirkel = ny Path.Circle (centerPoint, 3); circle.fillColor = 'rosa'; circle.strokeColor = 'black'; hvis (event.key == 'a') centerPoint - = nytt punkt (trinn, 0);  // Kode for andre nøkler

Vi lager en variabel skritt som vil bli brukt til å bestemme hastigheten som sirkelen vår beveger seg rundt. Variabelen midtpunkt lagrer plasseringen av sentrum av våre kretser. De onkeydown Handler har koden til å håndtere alt keydown arrangementer. Denne hendelsen blir avbrutt kontinuerlig så lenge en nøkkel blir trykket. 

Dette er grunnen til at nye kretser opprettes kontinuerlig. Basert på nøkkelpresset, endrer vi verdien av midtpunkt å flytte vår nyopprettede sirkel til en annen plassering. Du kan se koden i aksjon i demonstrasjonen nedenfor:

Noen nøkler, for eksempel Skifte nøkkel og Alternativ nøkkel, ikke produsere et tegn direkte når du trykker på det. Disse tastene kalles modifikasjonstaster. De begivenhet objektet har en event.modifiers egenskap som du kan bruke til å bestemme modifikatortasten som ble trykket. Vurder koden nedenfor:

var sti; funksjon onMouseDown (hendelse) path = new path (); path.strokeColor = 'black'; path.strokeWidth = 2; path.add (event.point);  funksjon onMouseDrag (event) if (event.modifiers.shift) path.lastSegment.point = event.point; path.simplify ();  annet path.add (event.point); 

Når en bruker trykker på en museknapp, vil onMouseDown handler lager en ny sti og legger til et poeng til det. Etter at du begynner å dra, onMouseDrag handler legger til et nytt poeng til det på hver drakkhendelse. 

Hvis du drar musen med Skifte tastetrykk, registrerer håndtereren det med event.modifiers.shift eiendom. I så fall, i stedet for å legge til et nytt punkt på hver drabegivenhet, setter den bare koordinatene til det siste segmentet til den nåværende plasseringen av musepekeren. Det forenkler også den komplette banen som ble tegnet. Du kan dra musen i det grå området under for å se hvordan stien oppfører seg når Skifte tasten er trykket.

Hvis Shift-tasten ikke ser ut til å fungere, er det sannsynligvis fordi lerretet ikke har fokus. I så fall bør du først klikke inn i det lille hvite rommet under lerretet for å gi det fokus.

Siste tanker

Arrangementhåndtererne som vi diskuterte i dag dekker de mest vanlige interaktivitetsscenariene. Som det fremgår av opplæringen, er det ikke vanskelig å manipulere elementene i et lerret basert på brukerens handlinger. Den beste måten å lære på er å praktisere. Så jeg vil foreslå at du lager dine egne demoer som kombinerer alt du har lært i de tre opplæringsprogrammer opp til dette punktet.

Hvis du har spørsmål angående denne opplæringen, vennligst gi meg beskjed i kommentarene.