Creați un joc de balon în Mac

Unul dintre cele mai populare jocuri Flash este vreodată Bloons, în care joci o maimuță care aruncă săgeți pentru a pop baloane. S-au născut numeroase sechele, chiar și în alte genuri, cum ar fi turnul de apărare. Acest tutorial vă va arăta cum să vă creați propriul joc de lansare a balonului, utilizând motorul QuickBox2D.


Rezultatul final al rezultatelor

Să aruncăm o privire asupra rezultatului final pe care îl vom strădui:

Faceți clic și mențineți apăsat pentru a determina unghiul fotografiei. Încercați să afișați toate baloanele!


Pasul 1: Prezentare succintă

În acest tutorial vom folosi o serie de clase ActionScript pentru a crea un joc Bloons Inspired. Obiectivul jocului este de a trage la baloane pentru a le arunca pe toate.


Pasul 2: Setări Flash Document

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


Pasul 3: Interfața

O interfață colorată și simplă va fi utilizată, cu mai multe forme, butoane și MovieClips. În următorii pași vom construi această interfață grafică. Veverița și grafica de acornă sunt de la openclipart.org.


Pasul 4: Contextul

Acest fundal a fost creat în Flash utilizând forme simple dreptunghiulare și ovale. Bara brună din partea de jos va servi ca o bară de informații.


Pasul 5: titlu și baloane

Pentru a crea titlul, selectați Instrumentul pentru text (T) și modificați culoarea în #EEEEEE; scrieți textul titlului (am folosit fonturile GoodDog) și adăugați o umbră de picătură simplă. Pentru balon, selectați instrumentul Oval (O) și creați o ovală de 20x30 px # FFCE47. Utilizați Instrumentul Poly Star pentru triunghiul mic de sub el.


Pasul 6: Butoane

Utilizați din nou butonul Instrument de text pentru a crea două butoane, după cum se arată în imaginea de mai sus. Transformați-le în butoane și dați-le nume de instanțe descriptive, astfel încât să le putem folosi cu ușurință mai târziu în cod. Transformați grafica pe scenă într-un singur MovieClip și numește-o TitleView - nu uitați să verificați Exportați pentru caseta ActionScript.


Pasul 7: Ecranul jocului

Acesta este ecranul de joc, care conține toate elementele dinamice și interactive ale jocului. Mai multe dintre ele vor fi generate la runtime folosind ActionScript. Puteți citi numele instanțelor din imaginea de mai sus.


Pasul 8: Ecranul creditelor

credite ecranul va apărea în fața Titlu ecran; utilizați grafica și fonturile înainte pentru ao crea. Numeste CreditsView și nu uitați să verificați Exportați pentru ActionScript cutie.


Pasul 9: Alertă

O alertă va fi afișată când toate baloanele au fost aruncate; acesta va afișa un joc peste mesaj și scorul. Folosește Instrumentul dreptunghiului pentru ao crea și a seta numele de instanță la AlertView. Din nou, marcați Exportați pentru ActionScript cutie.


Pasul 10: Sunete

Vom folosi efecte sonore pentru a spori sentimentul jocului; puteți găsi sunetul folosit în acest exemplu în Soungle.com folosind cuvântul cheie pop.


Pasul 11: TweenNano

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 TweenNano de pe site-ul său oficial.


Pasul 12: QuickBox 2D

Vom folosi biblioteca fizică utilă QuickBox2D pentru a crea acest joc. Dacă nu sunteți familiarizați cu aceasta, puteți urma Seria introductivă de la Activetuts+.

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


Pasul 13: Setați clasa de documente


Vom face aplicația interactivă utilizând o clasă externă. Adăugați numele la Clasă domeniu în Publica secțiunea din Proprietăți pentru a asocia FLA cu clasa de documente principale.


Pasul 14: 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 15: 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 16: 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.MovieClip; import com.actionsnippet.qbox. *; import com.greensock.TweenNano; import com.greensock.easing.Expo; importul flash.events.MouseEvent; import Box2D.Common.Math. *; importul flash.events.Event; import flash.net.navigateToURL; import flash.net.URLRequest;

Pasul 17: 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 explicative, astfel încât nu va exista nici un comentariu acolo.

 private var titleView: TitluView = new TitleView (); private cred credite: CreditsView; privată lume var: QuickBox2D; private var acorn: QuickObject; private var acorns: Array = []; // stochează ghindele aruncate contacte private var: QuickContacts; // utilizate pentru a face față coliziunilor în baloanele var varbox2d private: Array = []; // stochează baloanele în etapa privată var yImpulse: Number = 0; // puterea verticală pentru a trage ghindă privată var xImpulse: int = 3; // implicit forță orizontală ghindă este aruncată pop var pop: Pop = new Pop (); // sunetul din bibliotecă

Pasul 18: Constructorul

Constructorul este o funcție care rulează atunci când un obiect este creat dintr-o clasă, acest cod fiind primul care se execută când faceți o instanță a unui obiect. Constructorul clasei de documente este un caz special: rulează la începutul jocului.

Folosim acest lucru pentru a apela 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 19: Adăugați Vizualizarea titlurilor

Începem prin adăugarea TitluView din Bibliotecă în scenă.

 addChild (titleView); startButtonListeners ();

Pasul 20: Start Ascultați butoanele

Aceasta va adăuga ascultătorii mouse-ului la butoanele din ecranul de titlu, ceea ce ne va duce la ecranul jocului sau al creditelor.

 funcția finală privată startButtonListeners (action: String = 'add'): void if (action == 'add') titleView.creditsBtn.addEventListener (MouseEvent.MOUSE_UP, showCredits); titluView.playBtn.addEventListener (MouseEvent.MOUSE_UP, showGameView);  altceva titleView.creditsBtn.removeEventListener (MouseEvent.MOUSE_UP, showCredits); titluView.playBtn.removeEventListener (MouseEvent.MOUSE_UP, showGameView); 

Pasul 21: Afișați creditele

credite ecranul este afișat când utilizatorul face clic pe butonul Credite. Un ascultător de mouse este adăugat complet MovieClip pentru ao elimina.

 funcția finală privată aratăCredități (e: MouseEvent): void titleView.creditsBtn.visible = false; titleView.playBtn.visible = false; credits = new CreditsView (); addChild (credite); TweenNano.from (credite, 0,3, x: -credits.width, onComplete: function (): void credits.addEventListener (MouseEvent.MOUSE_UP, hideCredits);); 

Pasul 22: Ascundeți creditele

Cand credite ecranul este apăsat pe ecran, va fi readus înapoi și scos din scenă.

 funcția finală privată ascundeCredități (e: MouseEvent): void TweenNano.to (credite, 0,3, x: -credits.width, onComplete: function (): void titleView.creditsBtn.visible = true; titleView.playBtn.visible = true; credits.removeEventListener (MouseEvent.MOUSE_UP, hideCredits); removeChild (credite); credite = null;); 

Pasul 23: Afișați vizualizarea jocului

Următoarele linii elimină Titlu ecran și părăsiți Joc Ecran vizibil. Aici numim și funcțiile necesare pentru a începe jocul; aceste funcții sunt explicate în etapele următoare.

 Funcția finală privată showGameView (e: MouseEvent): void TweenNano.to (titleView, 0.3, y: -titleView.height, onComplete: function (): void startButtonListeners ('rmv' null; startGame ();); 

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

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ă, deci dacă dintr-un anumit motiv fișierul dvs. nu imită acest lucru, aruncați o privire la sursă pentru a vedea ce cauzează.


Pasul 24: ascultători de jocuri

Această funcție adaugă ascultătorii mouse-ului necesari pentru a efectua fotografierea cu ghindă.

 funcția finală privată de jocListeners (action: String = 'add'): void if (action == 'add') bg.addEventListener (MouseEvent.MOUSE_DOWN, startCharge); bg.addEventListener (MouseEvent.MOUSE_UP, împușcat); restartBtn.addEventListener (MouseEvent.MOUSE_UP, restartLvl); stage.addEventListener (Event.ENTER_FRAME, actualizare);  altceva bg.removeEventListener (MouseEvent.MOUSE_DOWN, startCharge); bg.removeEventListener (MouseEvent.MOUSE_UP, împușcat); restartBtn.removeEventListener (MouseEvent.MOUSE_UP, restartLvl); stage.removeEventListener (Event.ENTER_FRAME, actualizare); 

Pasul 25: Începeți jocul

Aici începem jocul creând lumea Box2D și sunând funcțiile care vor crea baloanele și vor gestiona evenimentele mouse-ului.

 funcția finală privată startGame (): void / * Ascunde gCircle * / gCircle.visible = false; / * Noua lume B2D * / world = noul QuickBox2D (acest lucru, debug: 0); contacte = world.addContactListener (); contacts.addEventListener (QuickContacts.ADD, onAdd); / * Crearea funcției balon * / gameListeners (); createBalloons (); 

Pasul 26: Creați baloane

Cuibărit pentru buclele sunt folosite pentru a plasa baloanele pe scenă. Această funcție va folosi QuickBox2D addBox pentru a crea un nou obiect Box2D care va fi setat ca a Senzor - acest lucru înseamnă că nu va exista nici o reacție fizică la coliziune (adică ghindă nu va sări de pe ea), dar o coliziune va fi încă detectată. Folosind această metodă putem distruge balonul dar lăsăm ghinda să continue pe drum ca și cum nu s-ar întâmpla nimic.

Balonul este apoi adăugat la o matrice; acest lucru ne va permite accesul la toate baloanele din afara acestei funcții.

 funcția finală privată createBalloons (h: int = 5, v: int = 3): void pentru (var i: int = 0; i < h; i++)  for(var j:int = 0; j < v; j++)  var balloon:QuickObject = world.addBox(x:10 + (i * 0.66), y:4 + (j * 1), width: 0.66, height: 1, skin:Balloon, fixedRotation:true, draggable:false, density:0); balloon.shape.m_isSensor = true; balloons.push(balloon);   /* Set balloon counter */ targetTF.text = String(balloons.length); /* Start Physics */ world.start(); 

Desigur, nu trebuie să utilizați imbricate pentru bucle pentru a poziționa baloanele; acesta este cel mai simplu mod de a le poziționa într-o rețea, dar puteți să le poziționați manual dacă preferați.


Pasul 27: Detectarea coliziunilor

Această funcție se ocupă de coliziunea menționată la pasul 26. Primul lucru pe care trebuie să-l faceți este să treceți prin matricea baloanelor, verificând fiecare pentru a vedea dacă se ciocnește cu ghindă.

 funcția finală privată onAdd (e: Event): void pentru (var i: int = 0; i < balloons.length; i++)  if(contacts.isCurrentContact(balloons[i], acorn)) 

Pasul 28: Distrugeți balonul

Dacă coliziunea este adevărată, sunăm distruge() metoda de balon QuickObject și scoateți elementul din matrice.

 baloane [i] .destroy (); balloons.splice (i, 1);

Pasul 29: Redați sunetul

Apoi jucăm un sunet care indică succesul, sporind senzația de joc.

 pop.play ();

Pasul 30: Actualizarea contoarelor de scoruri și țintă

Contoarele de scor și țintă sunt actualizate în funcție de baloanele afișate și baloanele rămase.

 scoreTF.text = String (int (scoreTF.text) + 50); targetTF.text = String (lungimea baloanelor);

Pasul 31: Verificați dacă nivelul este complet

O alertă este apelată când toate baloanele sunt aruncate; vom vedea această funcție mai târziu în tutorial.

 dacă (targetTF.text == '0') alert (); 

Pasul 32: Începeți încărcarea

Acest cod va arăta indicatorul de direcție al ghinionului, va reseta variabila de impuls y a ghintuiului și va adăuga un ascultător de intrare care va gestiona obiectivul.

 funcția finală privată startCharge (e: MouseEvent): void yImpulse = 0; gCircle.visible = true; gCircle.addEventListener (Event.ENTER_FRAME, taxă); 

Pasul 33: Încărcați

Indicatorul obiectivului se rotește pentru a arăta direcția în care va fi declanșată ghindă și ajustează în mod corespunzător variabila impulsului y. Direcția loviturii este afectată de două variabile, xImpulse și yImpulse, care sunt combinate pentru a forma un impuls vector mai târziu. xImpulse rămâne constant, și yImpulse se modifică pe măsură ce utilizatorul ține apăsat butonul mouse-ului.

 taxa funcției finale private (e: Event): void gCircle.rotation - = 3; yImpulse - = 0,2; / * Prevenirea supra-rotației * / dacă (gCircle.rotation < -80)  yImpulse = -5.4; gCircle.rotation = -80;  

Pasul 34: Shot

Următoarele acțiuni apar atunci când butonul mouse-ului este în sus.

 (e: MouseEvent): void / * Ascunde gCircle * / gCircle.removeEventListener (Event.ENTER_FRAME, încărcare); gCircle.visible = false; gCircle.rotation = 0; / * Creați un nou Acorn * / acorn = world.addBox (x: 2.76, y: 7.33, lățime: 0.66, înălțime: 0.53, piele: Acorn, fixedRotation: true, draggable: false, density: 1); acorns.push (ghindă); / * Trage ghindă * / var impuls: b2Vec2 = nou b2Vec2 (xImpulse, yImpulse); acorn.body.ApplyImpulse (impuls, acorn.body.GetWorldCenter ()); / * Actualizare counter Acorn * / acornsTF.text = String (int (acornsTF.text) -1); 

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

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


Pasul 35: Funcția de actualizare

Funcția de actualizare va efectua o serie de operații EnterFrame. Să vedem acele acțiuni în următorii pași.

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

Pasul 36: Îndepărtați ghiocei din culise

Următoarele linii vor elimina orice ghindă care se stinge de pe scenă.

 / * Eliminați ghilimele din etapa * / pentru (var i: int = 0; i < acorns.length; i++)  if(acorns[i].y > 10.66) acorns [i] .destroy (); acorns.splice (i, 1);

Pasul 37: Verificați dacă nivelul a eșuat

Jocul se termină atunci când jucătorul este scos din ghinde (sau distruge toate baloanele așa cum sa menționat anterior).

 / * Verificați nivelul eșuat * / if (int (acornsTF.text) <= 0)  alert('lose');    

Pasul 38: Nivel de repornire

Acest cod se execută când se face clic pe butonul Restart. Acesta va reseta variabilele necesare și ascultători pentru a reporni nivelul.

 funcția finală privată restartLvl (e: MouseEvent): void / * Eliminare ascultători * / gameListeners ('rmv'); / * Distruge lumea * / world = null; / * Distruge baloane, reseta scorul și ghindele * / pentru (var i: int = 0; i < balloons.length; i++)  balloons[i].destroy(); scoreTF.text = '0'; acornsTF.text = '5';  balloons = [];//clear balloons array startGame(); 

Pasul 39: Alertă

Această funcție va opri jocul și va afișa mesajul Game Over. Acesta adaugă, de asemenea, un ascultător de mouse pentru a reseta jocul atunci când a făcut clic.

 alertă privată finală a funcției (gameState: String = 'win'): void gameListeners ('rmv'); world.stop (); var alert: AlertView = nou AlertView (); alert.x = stage.stageWidth * 0.5; alert.y = stage.stageHeight * 0.5; alert.scoreTF.text = scoreTF.text; alert.addEventListener (MouseEvent.MOUSE_UP, reporniți); dacă (gameState == 'pierde') alert.titleTF.text = 'Nivelul a eșuat!';  addChild (alertă); TweenNano.from (alertă, 0.6, scaleX: 0.2, scaleY: 0.2, ease: Expo.easeOut); 

Pasul 40: Reporniți

Acest cod va reîncărca SWF-ul, restabilind orice valoare și revenind la ecranul inițial.

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

Concluzie

Faceți-vă propriile trucuri la joc și bucurați-vă de crearea acestuia. Poate că ați putea schimba aspectul baloanelor sau adăugați nivele noi sau modificați grafica.

Sper că ți-a plăcut acest tutorial, mulțumesc pentru lectură!

Cod