Noțiuni de bază cu Crafty Loop joc

Până în acest moment în această serie, ați învățat cum să manipulați diferite entități și să folosiți tastatura pentru a le muta în jurul lor. În această parte, veți învăța cum să folosiți buclă de joc în Crafty pentru a verifica în permanență diverse evenimente și a anima diferite entități.

Buclele jocului Crafty sunt implementate în Crafty.timer.step, care utilizează evenimentele globale pentru a comunica cu restul motoarelor. Bucla este condusă de requestAnimationFrame atunci când este disponibilă. Fiecare buclă este formată din unul sau mai multe apeluri către EnterFrame eveniment și un singur apel către RenderScene care are ca rezultat redesenarea fiecărui strat. 

Valoarea finală a tuturor proprietăților și variabilelor este rezolvată înainte de redarea unei scene. De exemplu, dacă mutați jucătorul cu 5 px la dreapta de zece ori în interiorul unui singur EnterFrame eveniment, va fi desenat direct 50 de pixeli spre dreapta, sărind peste toate desenele intermediare.

EnterFrame și RenderScene

Totul din jocul pe care trebuie să îl schimbe în timp este în cele din urmă legat de EnterFrame eveniment. Puteți utiliza funcția .lega() metodă de a lega entități diferite de acest eveniment. Funcțiile legate de acest eveniment sunt, de asemenea, transmise unui obiect cu proprietăți precum dt care determină numărul de milisecunde care au trecut de la ultima EnterFrame eveniment. 

Puteți utiliza funcția dt de proprietate pentru a oferi o experienta buna de joc prin determinarea cat de departe stadiul jocului ar trebui sa avanseze.

RenderScene evenimentul este folosit pentru a vă asigura că tot ceea ce este vizibil pe ecran se potrivește cel mai mult cu starea actuală a jocului EnterFrame eveniment. În mod normal, nu va trebui să vă obligați singur acest eveniment dacă nu vă decideți să implementați propriul layer de randare personalizat.

Folosirea Tween pentru animarea proprietăților 2D

Puteți utiliza funcția Tween atunci când doriți doar să animați proprietățile 2D ale unei entități pe o anumită perioadă de timp. Puteți anima X, y, w, h, rotație, și alfa proprietăți utilizând această componentă. Să animăm valoarea x și înălțimea cutiilor portocalii și negre pe care le-ați creat în ultimele două tutoriale. 

Iată codul de care aveți nevoie:

BlackBox.tween (x: 500, 3000); orangeBox.tween (x: 50, h: 100, rotație: 360, 3000);

Probabil ați observat că cutia portocalie nu se rotește în jurul centrului, ci în colțul din stânga sus. Puteți schimba centrul de rotație utilizând butonul .origine() metodă. Poate accepta două argumente întregi, care determină decalajul de origine a pixelilor în axele x și y. 

De asemenea, acceptă o valoare de șir ca argument. Valoarea șirului poate fi o combinație de centru, de sus, de jos, de mijloc, de stânga și de dreapta. De exemplu, .origine ( „centru“) va roti entitatea în jurul centrului și .origine ("partea din dreapta jos") va roti entitatea în jurul colțului din dreapta jos. 

Puteți întrerupe sau relua toate tweens-urile asociate cu o entitate dată folosind .pauseTweens () și .resumeTweens () metode. În mod similar, puteți utiliza, de asemenea .cancelTween () pentru a anula o anumită modificare.

Înțelegerea timerului Crafty

Crafty.timer obiect mânere toate ticks joc în Crafty. Puteți utiliza funcția .FPS () cu acest obiect pentru a obține rata țintă a cadrelor. Rețineți că nu este rata efectivă a cadrelor.

De asemenea, puteți utiliza funcția .simulateFrames (Număr cadre [Număr timestep]) pentru a avansa starea jocului printr-un anumit număr de cadre. timestep este durata de trecere a fiecărui cadru. Dacă nu este specificat, se folosește o valoare implicită de 20ms.

O altă metodă utilă este .Etapa(), care va avansa jocul prin efectuarea unui pas. Un singur pas poate fi format dintr-unul sau mai multe cadre urmate de o randare. Numărul de cadre va depinde de cronometrele steptype. Această metodă declanșează o varietate de evenimente, cum ar fi EnterFrame și ExitFrame  pentru fiecare cadru și prerender, RenderScene, și PostRender evenimente pentru fiecare randare.

Există trei moduri diferite de steptypefix, variabil, și semiregide. În fix mod, fiecare cadru din Craft este trimis la aceeași valoare dt. Totuși, asta steptype poate declanșa mai multe cadre înainte de fiecare randare pentru a atinge viteza țintă a jocului. 

De asemenea, puteți declanșa un singur cadru înaintea fiecărei randări utilizând butonul variabil Mod. În acest caz, valoarea lui dt este egal cu timpul efectiv scurs de la ultimul cadru. 

În cele din urmă, semiregide modul declanșează mai multe cadre pe randare, iar timpul de la ultimul cadru este egal împărțit între ele.

Crearea unui joc foarte de bază

Dacă ați citit toate tutorialele din această serie, ar fi trebuit să dobândiți suficiente cunoștințe până acum pentru a crea un joc foarte simplu. În această secțiune, veți învăța cum să puneți tot ce ați învățat să utilizați și să creați un joc în care jucătorul principal trebuie să mănânce o bucată de mâncare. 

Mâncarea va fi un pătrat roșu rotativ. De îndată ce mâncarea intră în contact cu jucătorul, acesta dispare din vechea locație și provoacă o nouă locație aleatorie. Playerul poate fi mutat folosind A, W, S, D sau tastele săgeată.

Un alt lucru pe care trebuie să-l ocupați este poziția jucătorului. Se presupune că rămâne cu limitele scenei jocului.

Să scriem mai întâi codul pentru alimente:

var foodBox = Crafty.e ("2D, Canvas, Culoare, Alimente") .attr (x: 150, y: 250, w: 15, h: 15) .color ") .bind (funcția" EnterFrame ", eventData) this.rotation + = 4;);

În mod implicit, Crafty ar fi folosit colțul din stânga sus al entității alimentare pentru al roti. Setarea originii în centru vă asigură că entitatea alimentară se rotește în jurul centrului.

var jucătorBox = Crafty.e ("2D, Canvas, Color, Fourway, Coliziune") .attr (x: 50, y: 360, w: 50, 200) .bind (funcția "EnterFrame", 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;  dacă (this.y> (stageHeight - this.h)) this.y = stageHeight - this.h; );

Entitatea jucătorului verifică locația curentă a playerului în fiecare cadru și resetează locația dacă jucătorul încearcă să meargă în afara etapei de joc.

Puteți utiliza a Text entitate pentru a urmări scorul. Scorul este afișat în colțul din stânga sus. gameScore variabila stochează numărul de repetări pe care playerul le lovește entității alimentare.

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

Acum, trebuie doar să scrieți codul pentru a muta mâncarea într-o altă locație atunci când este detectată o lovitură. Următorul cod va face exact acest lucru.

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

Trebuie să țineți cont de faptul că scădeți lățimea și înălțimea entității dvs. alimentare din lățimea și înălțimea etapei. Acest lucru vă asigură că mâncarea este întotdeauna complet în interiorul scenei. Aici este un demo al jocului:

Gândurile finale

Cu ajutorul lui Crafty, ați creat un joc foarte simplu, scriind câteva rânduri de cod. Chiar acum, jocul nu are câteva caracteristici care ar putea face mai interesant. În primul rând, nu există sunete. În al doilea rând, nu există nicio cale de ieșire a jucătorului, iar nivelul de dificultate rămâne, de asemenea, același pe tot parcursul jocului. Veți învăța despre sunet, sprites, evenimente de mouse și alte caracteristici ale bibliotecii în seria următoare.

Dacă ați avut probleme sau îndoieli în timp ce treceți prin toate exemplele din serie, anunțați-ne în comentarii.