Komme i gang med Crafty The Game Loop

Opp til dette punktet i denne serien har du lært å manipulere forskjellige enheter og bruke tastaturet til å flytte dem rundt. I denne delen lærer du hvordan du bruker spillsløyfen i Crafty til å kontinuerlig sjekke for ulike hendelser og animere forskjellige enheter.

Spillsløyfen i Crafty er implementert i Crafty.timer.step, som bruker globale hendelser til å kommunisere med resten av motoren. Sløyfen drives av requestAnimationFrame når den er tilgjengelig. Hver sløyfe består av ett eller flere anrop til enterframe arrangement og en enkelt samtale til RenderScene som resulterer i omlegging av hvert lag. 

Den endelige verdien av alle egenskapene og variablene er løst før en scene blir gjengitt. For eksempel, hvis du flytter spilleren 5 px til høyre ti ganger i en enkelt enterframe arrangement, blir det direkte tegnet 50 px til høyre ved å hoppe over alle mellomliggende tegninger.

EnterFrame and RenderScene

Alt i spillet ditt som må endres over tid, er i siste instans knyttet til enterframe begivenhet. Du kan bruke .binde() metode for å binde forskjellige enheter til denne hendelsen. Funksjoner som er bundet til dette arrangementet, sendes også et objekt med egenskaper som dt som bestemmer antall millisekunder som har gått siden sist enterframe begivenhet. 

Du kan bruke dt eiendom for å gi en jevn spillopplevelse ved å bestemme hvor langt spilltilstanden skal gå videre.

De RenderScene Hendelsen brukes til å sørge for at alt som er synlig på skjermen, stemmer overens med dagens tilstand av spillet enterframe begivenhet. Normalt trenger du ikke å binde denne hendelsen selv, med mindre du bestemmer deg for å implementere ditt eget tilpassede gjengelag.

Bruke Tween til å animere 2D egenskaper

Du kan bruke Tween komponent når du bare vil animere 2D-egenskapene til et foretak over en bestemt tidsperiode. Du kan animere x, y, w, h, rotasjon, og alfa egenskaper som bruker denne komponenten. La oss animere x-verdien og høyden til oransje og svarte boksene du har opprettet i de to siste opplæringsprogrammene. 

Her er koden du trenger:

blackbox.tween (x: 500, 3000); orangeBox.tween (x: 50, h: 100, rotasjon: 360, 3000);

Du har sikkert lagt merke til at oransje boksen ikke roterer rundt sentrum, men øverst til venstre. Du kan endre rotasjonssenteret ved å bruke .opprinnelse() metode. Den kan akseptere to heltallargumenter, som bestemmer opprinnelse av pikselforskjell i x- og y-aksene. 

Det aksepterer også en strengverdi som argument. Strengverdien kan være en kombinasjon av senter, topp, bunn, midten, venstre og høyre. For eksempel, .opprinnelse ( "center") vil rotere enheten rundt sentrum, og .opprinnelse ("nederst til høyre") vil rotere enheten rundt nederst til høyre. 

Du kan sette pause eller gjenoppta alle tweens tilknyttet en gitt enhet ved hjelp av .pauseTweens () og .resumeTweens () metoder. På samme måte kan du også bruke .cancelTween () å avbryte en bestemt tween.

Forstå den gode timeren

De Crafty.timer objektet håndterer alle spillflåttene i Crafty. Du kan bruke .FPS () Metode med dette objektet for å få målrammen. Husk at det ikke er den faktiske bildesatsen.

Du kan også bruke .simulateFrames (nummer rammer [, Antall tidstrinn]) metode for å fremme spilltilstanden med et gitt antall rammer. De timestep er varigheten å passere hver ramme. Hvis det ikke er angitt, brukes en standardverdi på 20 ms.

En annen nyttig metode er .skritt(), som vil fremme spillet ved å utføre et trinn. Et enkelt trinn kan bestå av en eller flere rammer etterfulgt av en gjengivelse. Antallet rammer vil avhenge av timeren steptype. Denne metoden utløser en rekke hendelser som enterframe og ExitFrame  for hver ramme og prerender, RenderScene, og PostRender hendelser for hver gjengivelse.

Det er tre forskjellige moduser av steptypefast, variabel, og semifixed. I fast modus, blir hver ramme i Crafty sendt til samme verdi av dt. Men dette steptype kan utløse flere rammer før hver gjengivelse for å oppnå målspillets hastighet. 

Du kan også utløse bare en ramme før hver gjengivelse ved å bruke variabel modus. I dette tilfellet er verdien av dt er lik den faktiske tiden som er gått siden den siste rammen. 

Endelig, den semifixed modus utløser flere rammer per gjengivelse, og tiden siden siste ramme er like delt mellom dem.

Opprette et veldig grunnleggende spill

Hvis du har lest alle opplæringsprogrammene i denne serien, bør du ha fått nok kunnskap nå for å skape et veldig grunnleggende spill. I denne delen lærer du hvordan du legger alt du lærte å bruke og skape et spill hvor hovedspilleren må spise et stykke mat. 

Maten vil være et roterende rødt firkant. Så snart maten kommer i kontakt med spilleren, forsvinner den fra det gamle stedet og gyter på et nytt tilfeldig sted. Spilleren kan flyttes med A, W, S, D, eller piltastene.

En ting du må ta vare på, er spillerenes posisjon. Det er ment å være med grensene til spillfasen.

La oss skrive koden for maten først:

var foodBox = Crafty.e ("2D, Lerret, Farge, Mat") .attr (x: 150, y: 250, w: 15, h: 15) .color ("rød") .origin ") .bind (" EnterFrame ", funksjon (eventData) this.rotation + = 4;);

Som standard ville Crafty ha brukt øverste venstre hjørne av matenheten til å rotere den. Innstilling av opprinnelse til senter sørger for at matenheten roterer rundt senteret.

var playerBox = Crafty.e ("2D, Lerret, Farge, Fourway, Kollisjon") .attr (x: 50, y: 360, w: 50, h: 50) .color ("svart") .fourway 200) .bind ("EnterFrame", funksjon (eventData) if (this.x < 0)  this.x = 0;  if(this.y < 0)  this.y = 0;  if(this.x > (stageWidth - this.w)) this.x = stageWidth - this.w;  hvis (this.y> (sceneHeight - this.h)) this.y = stageHeight - this.h; );

Spillerenheten kontrollerer gjeldende plassering av spilleren i hver ramme og tilbakestiller posisjonen hvis spilleren prøver å gå utenfor spillfasen.

Du kan bruke en Tekst enhet for å holde oversikt over poengsummen. Poengsummen er vist øverst til venstre. De gameScore variabel lagrer antall ganger spilleren treffer matenheten.

var scoreText = Crafty.e ('2D, DOM, Text') .attr (x: 10, y: 10) .textFont (size: '25px'); scoreText.text (gameScore.toString ());

Nå må du bare skrive koden for å flytte maten til et annet sted når et treff er oppdaget. Følgende kode vil gjøre akkurat det.

playerBox.checkHits ("Food"). bind ("HitOn", funksjon (hitData) foodBox.x = Math.random () * (stageWidth - foodBox.w); foodBox.y = Math.random () * (stageHeight - foodBox.h); gameScore + = 1; scoreText.text (gameScore.toString ()););

Du må huske på at du trekker bredden og høyden av matenheten fra scenens bredde og høyde henholdsvis. Dette sørger for at maten alltid er helt inne i scenen. Her er en demonstrasjon av spillet:

Siste tanker

Med hjelp av Crafty har du laget et veldig grunnleggende spill ved å skrive noen linjer med kode. For øyeblikket mangler spillet noen få funksjoner som kan gjøre det mer interessant. For det første er det ingen lyder. For det andre er det ingen måte for spilleren å komme seg ut, og vanskelighetsgraden forblir også den samme gjennom hele spillet. Du vil lære om lyd, sprites, musevents og andre funksjoner i biblioteket i neste serie.

Hvis du hadde noen problemer eller tvil mens du går gjennom alle eksemplene i serien, gi meg beskjed i kommentarene.