Creați un joc Atari Inspired Box cu AS3

În acest Premium Tutorial, veți învăța să creați un joc retro de divertisment utilizând Flash și ActionScript 3.0. Check out demo - rezultatul se bazează pe clasic Box pentru Atari.


Pasul 1: Prezentare succintă

Folosind instrumentele de desen Flash vom crea interfața grafică ce va fi alimentată de mai multe clase ActionScript 3.

Jucătorul va putea să se miște și să lupte împotriva adversarului în timpul dat.


Pasul 2: Setări Flash Document

Deschideți Flash și creați un document de 320 pixeli lățime, 480 pixeli înălțime. Setați rata cadrelor la 24fps.


Pasul 3: Interfața

Va fi afișată o interfață colorată frumos, aceasta implică mai multe forme, MovieClips și multe altele.

Continuați cu pașii următori pentru a afla cum să creați această interfață grafică.


Pasul 4: Contextul

Un dreptunghi simplu verde va umple scena.

Selectați instrumentul Rectangle (R) pentru a crea un dreptunghi de 320x480 px # 649428 și a centra în scenă.


Pasul 5: Inel de box


'

Folosind același instrument creați o serie de dreptunghiuri # FF9A2E pentru a crea un inel de 290x213 pixeli.


Pasul 6: Caracterele

Pentru a obține efectul pixelat asupra caracterelor, utilizați instrumentul dreptunghi pentru a crea dreptunghiuri mici și pătrate pentru a se potrivi imaginii de mai sus. Poate doriți să descărcați această imagine și să o puneți pe un strat inferior în cronologie, apoi să plasați dreptunghiuri peste ea.


Pasul 7: Zonele dinamice de text

Trei Dynamic TextFields sunt plasate în scenă, vor fi folosite ca contoare de hit și un timer. Verificați imaginea de mai sus și plasați-o corespunzător.


Pasul 8: Încărcați fontul

Pentru a utiliza un font personalizat într-un câmp text dinamic, va trebui să îl încorporăm mai întâi.

Cu câmpul de text selectat, accesați panoul Proprietăți și faceți clic pe butonul de încorporare, va fi prezentată o fereastră de dialog în care puteți selecta caracterele necesare în joc. Alternativ, trebuie doar să bifați "Câmpuri superioare", "Câteva litere", "Numere" și "Punctuație".


Pasul 9: Numele instanțelor

Conversia formelor de scenă în MovieClip și acordarea acestora a denumirilor de instanțe afișate în imagine.


Etapa 10: Tween Nano

Vom folosi un motor tween diferit de cel implicit inclus în Flash, ceea ce va crește performanța și va fi mai ușor de utilizat.

Puteți descărca Tween Nano de pe site-ul său oficial.


Pasul 11: Creați o nouă clasă ActionScript

Creați o nouă clasă ActionScript 3.0 (Cmd + N) și salvați-o ca Main.as în dosarul dvs. de clasă.


Pasul 12: Structura clasei

Creați structura claselor de bază pentru a începe să scrieți codul.

 pachet import flash.display.Sprite; clasa publică principală extinde Sprite funcția publică Main (): void // code constructor

Pasul 13: Clasele necesare

Acestea sunt clasele pe care trebuie să le importăm pentru ca clasa noastră să funcționeze import directiva face ca clasele și pachetele definite extern să fie disponibile pentru codul dvs..

 import flash.display.Sprite; import flash.utils.Timer; import flash.events.TimerEvent; import flash.events.KeyboardEvent; importul flash.events.Event; import com.greensock.TweenNano; importul flash.events.MouseEvent; import flash.net.navigateToURL; import flash.net.URLRequest;

Pasul 14: Variabile

Acestea sunt variabilele pe care le vom folosi, citiți comentariile din cod pentru a afla mai multe despre ele; unele dintre numele lor sunt explicite, astfel încât nu va exista nici un comentariu acolo.

 timer privat var: Timer = nou Timer (1000); // folosit pentru a reduce timpul privat var min: int = 2; // total minute de luptă private var secs: int = 0; // începe secunde private var moveLeft: Boolean = false; // Următoarele vars sunt folosite pentru a muta playerul privat privat var moveRight: Boolean = false; privat var movUp: Boolean = false; private var moveDown: Boolean = false; privat var eTimer: Timer = nou Cronometru (50); // întârzierea mișcării inamice

Pasul 15: Constructorul

Constructorul este o funcție care rulează atunci când un obiect este creat dintr-o clasă, acest cod este primul care se execută când faceți o instanță a unui obiect sau executați când SWF încărcat dacă o parte din clasa Dococument.

Acesta numește funcțiile necesare pentru a începe jocul. Verificați aceste funcții în pașii următori.

 funcția publică finală Main (): void // code? 

Pasul 16: Opriți caracterele

Vom începe prin apelarea funcției addListeners și oprirea animațiilor personajelor.

 addListeners (); / * Oprire MovieClips * / player.stop (); enemy.stop ();

Pasul 17: Adăugați ascultători

Apoi adăugăm ascultătorii necesari pentru chei și pentru cadrele de intrare.

 funcția finală privată addListeners (): void stage.addEventListener (KeyboardEvent.KEY_DOWN, movePlayer); stage.addEventListener (tastaturăEvent.KEY_UP, stopPlayer); stage.addEventListener (tastaturăEvent.KEY_DOWN, lovit); stage.addEventListener (tastaturăEvent.KEY_UP, resetHit); stage.addEventListener (Event.ENTER_FRAME, actualizare);

Pasul 18: Adăugați cronometrele

? Urmat de cronometrele necesare:

 / * Timere * / timer.addEventListener (TimerEvent.TIMER, updateCounter); timer.start (); eTimer.addEventListener (TimerEvent.TIMER, inamicUpdate); eTimer.start (); 

Pasul 19: Contorul de timp

Această funcție rulează fiecare secundă, se ocupă de cronometrul din scenă.

 funcția finală privată updateCounter (e: TimerEvent): void / * Reduceți timpul * / secunde--; în cazul în care (secunde < 0)  secs = 59; min--;  if(min == 0 && secs == 0) //remove listeners if out of time  removeListeners(); 

Pasul 20: Timer cu două cifre

Vom adăuga un 0 în partea stângă a secundelor dacă numărul este sub 10 (deci timerul va avea întotdeauna două cifre).

 / * Ceas din două cifre * / var s: String = "; dacă (String (sec)) .length == 1) s = '0'; altceva s =";  time.text = String (min) + ':' + s + String (secunde); 

Pasul 21: mutați jucătorul

Aici detectăm tasta apăsată și schimbăm variabila în consecință. Am putea muta jucatorul folosind aceeasi functie, dar mișcarea nu va fi buna ca si cum am fi folosit un eveniment enterframe.

 funcția finală privată movePlayer (e: KeyboardEvent): void / * Mișcare * / if (e.keyCode == 37) moveRight = false; moveLeft = true;  altceva dacă (e.keyCode == 39) moveLeft = false; moveRight = adevărat;  dacă (e.keyCode == 38) moveDown = false; moveUp = true;  altceva dacă (e.keyCode == 40) moveUp = false; moveDown = true; 

Pasul 22: Opriți Playerul

Această funcție detectează cheia eliberată pentru a opri mișcarea playerului.

 funcția finală privată finală stopPlayer (e: KeyboardEvent): void if (e.keyCode == 37) moveLeft = false;  altceva dacă (e.keyCode == 39) moveRight = false;  dacă (e.keyCode == 38) moveUp = false;  altfel dacă (e.keyCode == 40) moveDown = false;  dacă (e.keyCode == 90 || e.keyCode == 88) player.gotoAndStop (1); 

Pasul 23: Setați clasa principală

Hai să ne oprim aici pentru a face un test rapid și a ne asigura că codul nostru de joc funcționează.

Adăugați numele clasei la Clasă domeniu în Publica secțiunea din Proprietăți pentru a asocia FLA cu clasa de documente principale.

Acum încercați. Cronometrul ar trebui să numere și imaginile ar trebui să apară, dar mișcarea nu va funcționa încă:

Rețineți că unele linii au fost comentate deoarece unele funcții nu au fost încă create.

Amintiți-vă că Milestone-urile sunt incluse în fișierele sursă, așa că dacă dintr-un anumit motiv fișierul dvs. nu imită acest lucru, aruncați o privire la sursă pentru a vedea ce ar putea provoca.


Pasul 24: Atacul jucătorului

Această funcție schimbă cadrul din filmul Player al filmului în rama de atac.

 funcția finală privată (e: KeyboardEvent): void if (e.keyCode == 90) // cheia Z stage.removeEventListener (KeyboardEvent.KEY_DOWN, hit); player.scaleY = 1; player.gotoAndPlay (2);  altfel dacă (e.keyCode == 88) // cheia X stage.removeEventListener (KeyboardEvent.KEY_DOWN, lovit); player.scaleY = -1; // schimbați scara pentru a utiliza alți brați player.gotoAndPlay (2); 

Pasul 25: Opriți atacantul jucătorului

Opreste atacurile jucatorului.

 funcția finală privată resetHit (e: KeyboardEvent): void if (e.keyCode == 90 || e.keyCode == 88) stage.addEventListener (KeyboardEvent.KEY_DOWN, lovit); 

Pasul 26: Funcția de actualizare

Una dintre funcțiile principale din clasă conține codul logic care va fi executat pe frame-ul de intrare. Am rupt explicația în următorii pași.

 actualizarea funcției finale private (e: Event): void 

Pasul 27: Controale

Verificați variabilele de mișcare pentru a muta playerul.

 / * Controale * / if (moveLeft) player.x - = 4;  altfel dacă (moveRight) player.x + = 4;  dacă (moveUp) player.y - = 4;  altfel dacă (moveDown) player.y + = 4; 

Pasul 28: Frontierele de etapă (jucător)

Împiedicați playerul să părăsească inelul.

 / * Frontiere Player * / dacă (player.hitTestObject (topWall)) player.y = topWall.y + topWall.height + player.height * 0.5;  altfel dacă (player.hitTestObject (bottomWall)) player.y = bottomWall.y - player.height * 0.5 - bottomWall.height;  dacă (player.hitTestObject (leftWall)) player.x = leftWall.x + leftWall.width + player.width * 0.5;  altfel dacă (player.hitTestObject (rightWall)) player.x = rightWall.x - player.width * 0.5; 

Pasul 29: Frontierele etapei (Oponentul)

Împiedicați dușmanul să părăsească inelul.

 / * Enemy Borders * / dacă (enemy.hitTestObject (topWall)) enemy.y = topWall.y + topWall.height + enemy.height * 0.5;  altfel dacă (enemy.hitTestObject (bottomWall)) enemy.y = bottomWall.y - enemy.height * 0.5 - bottomWall.height;  în cazul în care (enemy.hitTestObject (leftWall)) enemy.x = leftWall.x + leftWall.width + enemy.width * 0.5;  altfel dacă (enemy.hitTestObject (rightWall)) enemy.x = rightWall.x - enemy.width * 0.5; 

Pasul 30: Coliziuni de jucători-adversari

Caracterele sunt respinse dacă apare o coliziune (nu atacă).

 / * Hit * / dacă (player.hitTestObject (inamic)) player.x = player.x - 5; enemy.x = inamic.x + 5; 

Să facem o altă pauză pentru a vedea cum funcționează codul nostru în acest moment. Utilizați tastele săgeată pentru a vă deplasa, și Z / X pentru a pumn:


Pasul 31: Rezistența jucătorului-adversar

O lovitură va fi adăugată la contor atunci când pumnul jucător / inamic lovește capul inamicului / jucătorului.

 / * Head Hit * / if (player.currentFrame! = 1 && player.fist.hitTestObject (inamic.head)) playerHits.text = String (int (playerHits.text) + 1); player.x = inamic.x - player.width - 26;  if (enemy.currentFrame! = 1 && enemy.fist.hitTestObject (player.head)) enemyHits.text = String (int (enemyHits.text) + 1); enemy.x = player.x + enemy.width + 26; 

Pasul 32: Funcția Alien AI

A doua funcție principală, de data aceasta manipulând inamicul AI.

 funcția finală privată enemyUpdate (e: TimerEvent): void 

Pasul 33: Miscarea inamicii

Această linie controlează mișcarea inamicului.

 / * Mișcarea Enemy * / if (enemy.x> player.x + 40) enemy.x - = 4;  dacă (enemy.x < player.x)  enemy.x += 4;  if(enemy.y > jucator.y) enemy.y - = 4;  dacă (enemy.y < player.y)  enemy.y += 4; 

Pasul 34: Inamicul atacului

Acest cod se ocupă de atacul inamicului. În esență, își verifică poziția și loviturile când pumnul poate lovi capul jucătorului.

 / * Inamicul atacului * / if (enemy.y> player.y + 10 && enemy.y < player.y + 21)  enemy.scaleY = 1; enemy.gotoAndPlay(2);  else if(enemy.y < player.y - 10 && enemy.y > player.y - 21) enemy.scaleY = -1; enemy.gotoAndPlay (2);  altfel dacă (player.x - enemy.x> = -40 && player.x - enemy.x <= -30)  enemy.gotoAndPlay(2);  else  enemy.gotoAndStop(1);  

Pasul 35: Îndepărtați ascultătorii

Ascultătorii vor fi eliminați după terminarea timpului.

 funcția finală privată removeListeners (): void stage.removeEventListener (KeyboardEvent.KEY_DOWN, movePlayer); stage.removeEventListener (tastaturăEvent.KEY_UP, stopPlayer); stage.removeEventListener (KeyboardEvent.KEY_DOWN, lovit); stage.removeEventListener (tastaturăEvent.KEY_UP, resetHit); stage.removeEventListener (Event.ENTER_FRAME, actualizare);

Pasul 36: Opriți temporizatoarele

? La fel ca și cronometrele.

 / * Oprire temporizatoare * / timer.stop (); timer.removeEventListener (TimerEvent.TIMER, updateCounter); eTimer.stop (); eTimer.removeEventListener (TimerEvent.TIMER, inamicUpdate); enemy.gotoAndStop (1); showAlert (); 

Pasul 37: Afișați alerta

O alertă va fi afișată ulterior, acest cod instanțiează alerta.

 funcția finală privată showAlert (): void var alert: AlertView = nou AlertView (); alert.x = stage.stageWidth * 0.5; alert.y = stage.stageHeight * 0.5;

Pasul 38: Verificați dacă ați câștigat sau ați pierdut

Pentru a afișa textul corect în alertă, verificăm contoarele de hit-uri pentru a determina rezultatul.

 / * Verificați dacă ați câștigat sau ați pierdut pe baza rezultatelor * / if (int (playerHits.text)> int (enemyHits.text)) alert.msg.text = 'câștigi!';  altfel dacă (int (playerHits.text) < int(enemyHits.text))  alert.msg.text = 'you lose!';  else  alert.msg.text = 'draw!';  TweenNano.from(alert, 0.3, scaleX: 0.5, scaleY: 0.5); alert.addEventListener(MouseEvent.MOUSE_UP, restart); addChild(alert); 

Pasul 39: reporniți

Următoarea funcție va reîncărca SWF-ul, resetând toate variabilele și revenind la primul ecran.

 reinițializare finală a funcției finale (e: MouseEvent): void navigateToURL (nou URLRequest (stage.loaderInfo.url), '_level0'); 

Pasul 40: Încercați

Suntem gata să testăm jocul și să verificăm dacă totul funcționează conform așteptărilor.


Concluzie

Ați creat un joc foarte distractiv, încercați să adăugați propriile caracteristici și grafică. Sper că ți-a plăcut acest tutorial, mulțumesc pentru lectură!