Legg til Motion Control til et Kiwi.js-spill med Leap Motion Controller

I denne veiledningen hjelper jeg deg med å lage ditt første HTML5-spill som styres av en Leap Motion Controller, ved hjelp av Kiwi.js-motoren. (Hvis du ikke har hørt om det, er Kiwi.js en relativt ny spillmotor som retter seg mot HTML5, WebGL og JavaScript.)

Etter å ha hørt om Leap Motion Controller visste jeg at jeg måtte ta hendene på en. Det er en maskinvare sensor enhet som støtter hånd og finger bevegelser som input, krever ingen håndkontakt eller berøring. 

Jeg så dette som en ny grense til spill ennå ikke fullstendig utforsket. Hvordan kunne jeg passere på en mulighet denne spennende? Etter at min kontroller ankom, og jeg hadde tilbrakt de neste dagene med alle appene på Airspace-butikken, bestemte jeg meg for at jeg ville ta det videre og lage mine egne spill med det.

Gjør seg klar

For å følge denne opplæringen trenger du en tekstredigerer og en nettleser. Jeg bruker Sublime Text 2, og jeg foretrekker Google Chrome for sine omfattende utviklerverktøy, men arbeidsflyten vil være stort sett den samme med hvilken tekstredigerer og nettleser du velger.

Du skal også ha en kopi av Kiwi.js, Kiwi.js Leap Motion Controller Plugin og en Leap Motion Controller. For å hjelpe oss med å komme i gang bruker vi et Kiwi.js-spill blåkopi; Blueprints er maler som fremskynder spillopprettelsen ved å inkludere alt det opprinnelige, ikke-spillspesifikke oppsettet (for eksempel å lage mappestrukturer). Du bør laste ned Komme i gang-tegningen fra Kiwi.JS-siden.

Når du har lastet ned planen, bør du kunne navigere til plugin-mappen som ligger i den. Når du er der, må du pakke ut Leap Motion Controller-pluginet til plugins mappe.

Laster eiendeler inn i spillet

I Komme i gangsblåkopien merker du det inne i stater mappe, plassert inne i src mappe, det er tre JavaScript-filer. Disse inneholder hoveddelen stater at vi må løpe dette bestemte Kiwi.js spillet. 

EN Stat i Kiwi.js er hovedklassen vi bruker når vi ønsker å lage et spill. Stater er vant til å holde forskjellige deler av et spill skilt; et enkelt spill kan bestå av mange forskjellige stater. Dette betyr at vi bare kan ha en enkelt stat aktiv på et gitt tidspunkt.

Tegningen har skilt Kiwi.js spillet i tre stater for oss: Lastingstaten, Intro-staten og Play State.

Inne i lastetilstanden, må vi laste våre eiendeler inn i spillet. Siden vi gjør et grunnleggende spill å starte med vil ikke vil laste mange eiendeler. Spillet vi skal lage, vil bare gi visuell tilbakemelding om stillingen av din hånd og fingre, representert ved prikker.

For dette eksempelet bruker vi de to ressursene nedenfor. (Ikke bekymre deg, denne grafikken er ikke ment å være pen!)

    

Den grønne prikken vil bli brukt til å vise posisjonen til din hånd i spillet, og den røde prikken vil bli brukt til å vise posisjonen til hver finger, så jeg har kalt dem hand.png og finger.png, henholdsvis. Lagre dem under disse navnene i img mappe inne i eiendeler mappe.

For å laste disse eiendelene inn i spillet må du legge dem til spillets cache via forbelastning () Metode av LoadingState, som finnes i States mappe, i filen som heter loading.js, som så:

GettingStarted.Loading.preload = funksjon () KiwiLoadingScreen.prototype.preload.call (dette); this.addImage ('hånd', 'assets / img / finger.png'); this.addImage ('finger', 'assets / img / hand.png'); ;

Å gjøre dette betyr at vi vil kunne få tilgang til og bruke bildene fra andre stater i spillet, så la oss begynne å bruke dem.

Å skape objekter for kontrolleren og kjendiser

For å aktivere Kiwi.js-spillet til å bruke Leap Motion Controller, må du opprette en kontrollerobjekt fra Leap Controller plugin. 

Først må vi inkludere Leap Controller Scripts i index.html fil, slik som:

 

For det andre må vi sørge for at Spill objektet vet at vi bruker Plugin Controller plugin. 

De Spill objekt er motoren til et Kiwi.js-spill; den håndterer initialiseringen av alle de forskjellige individuelle spillledere. Å la Spill vet at vi vil at den skal bruke Leap Motion Controller-pluginet, vi må redigere spillalternativene. Dette kan gjøres ved å legge til en linje med kode inne i game.js fil som ligger inne i src mappe:

var gameOptions = renderer: Kiwi.RENDERER_WEBGL, plugins: ['LeapMotion'], // Legg denne linjen med kodebredde: 800, høyde: 600

Nå er vi klare til å lage vårt kontrollobjekt, ved å ringe følgende linje inne i i det() metode av Spille Stat, som du finner i stater mappe inne i play.js fil. Du vil legge merke til at staten ennå ikke har a i det() metode, så du må legge til dette. For enkelhets skyld kaller vi Leap Controller-objektet styre:

GettingStarted.Play.init = funksjon () this.control = Kiwi.Plugins.LEAPController.createController (); 

Deretter skal vi lage sprites som vi kan bruke til å vise posisjonen til vår hånd og fingre i spillet-en "hånd" -sprit og fem "finger" sprites, spesielt. For å gjøre dette, bare opprett en Kiwi.GameObject.Sprite og legg det til staten Det beste stedet å gjøre dette er i skape metode av staten. 

I denne utgaven lager vi sprites og legger dem til scenen, og lagrer dem i fingrene:

GettingStarted.Play.create = function () this.hand = nye Kiwi.GameObjects.Sprite (dette, dette.textures ['hånd'], 0, 0); this.addChild (this.hand); this.fingers = []; for (var i = 0; i <= 5; i++)  var temp = new Kiwi.GameObjects.Sprite(this, this.textures['finger'], 0, 0); this.addChild(temp); this.fingers.push(temp); ; 

Bruke Leap Motion Controller Object

Når spillet har forhåndslastet sine eiendeler og blitt opprettet, vil Spille Statens oppdateringsløkke begynner å løpe. Dette er hvor alle de morsomme tingene du lager, vil skje! 

I dette tilfellet skal vi flytte spritesne som vi nettopp har opprettet til stillingene til deres tilsvarende hånd og fingre, som oppdaget av Leap Motion Controller. Dette kan gjøres enkelt ved å få tilgang til forskjellige egenskaper av Leap Controller-objektet:

  • hender [0] .posX og hender [0] .posY vil gi deg x- og y-koordinatene, i vertikalplanet parallelt med Leap Motion Controller, av den første hånden som kontrolleren oppdager.
  • hender [0] .pointables [n] .tipX og hender [0] .pointables [n] .tipY vil gi deg x- og y-koordinatene, i samme rom, av spissen av den nte fingeren på den hånden.

I følgende utdrag vil du se at jeg har sentrert posisjonen til hånden og fingrene ved å flytte x-stillingen over halvparten av scenens bredde, reversere y-posisjonen og legge scenens høyde til y- stilling:

GettingStarted.Play.update = funksjon () Kiwi.State.prototype.update.call (dette); this.hand.x = this.control.hands [0] .posX + (game.stage.width * 0.5); this.hand.y = -this.control.hands [0] .posY + (game.stage.height); for (var jeg = this.fingers.length - 1; i> = 0; i--) this.fingers [i] .x = this.control.hands [0] .pointables [i] .tipX; this.fingers [i] .x + = game.stage.width * 0,5; this.fingers [i] .y = -this.control.hands [0] .pointables [i] .tipY; this.fingers [i] .y + = game.stage.height; ; ;

Sjekk ut eksemplet nedenfor for å se hva vi har gjort!

Med eksemplet ovenfor kan du begynne å se hvor raskt og nøyaktig Leap Motion Controller er med Kiwi.js. Med Leap Motion Controller sporingskapasitet kan du også raskt se hvordan du klarer å håndtere flere interaksjoner med bare en hånd.

Nedenfor er en liste eller verdier som pluggen for Leap Motion Controller sporer for Kiwi.js:

  • Aktive fingre: Dette angir hvor mange fingre kontrolleren kan oppdage. Det kan bli funnet via pointables.active eiendom.
  • Aktive hender: Dette indikerer det nåværende antall hender som kontrolleren kan oppdage. Det kan bli funnet med hands.active eiendom.
  • Den nåværende håndens x-, y- og z-koordinater, i forhold til kontrolleren. Dette kan gjøres ved å få tilgang til POSX, Posy, og posZ verdier av håndobjektet, som vi har sett.
  • Orienteringen av hånden: rullen, banen og gaten. Disse blir tatt fra den normale vektoren av håndflaten, det vil si vektoren som peker utover fra palmens overflate.

Dette er også på tide å se området der Leap Motion-kontrolleren kan spore hånden din. Du vil legge merke til at kontrolleren har begrensninger for det sporing av rekkevidde, som vist ved bildet nedenfor. 

Så du tenker nok, "Hva skjer når hånden min forlater dette spekteret?" Vel, Leap Controller oppdager øyeblikkelig at hånden din ikke lenger er synlig og setter aktiv Egenskapen til hånden til falsk. Det lagrer også alle dataene fra den siste kjente posisjonen til hånden din til hånden din blir synlig igjen.

Går et skritt videre

Så langt har vi bare laget en grunnleggende demo, som kan være kult å eksperimentere med, men det er ikke så morsomt. Deretter la oss lage et faktisk spill som vist nedenfor:


Bruk hendene dine til å flytte tegnet.

Laster inn eiendeler

I dette spillet vil vi animere noen sprites. Jeg har laget et "FlappyNyan" sprite-ark som jeg vil bruke til denne opplæringen, sammen med noen fargede blokker som vil bli brukt til fargesporet som FlappyNyan etterlater seg. Du er velkommen til å bruke disse eiendelene. Bare ta dem fra opplæringen GitHub repo.

Opprette klasser

Istedenfor å bruke standarden Sprite GameObject, Vi vil ønske å lage en ny klasse som strekker seg Sprite. Formålet med denne klassen er å bidra til å skape kattens fargespor. Hvis du vil fortsette spillet ditt, kan du implementere arkadfysikk inn i klassen, slik at det blir enkelt å kollisjonere og gi tilgang til egenskaper som hastighet og akselerasjon.

For å opprette en klasse må du opprette en egen JS-fil i enheter mappe; kall det Nyan.js. Du må også inkludere dette skriptet i din index.html fil, på samme måte som plugin-skriptene:

Innenfor denne filen, opprett en FlappyNyan klassen som har en animasjon på seks rammer:

var FlappyNyan = funksjon (tilstand, x, y) Kiwi.GameObjects.Sprite.call (dette, state, state.textures ['FlappyNyanCat'], x, y); this.state = state; this.animation.add ('walk', [0, 1, 2, 3, 4, 5], 0,1, true); this.animation.play ( 'gange'); FlappyNyan.prototype.update = function () Kiwi.GameObjects.Sprite.prototype.update.call (dette);  Kiwi.extend (FlappyNyan, Kiwi.GameObjects.Sprite);

Deretter ønsker vi å lage FlappyNyans sti. For å gjøre dette vil vi kontinuerlig gyte bokser som vil se ut som FlappyNyan alltid etterlater seg: en strålende regnbue av farge. 

For dette har jeg opprettet en annen klasse, kalt MovingBox. Denne klassen oppretter bare en boks med en bestemt farge, beveger seg til venstre til den er utenfor skjermen, og fjerner seg fra spillet:

var MovingBox = funksjon (tilstand, x, y, tekstur) Kiwi.GameObjects.StaticImage.call (dette, tilstand, state.textures [tekstur], x, y, false); this.physics = this.components.add (nye Kiwi.Components.ArcadePhysics (dette, denne boksen)); this.xVelo = -200; this.yVelo = 0; this.physics.velocity.x = this.xVelo; this.physics.velocity.y = this.yVelo; MovingBox.prototype.update = function () Kiwi.GameObjects.StaticImage.prototype.update.call (dette); this.physics.update (); hvis (this.x < -50)  this.destroy();    Kiwi.extend(MovingBox,Kiwi.GameObjects.StaticImage); 

Husk å inkludere MovingBox klasse i index.html side.

Bruke klasser

Nå lurer du kanskje på hvordan du bruker disse boksene - la oss takle det neste. Disse boksene som følger FlappyNyan vil representere antall aktive fingre (det vil si fingre som Leap Motion Controller kan se).

Siden vi vil at boksene skal følge FlappyNyan objekt, vil vi lage en metode for å gyte disse boksene i FlappyNyan klasse.

For å gjøre dette, alt du trenger å gjøre er å legge denne metoden til FlappyNyan klasse:

FlappyNyan.prototype.spawnBoxes = funksjon (ett, to, tre, fire, fem) if (one) this.state.streamerGroup.addChild (new MovingBox (this.state, this.x, this.y + 05, ' yellowbox '));  hvis (to) this.state.streamerGroup.addChild (new MovingBox (this.state, this.x, this.y + 15, 'orangeBox'));  hvis (tre) this.state.streamerGroup.addChild (ny MovingBox (this.state, this.x, this.y + 25, 'greenBox'));  hvis (fire) this.state.streamerGroup.addChild (ny MovingBox (this.state, this.x, this.y + 35, 'pinkBox'));  hvis (fem) this.state.streamerGroup.addChild (ny MovingBox (this.state, this.x, this.y + 45, 'blueBox')); 

Siden vi vil lage disse boksene hver ramme, legger du til gytemetoden til oppdateringssløyfen til FlappyNyan klasse:

this.spawnBoxes (this.state.control.hands [0] .pointables [0] .active, this.state.control.hands [0] .pointables [1] .active, this.state.control.hands [0] .pointables [2] .active, this.state.control.hands [0] .pointables [3] .active, this.state.control.hands [0] .pointables [4] .active);

Nå som vi har satt opp de to klassene vi trenger, er alt vi trenger å gjøre nå, skape a FlappyNyan objekt i Skape() metode av Spille Stat, og legg til en Kiwi.Group å lagre boksene i, legg deretter til disse på scenen. 

this.streamerGroup = ny Kiwi.Group (dette); this.addChild (this.streamerGroup); this.flappyNyan = new flappyNyan (dette, 100, 100); this.addChild (this.flappyNyan);

Når dette er gjort, vil vi oppdatere sin posisjon, akkurat som vi har gjort for håndobjektet i forrige spill.

this.flappyNyan.x = this.control.hands [0] .posX + game.stage.width * 0,5; this.flappyNyan.y = -this.control.hands [0] .posY + game.stage.height;

Og det er det! Du bør nå ha et spill hvor du styrer en FlappyNyan! 

Har du spørsmål, kan du spørre. Du finner all kildekoden og eiendelene i opplæringen GitHub repo.