Komma igång med Paper.js Användarinteraktion

Efter att ha läst de två första handledningarna borde du kunna skapa vägar och några grundläggande fördefinierade former. Du bör också kunna förenkla eller plana dina vägar samt dra dem på olika lager och blanda dem ihop. 

Trots att vi har kommit långt, finns det fortfarande en sak saknas. Fram till denna punkt har det inte förekommit någon interaktion mellan vår duk och användaren. Det vore trevligt om vi kunde ge användarna möjlighet att interagera med olika vägar eller rita något på egen hand. Denna handledning kommer att täcka alla grunderna för användarinteraktion, från och med verktyg variabel.

Verktyg och ToolEvent

Det finns en global verktyg variabel som endast existerar i skript som innehåller hanteringsfunktioner för att interagera med antingen musen eller tangentbordet. Denna variabel ger dig tillgång till egenskaper som minDistance, vilket är det minsta avståndet efter vilket musen igen kan avfyra onMouseDrag händelse, eftersom den senast blev avfyrade. På samma sätt är egendomen maxDistance kan du ange ett maximalt avstånd efter vilket onMouseDrag händelsen måste elda igen.

Paper.js har också a ToolEvent objekt. Det är en förlängning av händelseobjektet och den enda parametern som skickas till alla mushändelseshandlare. Den innehåller all relevant information om dessa mushändelser som:

  • typ, som berättar om händelsen är mouseup, mousedown, mouse eller mousedrag.
  • punkt, vilket ger dig musens position när händelsen avfyrades.
  • delta, vilket ger dig avståndet mellan aktuell och sista musposition när händelsen avfyrades.
  • räkna, vilket ger dig det antal gånger musevenemanget avfyrades.
  • Artikel, vilket ger dig objektet som var närvarande vid platsen för mushändelsen. Om objektet är en del av a grupp eller förening vägen då den högsta nivån på grupp eller förening  sökvägen återlämnas.
  • lastPoint, vilket ger musens position när händelsen senast slogs.
  • downpoint, vilket ger dig musens position i projektkoordinater när den senast klickades.
  • Middle, vilket ger dig poängen mitt i lastPoint och punkt

Du bör hålla alla dessa i åtanke eftersom de kommer att användas ofta i de flesta av dina projekt.

Musinteraktioner

Paper.js har olika hanteringsfunktioner som kallas automatiskt för att hantera olika mushändelser. De tre mushanteringsfunktionerna listas nedan.

funktion onMouseDown (händelse) // Gör något console.log ('Mus pressad!');  funktion onMouseDrag (händelse) // Gör något annat console.log ('Mouse dragged!');  funktion onMouseUp (händelse) // Gör någonting console.log ('Mouse released!'); 

Låt oss skapa en grundläggande demo baserad på onMouseDown och onMouseUp hanterare. Varje gång en användare trycker på en musknapp skapar vi en ny Väg och markera den punkten som början av vår Väg

Varje gång användaren släpper musknappen lägger vi till en ny punkt som slutet av vårt Väg. Detta skapar en rak linje från den punkt där musknappen pressades till den punkt där den släpptes. Här är koden:

var aPath; funktion onMouseDown (händelse) aPath = new path (); aPath.strokeColor = 'lila'; aPath.strokeWidth = event.point.x / 10; aPath.add (event.point);  funktion onMouseUp (händelse) aPath.add (event.point); 

Jag har också satt strokeColor till lila och strokeWidth till en tiondel av värdet av x-koordinat med användning av event.point fast egendom. Om du försöker dra några vertikala linjer i det grå området nedan kommer du att märka att alla har en bredd som är direkt proportionell mot deras avstånd från vänster sida.

Nu, låt oss skapa några cirklar med hjälp av onMouseDrag händelse. Varje gång en draghändelse avfyras kommer vi att rita en cirkel med sitt centrum i mitten av den sista och aktuella dragpunkten. Radiets radie beror direkt på användarens draghastighet. 

För att hitta mitten av vår cirkel kan vi använda Middle egendom som vi diskuterade i föregående avsnitt. För att bestämma cirkelns radie kan vi använda delta egendom och dela resultatet med 2. Här är koden som vi behöver:

tool.maxDistance = 50; tool.minDistance = 4; funktion onMouseDrag (händelse) var circle = new Path.Circle (center: event.middlePoint, radie: event.delta.length / 2); circle.fillColor = 'pink'; circle.strokeColor = 'black'; 

Om användaren skulle dra musen för snabbt eller för långsamt skulle cirklarna bli för stora eller för små. 

Problemet kan lösas med hjälp av maxDistance och minDistance egenskaper. Om användaren drar för snabbt, kommer maxDistance egenskapen kommer att skjuta dra händelsen varje 50 pixlar. Om användarens draghastighet är för långsam, minDistance egendom kommer inte att sparkas till dess att den minsta distansgränsen som vi har angivit har uppnåtts. Du kan testa koden ovan genom att dra musen i det grå området nedan:

Tangentbordsinteraktioner

De händelse Objektet har tre egenskaper som du kan använda för dina interaktioner med tangentbordet. De event.key egenskapen kommer att berätta vilken tangent som trycktes och event.character egenskapen kommer att berätta för tecknet som skapades på nyckelpress. För att avgöra om det var a keyUp eller nyckel ner händelse kan du använda event typ fast egendom.

Låt oss använda dessa egenskaper tillsammans för att skapa små cirklar och flytta runt dem. Ta en titt på koden nedan:

var steg = 10; var centerPoint = ny punkt (100, 100); funktion onKeyDown (händelse) var circle = new Path.Circle (centerPoint, 3); circle.fillColor = 'pink'; circle.strokeColor = 'black'; om (event.key == 'a') centerPoint - = ny punkt (steg, 0);  // Kod för andra knappar

Vi skapar en variabel steg som kommer att användas för att bestämma hur mycket cirkeln rör sig runt. Variabeln mittpunkt lagrar platsen för mitten av våra cirklar. De onKeyDown handler har koden för att hantera allt nyckel ner evenemang. Denna händelse avfyras kontinuerligt så länge som en tangent trycks in. 

Detta är anledningen till att nya cirklar skapas kontinuerligt. Baserat på nyckeln trycker vi på värdet av mittpunkt för att flytta vår nyskapade cirkel till en annan plats. Du kan se koden i aktion i demo nedan:

Några nycklar, till exempel Flytta nyckel och Alternativ nyckeln, skapar inte direkt ett tecken när det trycks in. Dessa tangenter kallas modifieringsnycklar. De händelse objektet har en event.modifiers egenskap som du kan använda för att bestämma modifieringsnyckeln som trycktes. Tänk på koden nedan:

var väg; funktion onMouseDown (händelse) path = new path (); path.strokeColor = 'black'; path.strokeWidth = 2; path.add (event.point);  funktion onMouseDrag (händelse) if (event.modifiers.shift) path.lastSegment.point = event.point; path.simplify ();  annars path.add (event.point); 

När en användare trycker på en musknapp, onMouseDown handler skapar en ny sökväg och lägger till en punkt på den. När du börjar dra, onMouseDrag handler lägger till en ny punkt på det vid varje draghändelse. 

Om du drar musen med Flytta tangenttryckt, hanteraren upptäcker den med event.modifiers.shift fast egendom. I så fall ställer det i stället för att lägga till en ny punkt på varje draghändelse, justerar koordinaterna för det sista segmentet till den aktuella platsen för muspekaren. Det förenklar också den fullständiga vägen som ritades. Du kan dra musen i det grå området nedan för att se hur vägen beter sig när Flytta tangenten trycks in.

Om Shift-tangenten inte verkar fungera, beror det troligen på att duken inte har fokus. I det fallet bör du först klicka inuti det lilla vita utrymmet under duken för att ge det fokus.

Slutgiltiga tankar

Den händelsehanterare som vi diskuterade idag täcker de vanligaste interaktivitetsscenarierna. Såsom framgår av handledningen är det inte svårt att manipulera objekten i en duk baserat på användarens handlingar. Det bästa sättet att lära sig är att öva. Så jag skulle vilja föreslå att du skapar egna demo som kombinerar allt som du har lärt dig i de tre handledningarna fram till den här punkten.

Om du har några frågor angående denna handledning, vänligen meddela mig det i kommentarerna.