En trådlös handkontroll för Scratch! (2 / 3 steg)
Steg 2: Hur man gör en Scratch sprite flytta trådlöst
Räkna hur man översätter rörelse i luften till rörelse på skärmen var riktigt kul! Det finns förmodligen många olika metoder för detta, och det var en utmaning att begränsa val och att leka med data tills något började att klicka.
PocketLab har 3 rörelsesensorer som vi trodde var kandidater: magnetometer, gyroskop och accelerometer. Vi gick genom försök och misstag på varje tills vi avgöras på accelerometern.
Här är teorin om översätta accelerometer till sprite motion:
I den första sidan i anteckningsboken har jag ritat x och y axel riktningarna av PocketLab. Det finns en z-axel också, och som pekar genom tabellen. Du kan se data på datorn grafen. X är röd, y är blå och z är grön. Titta på x och y riktningar, som är parallella till tabellen, sensorn är vid vila och x och y läsa 0 g (gravitation). Z-axeln går igenom tabellen pekar upp och ner, och på datorn läser + 1 g. Varför är detta? Tja, x och y är 0 eftersom de är vid vila och vinkelrätt mot z. Z-axeln pekar i riktning mot tyngdkraften, genom tabellen och mot golvet. På jorden, styrkan av gravitation som människor tycker är ca 9,8 meter per sekund fyrkant, och för enkelhetens skull det heter 1 g, och är alltid en gemena g. Så läser datorn x = 0g, y = 0g och z = 1g, och med det kan du vara ganska säker på att jag tog denna bild samtidigt på planeten jorden.
I den andra bärbara sidan, jag har roterat PocketLab på sin framkant och nu y-axeln pekar upp och ner och kommer att läsa + 1 g. X-axeln är oförändrad och fortfarande läser 0 g. Z-axeln läser nu 0g eftersom det är vinkelrät mot gravitationen.
Jag kan upprepa detta i de andra 3 sidorna av sensorn, och du kan se att sensorn kommer att gå igenom följande:
x = 0g y = 0g när platt på bordet
x = 1g, y = 0g när på vänster sida
x = - 1g, y = 0g på höger sida
x = 0g, y = 1g när på framsidan
x = 0g, y = - 1g när på baksidan
När vi såg att PocketLab kommer att generera data mellan -1 och 1 för både x och y, allt vi hade att göra var att multiplicera x och y sensormätningar av position på skärmen! Det visar sig vara en enkel och elegant lösning.
Scratch kan du placera sprites på skärmen med kartesiska koordinater. X-position mellan-240 och 240 och y-position är mellan-180 och 180. Om vi multiplicerar x och y accelerometer värden av detta spänner det kommer att positionera sprite enligt hur sensorn vinklas.
I praktisk tillämpning, det fanns en extra några detaljer. Om du ser det Scratch kodavsnittet, det finns en gräns på 1.1:
om 1.1 > abs få AccelY värde sedan
om 1.1 > abs få AccelX värde sedan
[glide spriten mot den nya positionen]
annat
[inte]
annat
[inte]
Detta beror på att om du flyttar accelerometern snabbt, till exempel genom att skaka det, acceleration kommer att gå längre än 1 g (eller -1 g) och göra spriten försöker flytta bort skärm. Så denna gräns ignorerar alla värden större än 1.1. Funktionen "abs" är absolut värde, vilket innebär att om acceleration går högre än 1 eller lägre än -1.
En annan praktisk detalj är på det sätt grunden rör sprites. Funktionen Glide berättar sprite glider mot en viss plats med en viss hastighet. Vi fick spela med ränta, och hittade 9 sekunder att arbeta. Du kan ändra detta naturligtvis och se hur det reagerar.
Känn dig fri att experimentera med värden! Det är intressant hur förslaget ändras.
Vad gäller z data? Normalt när du håller PocketLab som en controller och luta och tillbaka, z data också stannar i det intervallet från 0 till 1. Vi kom upp med idén att vända sensorn över, där z skulle gå under 0, när du ville skjuta en projektil.
Om du går igenom x och y kod och siffra som rörelse ut, z-riktningen ska vara lätt att förstå, och koden för att skjuta är på sidan bollen sprite.