Cum motoarele de țiglă simplifică procesul de proiectare a jocului și cum se aplică la diferite tipuri de jocuri.
Am gasit acest autor minunat datorita FlashGameLicense.com, locul unde puteti cumpara si vinde jocuri Flash!
Să aruncăm o privire asupra rezultatului final pe care îl vom strădui:
Mutați mouse-ul pentru a face mic patrat merge spre el, și faceți clic pentru a face să sari. Apăsați spațiu pentru a schimba țiglă în prezent sub cursor.
Cea mai simplă modalitate de a descrie plăcile este să vă arătați imagini din jocuri care le-au folosit în trecut. Aceasta este o porțiune dintr-o captură de ecran de la The Legend of Zelda:
Când te uiți la jocurile mai vechi, poți vedea că o mulțime de artă din joc este reutilizată. Același copac apare de două ori, aceleași roci apar de două ori, iar iarba sălbatică este de trei ori pe ecran, iar gardul este văzut de patru ori. Și toată arta este perfect aliniată la o rețea. Fiecare dintre patratele mici din grilă pe care le-am desenat peste această captură de ecran este o faianță.
În loc să facă fiecare nivel individual de la zero, cei care au proiectat Legenda lui Zelda au decis să pună jocul pe o rețea. Apoi, au atașat arta premade acelei grile. Această metodă are multe beneficii în designul jocurilor.
Majoritatea începătorilor care utilizează Flash nu știu prea multe despre metodele bazate pe dale și ce beneficii le dau designerilor. Multe jocuri Flash aflate astăzi utilizează o metodă bazată pe artă. Desenează fiecare fundal și obiect manual, ceea ce poate dura mult timp. Apoi hitTest ()
funcțiile din Flash sunt utilizate pentru detectarea coliziunilor. Nu este nimic greșit în mod inerent în a face acest lucru, dar în multe situații, țiglele trumpesc metoda bazată pe artă.
Așa cum am spus anterior, desenarea lucrurilor de mai multe ori poate dura mult timp. Placile vă permit să construiți rapid nivele și aceștia iau o parte din designul nivelului de la cei care proiectează arta pentru joc. Placile au, de asemenea, capacitatea de a creste viteza jocului. hitTest ()
metoda nu este foarte eficientă. Verifică să se asigure că vectorii a două obiecte nu se ating, iar detectarea coliziunilor în acest fel durează mult timp. Unul sau două hitTest-uri nu vă vor încetini jocul, dar atunci când aveți nevoie de sute de detectări de coliziune o secundă, metoda plăcii este mult mai rapidă. Cu plăci trebuie doar să verificați punctele de pe o rețea. Acest lucru este mai puțin precis (nu mai verificați pixelii individuali sau liniile formelor unul împotriva celuilalt), dar în multe situații verificarea coliziunilor împotriva unei rețele funcționează foarte bine.
Arhivele sunt obiecte destul de simple în Actionscript. Să începem prin a face clasa noastră de documente (care va fi numită Principal) și crearea unei matrice 2D.
pachet import flash.display.Sprite; import flash.display.MovieClip; public class Main extinde MovieClip public var gameLay: Array = [[1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0, 0,0,1], [1,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,1,0,0,0,1] , [1,1,1,1,1,1,1,1,1,1]] funcția publică Principal (): void if (etapa) init (); altfel addEventListener (Event.ADDED_TO_STAGE, init); funcția privată init (e: Event = null): void
(Dacă nu sunteți sigur cum să utilizați o clasă de documente, consultați această prezentare rapidă a acestora. De asemenea, ar trebui să aruncați o privire la AS3 101: Arrays ale lui Dru Kepple, dacă aveți nevoie de o idee mai clară despre ceea ce reprezintă matricea.)
Noi folosim init ()
pentru a vă asigura că constructorul nu se execută înainte ca instanța să fie clasată în document. Tocmai am găsit că este o formă bună când codifică.
În timp ce o matrice 1D este doar o linie de date, o matrice 2D este o matrice care conține mai multe matrice. Acest lucru ne permite să facem gameLay "harta" noastră. Când vom începe să generăm plăci pe ecran, ele vor apărea în felul acesta gameLay arată.
Matricea 2D va fi harta noastră. Dar acum, hărțile noastre au doar două numere în ea: 1 și 0. Când începem să generăm imagini vizuale, 1 va deveni sol solid (pătrate negre în demo-ul de mai sus) și 0 va fi spațiu gol. Pentru acest tutorial, trebuie doar să avem trei numere diferite pentru a vorbi despre teren. (Solid, gol și noi vom introduce o treime mai târziu pentru a stoca poziția jucătorului.) Dacă ne întoarcem și ne uităm la captura de ecran Zelda, puteți vedea că trebuie să fie cel puțin 10+ plăci în acel singur ecran.
Acum, soluția evidentă ar fi să adăugați mai multe numere, dar mai sunt multe lucruri de gândit. În general, în jocul Zelda, trebuie să existe cel puțin 100 mai multe plăci decât cele afișate pe ecran la un moment dat. Ce fac designerii profesioniști este decizia de a schimba modul în care sunt interpretate datele, mai degrabă având date unice pentru fiecare obiect. Se schimbă tilesets mai degrabă decât schimbarea fiecărei plăci - astfel încât un 7 ar putea însemna iarba într-o zonă a jocului, iar apa în altă parte. Nu vom trece prea mult în acest moment, dar trebuie să ne gândim.
Deschideți Flash și porniți un nou document AS3 - asigurați-vă că clasa de documente este setată la Principal. De asemenea, asigurați-vă că FLA și clasa sunt în același folder. Dar trebuie să știți ceva înainte de a începe acest tutorial.
Bine, documentul dvs. ar trebui să fie de 600x300. Când ne uităm înapoi, gameLay care acționează ca "harta" noastră este de 10x5. Dacă dorim ca fiecare piesă să fie de aceeași dimensiune și plăcile să umple ecranul în întregime, trebuie să facem fiecare țiglă (600/10) Lățime și (300/5) Înălțime. Deci, 60x60px este cât de mare avem nevoie de fiecare dintre plăcile noastre să fie.
Să facem un pătrat negru mare de 60x60 și să-i dăm un nume de clasă dale (cu un capital T, spre deosebire de captura de ecran). Este important să o orientați spre partea superioară a filmului (vedeți pătratul negru în "Înregistrare"):
După ce faceți MovieClip, asigurați-vă că primul cadru al dale este gol, iar al doilea cadru conține pătratul negru.
Bine, în acest moment avem datele despre hartă de țigle pe care le-am făcut în Pasul 2. Acum trebuie să trecem prin aceste date și să le interpretăm și să scuipăm ceva pe care să-l putem folosi pentru a pune placile pe ecran. Pentru a simplifica, vom construi o funcție care va adăuga dale către ecran pe baza datelor din matrice. Această funcție aparține Principal, clasa de documente:
funcția publică buildLEvel (s: Array) if (getChildByName ("tileHolder")! = null) removeChild (getChildByName ("tileHolder")); var tiles: MovieClip = nouClipClip (); tiles.name = "tileHolder"; pentru (var i = 0; iAm folosit o buclă imbricată pentru a trece prin fiecare element de matrice. Un clip video gol, numit "dale" în cod, dar dat un nume de "tileHolder", este folosit pentru a ține piesele, astfel încât să le putem scoate de pe ecran sau să le mutați cu ușurință. currentTile se adaugă la aceasta gresie clamă. Noi spunem currentTile pentru a merge la cadrul specificat de elementul matricei. Pentru că folosim 0,1 în datele noastre de țiglă, trebuie să adăugăm 1 la numărul din matricea reală pentru a ne asigura că plăcile se opresc la cadrele 1 și 2. Acum, chiar dacă am construit această funcție, avem încă nevoie de să o numești ca să funcționeze.
funcția privată init (e: Event = null): void buildLevel (gameLay);Iată cum ar trebui să arate când o exportăm. Orice modificări pe care le faceți la gameLay () array sunt reflectate în ceea ce se întâmplă atunci când exportați. Dacă am avea mai multe elemente, am putea spune cu ușurință funcția buildLevel pentru a schimba ceea ce ar trebui să se producă pe baza a ceea ce a apărut în matrice.
Găsește-te la modificarea aspectului nivelului prin modificarea matricei de joc.
Pasul 6: Distrugerea graficii țiglelor
În puncte, va trebui să eliminați toate dalele pe ecran. Chiar dacă schimbarea lucrurilor pe ecran nu va schimba datele în sine, trebuie să eliminăm grafica. Pentru că ne-am împachetat grafica în noi gresie clip, le putem elimina ușor. De fapt, funcția de mai sus elimină plăcile în sine.
dacă (getChildByName ("tileHolder")! = null) removeChild (getChildByName ("tileHolder")); var tiles: MovieClip = nouClipClip (); tiles.name = "tileHolder";Acesta este un fragment din buildLevel () funcție pe care ați scris-o deja. am dat gresie numele "tileHolder", deoarece este cel mai ușor mod de ao referi în lista de afișare. buildLevel verifică funcția pentru a vedea dacă există deja o instanță a ecranului "tileHolder" pe ecran și dacă este acolo, îl elimină. Apoi continuă să facă alta gresie clip pentru a ține următoarea rundă de grafică. Am putea să o împărțim în două funcții diferite, una pentru distrugere și una pentru crearea de nivel, dar pentru moment este mai bine să păstrăm lucrurile compacte.
Pasul 7: Creați și exportați grafice Player
Bine, deci avem grafica țiglă în loc și putem schimba datele și să vedem. Dar cum obținem ceva care să interacționeze cu mediul înconjurător? Mai întâi trebuie să facem jucător clamă. Vom face 10x10 și vom exporta cu numele de clasă "player".
Simțiți-vă liber să desenați altceva decât o cutie!
Pasul 7: Crearea clasei de jucători
Trebuie să facem o clasă pentru noi jucător. Vom păstra funcțiile goale pentru moment și vom extinde mai târziu. Dacă arăți că veți vedea că nu am creat un eveniment ENTER_FRAME. Consider că este mai bine să faceți doar un singur ENTER_FRAME și să apelați funcții pe alte obiecte pentru ceea ce dorim să fie ENTER_FRAME.
pachet import flash.events.Event; import flash.display.MovieClip; importul flash.events.MouseEvent; public class player extinde MovieClip public var gameLay: Array = array nou (); public varSpeed: Număr = 0; public var xSpeed: Număr = 5; public var friction: Number = .7; public var grav: Număr = .5; funcția funcției publice (): void if (stage) init (); altfel addEventListener (Event.ADDED_TO_STAGE, init); funcția publică getTile (xs, ys) return gameLay [Math.floor (ys / 60)] [Math.floor (xs / 60)] funcția publică onFrameEnters (): void ) funcția privată init (e: Event = null): void stage.addEventListener (MouseEvent.CLICK, salt);Vom rupe acest lucru în următorii pași.
Pasul 8: Înțelegerea fizicii Platformer
Înainte de a ne face jucător interacționați cu mediul, cred că ar trebui să vedem cum funcționează primul platformer. În majoritatea platformerilor, un jucător sare în sus și apoi coboară. Când ating pământul, își pierd viteza și sunt împinși din pământ. Pentru a ilustra acest lucru cu psuedocode:
în timp ce (player.isCollidingWith (ground)) player.y--; player.ySpeed = 0; ySpeed + = gravitate; // accelerați în jos dacă (player.press (jumpButton)) ySpeed = -10;Este o modalitate simplificată de a vă uita la platformeri, dar vă oferă elementele de bază. Nu am acoperit cu adevărat platformers în acest tutorial, așa că nu merg mai adânc în subiect. Aceasta este tocmai logica de care avem nevoie pentru ca jucătorul nostru să funcționeze.
Pasul 9: Verificarea poziției plăcilor
Deoarece toate elementele vizuale ale jocului nostru se bazează pe matrice, putem folosi matricele pentru a verifica coliziunile, mai degrabă bazându-ne pe funcțiile Flash hitTest. Vom crea o funcție proprie pentru a face față coliziunilor bazate pe datele noastre de țiglă:
funcția publică getTile (xs, ys) retur jocLay [Math.floor (ys / 60)] [Math.floor (xs / 60)]Aceasta este funcția noastră, luată de la jucător clasa, și este într-adevăr atât de simplu. Funcția acceptă doi parametri: xs pentru variabilele x și YS pentru variabilele y. Deoarece piesele noastre sunt de 60x60, dacă împărțim variabilele x și y cu 60 și apoi le rotunjim în jos, obținem "poziția" variabilelor x și y în raport cu matricea. Funcția apoi returnează orice valoare a plăcii este în acea poziție în matrice. Putem folosi această funcție ca și cum am folosi hitTest acum, cu excepția faptului că această funcție este mult mai rapidă și nu se bazează pe vizuale. Să mergem mai departe și să o integrăm în joc.
Pasul 10: Integrarea funcției getTile
Deci acum avem o funcție, getTile, care poate obține valori pentru noi. Și știm că de fiecare dată când 1 apare în matrice că va fi sol solid. Să aruncăm o privire la modul în care arată clasa jucătorilor atunci când integrăm getTile funcția și adăugați fizica platforming.
pachet import flash.events.Event; import flash.display.MovieClip; importul flash.events.MouseEvent; public class player extinde MovieClip public var gameLay: Array = array nou (); public varSpeed: Număr = 0; public var xSpeed: Număr = 5; public var friction: Number = .7; public var grav: Număr = .5; funcția publică getTile (xs, ys) return gameLay [Math.floor (ys / 60)] [Math.floor (xs / 60)] funcția publică onFrameEnters (): void // vom apela în ENTER_FRAME manipulator xSpeed * = frecare; // încetiniți jucătorul în jos din cauza frecarii ySpeed + = grav; // accelerați în jos x + = xSpeed; y + = ySpeed; // aici jucăm jucătorul la stânga sau la dreapta pe poziția mouse-ului dacă (stage.mouseX> x + 10) xSpeed = 6 dacă (stage.mouseXFolosim getTile în zonele în care am putea folosi hitTests. Avem pereți integrați și în motorul platformerului. Aceasta se ocupă de toată fizica platformerului nostru, și trebuie doar să atingem jucător încă o dată. Putem trece matricea jocului la jucător prin clasa de documente.
Pasul 11: Îngrijirea împotriva verificărilor defectuoase
Ce se întâmplă dacă jucătorul iese din zona de joc? Datele tigla sunt de numai 10x5, ceea ce se traduce la dimensiunea ecranului. Dacă noi getTile funcția primește peste 600 sau mai mică de 0 pentru o valoare x, va da o eroare deoarece acea zonă nu există în datele de dale. (601/60) = 10.1111, rotunjdu-l până la 10. Valorile din matrice sunt 0-9, deoarece matricele încep să numere de la 0.
Trebuie să ne asigurăm că oricând ceva nu se află în afara limitelor de joc, va fi înregistrat ca un teren solid. putem face acest lucru cu ușurință prin schimbarea getTile funcţie.
funcția publică getTile (xs, ys) if (ys> 0 && xs> 0 && (gameLay [0] .length) * 60> xs && (gameLay.length) * 60> ys) return playLay [Math.floor ys / 60)] [Math.floor (xs / 60)]; altceva return 1; // plăcile care sunt în afara limitelor sunt tratate ca soluri solideAcest lucru vă asigură că tot ce se află în afara limitelor matricei se va înregistra ca teren solid. Acum ai putea să treci o matrice plină de 0 la player, iar motorul ar fi capabil să se ocupe de el însuși.
Pasul 12: Plasarea caracterului pe ecran
Așa că avem caracterul nostru codificat, dar când îl ținem pe ecran nu face nimic. Acest lucru se datorează faptului că nu am apelat de fapt la niciuna din funcțiile necesare pentru a se muta. Cu toate acestea, putem adăuga un procedeu de gestionare a evenimentului ENTER_FRAME la clasa noastră de documente și folosim acest lucru:
funcția privată init (e: Event = null): void buildLevel (gameLay); addEventListener (Eveniment.ENTER_FRAME, onFrameEnter); var p1: player = player nou (); p1.name = "p1" p1.x = 300 p1.y = 100 p1.gameLay = jocLa; addChild (p1); funcția publică onFrameEnter (e: Event = null): void pentru (var i: int = numChildren-1; i> = 0; i -) ifChildAt (i) )) onFrameEnters (.);Aceasta poate fi o mulțime de a lua, așa că haideți să ne uităm mai întâi la funcția init (). În funcția init (), adăugăm un handler de evenimente pentru ENTER_FRAME care apelează onFrameEnter () funcționează fiecare cadru. În plus, adăugăm playerul în cadru utilizând funcția init () funcţie. Am plasat player-ul în mijlocul ecranului. În plus, facem jocul jocului (care este harta) același cu jocul pe care îl folosește clasa de documente.
În onFrameEnter () funcția, avem o buclă. În buclă, mergem prin fiecare copil în lista de afișare. Fiecare copil din lista de afișare pentru un anumit obiect are un anumit număr de index, bazat pe momentul în care a fost adăugat la scenă și alți factori. Numerele de index pentru copii nu vor depăși niciodată numărul de copii pe care îl are un obiect. Deoarece numerele indexului încep de la 0, ne inițializăm bucla la numChildren-1. Atunci, atunci asigurați-vă că
eu
nu merge sub 0 și continuați cu bucla noastră.Pentru că bifăm prin fiecare copil pe scenă, putem verifica și vedea dacă anumiți copii sunt de o anumită clasă. Apoi, putem apela funcții pe ele, așa cum am făcut pentru jucător. Această metodă poate părea complexă, dar odată ce o înțelegi și o configurezi, salvează o mulțime de resurse de sistem pentru a face mai multe funcții ENTER_FRAME. Dacă am avea mai multe clase, am putea să le adăugăm la
dacă
declarație pentru a ne asigura că fiecare obiect pe care l-am dorit a fost atins.
Pasul 13: Plasarea folosind datele de țiglă
Ce se întâmplă dacă dorim ca jucătorul să fie pus pe scenă pe baza unui număr din gameLay, mai degraba decat plasarea lui folosind valori lineare x si y? Ei bine, putem adăuga o valoare în matricea care se ocupă de locul în care va juca jucătorul, apoi se va schimba pe Main buildLevel () funcționează astfel:
funcția publică buildLEvel (s: Array) if (getChildByName ("tileHolder")! = null) removeChild (getChildByName ("tileHolder")); var tiles: MovieClip = nouClipClip (); tiles.name = "tileHolder"; pentru (var i = 0; iAcum, dacă ar trebui să punem un 2 în gameLay array, ar pune jucătorul în acea poziție în matrice. Trebuie să ne amintim că nu va pune jucătorul direct în centrul plăcii așa cum dorim, așa că trebuie să adăugăm câteva numere de modificare pentru al pune în centru (de aici se adaugă 30 la coords x și y).
Pasul 14: Înțelegerea matricelor 3D
De multe ori când faci un joc, vrei să ai mai mult de un nivel. Ce se întâmplă dacă vrem ca jucătorul nostru să poată trece între niveluri? Va trebui să deținem mai multe nivele în date acum și una dintre cele mai simple moduri de a face acest lucru este o matrice 3D.
Dacă o matrice 1D este o linie și o matrice 2D este un pătrat, atunci o matrice 3D ar fi un cub. O matrice 3D poate conține mai multe matrice 2D și deoarece nivelul nostru este o matrice 2D, putem folosi o matrice 3D pentru a ține mai multe hărți. Exista o multime de moduri de a pastra mai multe nivele pline de date de tigla, unul dintre preferatele mele fiind XML, dar matricele 3D sunt cele mai simple. Va trebui să schimbăm câteva dintre funcțiile noastre:
public var gameLay: Array = [[[1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,1 ], [1,0,0,0,2,0,0,0,0,1], [1,0,0,0,0,1,0,0,0,1], [1,1 , 1,1,1,1,1,1,1,1]], [[1,1,1,1,1,1,1,1,1,1], [1,0,1,1] , 1,0,0,0,0,1], [1,0,0,0,2,0,0,0,0,1], [1,0,0,0,0,1,0 , 0,0,1], [1,1,1,1,1,1,1,1,1,1]]; funcția privată init (e: Event = null): void buildLevel (gameLay [0]); // apuca prima matrice 2D din matricea 3D addEventListener (Event.ENTER_FRAME, onFrameEnter); var p1: player = player nou (); p1.name = "p1" p1.x = 300 p1.y = 100 p1.gameLay = jocLay [0]; // luați prima matrice 2D din array 3D addChild (p1);Acum avem o matrice tridimensională care conține două nivele diferite. Dacă vrem să trecem de la un nivel la altul, este un proces simplu de făcut: pur și simplu folosim gameLay [1] in loc de gameLay [0].
Pasul 15: Comutarea nivelurilor pe zbor
Modul în care ne-am construit până acum sistemul nostru de țigle, nu va dura prea mult pentru a schimba nivelele în zbor. Pentru că noi buildLevel funcția se ocupă de toate lucrările de backend, schimbarea nivelurilor este la fel de simplă ca aceasta:
buildLevel (gameLay [0]); buildLevel (gameLay [1]);Modul în care aplicați această metodă pentru comutarea nivelurilor depinde de dvs. Pentru moment, vom reveni la o singură matrice 2D pentru acest lucru.
Pasul 16: Înțelegerea mai multor utilizări
Pentru moment avem acest motor de tigla configurat pentru a manipula un platformer, dar există multe utilizări diferite pentru motoare ca acestea.
Când te uiți la unele jocuri dezvoltate profesional, poți vedea aplicații pentru motoare de tigla. Așa cum am demonstrat deja cu Zelda, multe jocuri folosesc motoarele pentru plăci.
De la stânga la dreapta, jocurile arătate sunt Plumbers suficient, Bejeweled și Time Fukc. Fiecare joc arată o rețea, ceea ce înseamnă că țiglele au fost folosite pentru a crea jocurile. Odată ce înțelegeți cum să manipulați datele de pe plăci, puteți începe să efectuați verificări complexe pentru modele precum cele realizate în Bejeweled pentru jocuri puzzle, care este subiectul nostru următor.
Pasul 17: Joc simplu de puzzle
Să aruncăm o clipă ideea unui platformer și să ne imaginăm că vrem să facem un joc de puzzle. Ceva simplu. Să spunem că vrem să facem ca, dacă toate plăcile de pe ecran sunt negre, veți câștiga. Veți putea adăuga sau elimina un bloc în funcție de poziția mouse-ului și apăsarea spațiului.
Există doi pași pentru a face acest lucru. Trebuie să facem funcția care ne permite să schimbăm blocurile, atunci trebuie să scriem o funcție pentru a verifica și a vedea dacă toate blocurile de pe ecran sunt acolo. Când spunem că blocurile sunt "acolo", înseamnă că plăcile sunt negre.
pachet import flash.display.Sprite; importul flash.events.Event; import flash.display.MovieClip; import flash.events.KeyboardEvent; dale de import; import jucător; public class Main extinde MovieClip public var gameLay: Array = [[1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0, 0,0,1], [1,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,1,0,0,0,1] , [1,1,1,1,1,1,1,1,1,1]] funcția publică getTile (xs, ys) retur jocLay [Math.floor (ys / 60)] [Math.floor (xs / 60)] funcția publică onFrameEnter (e: Event = null): void pentru (var i: int = numChildren-1; i> = 0; i -) ifChildAt (i) (getChildAt (i)) onFrameEnters (.); funcția publică Main (): void if (stage) init (); altfel addEventListener (Event.ADDED_TO_STAGE, init); funcția privată init (e: Event = null): void buildLevel (gameLay); stage.addEventListener (KeyboardEvent.KEY_DOWN, clicuri); addEventListener (Eveniment.ENTER_FRAME, onFrameEnter); funcția publică buildLEvel (s: Array) if (getChildByName ("tileHolder")! = null) removeChild (getChildByName ("tileHolder")); var tiles: MovieClip = nouClipClip (); tiles.name = "tileHolder"; pentru (var i = 0; iDin motive de claritate, aceasta este întreaga clasă de documente necesară pentru a crea jocul pe care îl discutăm. Observați cât de asemănătoare este cu codul platformerului nostru. În
init ()
funcția, am adăugat un ascultător de evenimente pentru presele de taste; declanșeazăclicuri ()
care se ocupă de schimbarea plăcilor. Să lăsăm această nouă funcție în jos.Mai întâi verificăm să vă asigurați că cheia care este apăsată este spațiu, verificând codul cheie. Deoarece verificăm poziția plăcilor folosind mouse-ul și funcția getTile, tot ce trebuie să faceți este să verificați și să vedeți dacă orice piesă care este în acel punct al hărții este una sau zero pentru a afla ce să o schimbați la.
Apoi modificăm datele în sine și modificăm afișarea vizuală a plăcilor pentru a reflecta datele. Este nevoie de o mulțime de direcționare a plăcilor individuale, dar pentru că am numit fiecare placă pe baza descrierii lor, le putem accesa folosind metoda getChildByName.
După ce terminăm modificarea plăcilor, trebuie să verificăm și să vedem dacă fiecare țiglă de pe ecran este neagră. Facem asta prin rularea datelor și verificarea pentru a vedea dacă apar nori. Dacă nu se generează zero, știm că totul este 1 (deoarece datele noastre utilizează numai 1s și 0s).
Așa că o avem. Un joc de puzzle foarte simplu care folosește date de țiglă. Dacă vrem, am putea face controale complexe, asemănător cu jocurile de tip bejeweled sau alte astfel de jocuri puzzle pentru a afla anumite combinații de plăci.
Pasul 18: Combinarea elementelor din ambele jocuri
Ce-ar fi dacă am fi vrut un platformer unde ai putea crea și distruge pământul cu ușurință folosind bara de spațiu? Am putea face acest lucru cu ușurință doar prin combinarea celor două jocuri diferite pe care le-am făcut, într-un mod simplu.
Pasul 19: platformer
Să creăm un platformer care vă permite să creați și să distrugeți date. Iată codul:
pachet import flash.display.Sprite; importul flash.events.Event; import flash.display.MovieClip; import flash.events.KeyboardEvent; dale de import; import jucător; public class Main extinde MovieClip public var gameLay: Array = [[1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0, 0,0,1], [1,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,1,0,0,0,1] , [1,1,1,1,1,1,1,1,1,1]] funcția publică getTile (xs, ys) retur jocLay [Math.floor (ys / 60)] [Math.floor (xs / 60)] funcția publică onFrameEnter (e: Event = null): void pentru (var i: int = numChildren-1; i> = 0; i -) ifChildAt (i) (getChildAt (i)) onFrameEnters (.); funcția publică Main (): void if (stage) init (); altfel addEventListener (Event.ADDED_TO_STAGE, init); funcția privată init (e: Event = null): void buildLevel (gameLay); stage.addEventListener (KeyboardEvent.KEY_DOWN, clicuri); addEventListener (Eveniment.ENTER_FRAME, onFrameEnter); var p1: player = player nou (); p1.name = "p1" p1.x = 300 p1.y = 100 p1.gameLay = jocLa; addChild (p1); funcția publică buildLEvel (s: Array) if (getChildByName ("tileHolder")! = null) removeChild (getChildByName ("tileHolder")); var tiles: MovieClip = nouClipClip (); tiles.name = "tileHolder"; pentru (var i = 0; iAdăugăm playerul înapoi în joc și schimbăm clicuri () funcţie. Schimbăm-o pentru a ne asigura că plăcile care conțin player-ul nu pot fi completate. Prin aceste modificări simple putem combina cele două motoare împreună pentru a face un motor care să funcționeze bine.
Pasul 20: Utilizări nesfârșite
Așa cum am menționat mai înainte, motoarele pentru țigle au o multitudine de modalități de utilizare. Jocuri Puzzle, platformers. Puteți crea mai multe straturi de plăci pentru a crea fundaluri și, odată ce începeți să creați jocuri complexe, va trebui să creați propriilor dvs. editori de hărți pentru a gestiona și a crea datele de țiglă pentru jocurile dvs. Cel mai bun mod de a învăța este să experimentați. Scrieți propriile motoare de țiglă, aflați ce funcționează cel mai bine pentru jocurile și aplicațiile dvs. și aflați ce trebuie să faceți pentru a obține ceea ce doriți să lucrați pentru a lucra.
Vă mulțumim pentru lectură!