Bygg et slående breakout spill i Flash

I denne Premium Tutorialen skal vi bygge et Breakout-spill; "Brick Breaker" fra bunnen av med Flash og AS3.


Trinn 1: Kort oversikt

Ved hjelp av Flash-tegneverktøyene oppretter vi et flott grafisk grensesnitt som vil bli drevet av flere ActionScript 3-klasser.

Brukeren vil kunne spille gjennom en rekke nivåer, du kan enkelt legge til så mange nivåer som du vil!


Trinn 2: Flash-dokumentinnstillinger

Åpne Flash og opprett et 320 piksler bredt 480 piksler høyt dokument. Still inn rammefrekvensen til 24fps.



Trinn 3: Grensesnitt


Et fargerikt, fin utseende grensesnitt vil bli vist. Den vil inneholde flere former, knapper, bitmaps og mer.

La oss hoppe rett inn i å lage denne GUI.


Trinn 4: Hovedskjerm


Dette er hovedskjermen eller visningen, det vil være den første grafikken som skal vises i vårt spill.


Trinn 5: Bakgrunn

Opprett et 320x480 rektangel og fyll det med denne radiale gradienten: # 3A9826, # 102A07.


Vi skal gi det litt mer detaljert ved å legge til et Photoshop-filter. Hvis du ikke har Photoshop, kan du prøve å legge til en fin effekt ved hjelp av Flash-verktøyet.

Åpne bildet i Photoshop og gå til Filtre> Tekstur> Patchwork, bruk følgende innstillinger:


Du vil ende opp med noe slikt:


Denne bakgrunnen kommer på scenen, samt padle-, ball- og tekstindikatorene. Konverter bakgrunnen til en Filmklipp og nev det bg.


Trinn 6: Tittel

Velg tekstverktøyet (T), velg en passende skrift og skriv spilltittelen din. Jeg brukte dette formatet: Akashi, 55pt, # FFCC33.


Velg TextField og bruk panelet Filtre for å legge til en Drop Shadow:


Dupliser teksten (Cmd + D) og flytt den 3px opp for å gi den litt preg.


Konverter grafikken til en Filmklipp og nev det MenuScreen, husk å markere Eksporter for ActionScript eske. Du kan slette dette fra scenen når du er ferdig, da den blir kalt ved hjelp av AS3.


Trinn 7: Padle

Bruk Rectangle Primitive Tool (R) til å opprette et rundt rektangel på 57x11.5px, endre hjørneradius til 10 og bruk denne gradienten: # 4E4E4E, #BABABA, # B0B3BA.


Legg til noen detaljlinjer med rektangulærverktøyet, bruk din egen stil!


Du kan også legge til litt farge på din padle, her er det endelige resultatet av meg, fargen som brukes er: # CC0000.


Konverter grafikken til en Filmklipp og nev det padle.


Trinn 8: Ball

For å lage ballen, velg Oval Tool (O) og bruk den til å lage en 12x12px, #CCCCCC sirkel.


Dupliserer sirkelen (Cmd + D) endre størrelsen til 10x10px og fyll den med denne radiale gradienten: # 95D4FF, # 0099FF.


Til slutt, kutt den andre sirkelen i halv og bruk markeringsverktøyet (V) for å lage en kurve i bunnen. Bytt fargen til en hvit lineær gradient med alfa 60, 10.


Konverter grafikken til en Filmklipp og nev det ball.


Trinn 9: Murstein

Vår murstein vil være veldig enkel.

Bruk rektangulært verktøy for å lage et 38x18px rektangel og bruk neste gradient: # CC0000, # 8E0000, # FF5656.


Konverter rektangelet til en MovieClip og bruk skyggefilteret som brukes i tittelteksten, for å gi det et bedre utseende.

Konverter grafen til a Filmklipp og nev det Murstein, husk å markere Eksporter for ActionScript eske.


Trinn 10: Om skjermbildet

Om skjermen vil vise kreditter, år og opphavsrett til spillet.

Det vil være ganske enkelt å lage som vi allerede har alle elementene som brukes i den.


Konverter grafikken til en Filmklipp og nev det AboutScreen, husk å markere Eksporter for ActionScript eske.


Trinn 11: Spillskjerm

Dette er spillskjermbildet, det vil være på scenen fra begynnelsen, og det vil inneholde padle-, ball-, bakgrunns- og tekstindikatorer. (Vi legger til teglene ved hjelp av kode.)


Instansnavnene er ganske enkle og selvforklarende: padle, ball, bg, scoreTF, livesTF og levelTF.


Trinn 12: Legge inn skrifttyper

For å kunne bruke den tilpassede fonten dynamisk, må vi legge den inn i applikasjonen.

Velg en dynamisk tekstfelt og klikk på embed? knappen i Egenskaper Panel.


Velg / legg til alle nødvendige tegn og klikk OK.


Trinn 13: Alert Screen

Denne skjermen vil vises når spillet er avgjort; enten du vinner, taper eller du når spillet over (vinner alle nivåer eller mister alle liv).

To dynamiske tekstfiler brukes i denne visningen, de vil vise gjeldende spilltilstand pluss en kort melding. TextFields er oppkalt titleTF og msgTF.


Konverter grafikken til en Filmklipp og merk av Eksporter for ActionScript boks, sett klassenavnet til AlertScreen.

Dette slutter grafikkdelen, la ActionScript begynne!


Trinn 14: Tween Nano


Vi bruker en annen tween-motor fra standard inkludert i flash, dette vil øke ytelsen og være enklere å bruke.

Du kan laste ned Tween Nano fra sitt offisielle nettsted.


Trinn 15: Ny ActionScript-klasse

Opprett en ny (Cmd + N) ActionScript 3.0-klasse og lagre den som Main.as i klassemappen din.



Trinn 16: Klassestruktur

Lag din grunnklassestruktur for å begynne å skrive koden din.

 pakke import flash.display.Sprite; offentlig klasse Hoved utvider Sprite offentlig funksjon Main (): void // constructor code

Trinn 17: Nødvendige klasser

Dette er klassene vi må importere for vår klasse for å jobbe, importere Direktivet gir eksternt definerte klasser og pakker tilgjengelig for koden din.

 importer flash.display.Sprite; importere flash.ui.Mouse; importer flash.events.MouseEvent; importer flash.events.KeyboardEvent; importere flash.events.Event; importer com.greensock.TweenNano; importere com.greensock.easing.Circ;

Trinn 18: Variabler og konstanter

Dette er variablene og konstantene vi skal bruke, les kommentarene i koden for å finne ut mer om dem.

 privat const BRICK_W: int = 39; // mursteinens bredde private const BRICK_H: int = 19; // mursteinens høyde private const OFFSET: int = 6; // En offset brukes til å sentrere mursteinene private const W_LEN: int = 8; // lengden på nivåene, kun 8 horisontale murstein skal opprettes på scenen privat const SCORE_CONST: int = 100; // beløpet som skal legges til poengsummen når en murstein er rammet. Private var murstein: Vector. = Ny Vector.(); // lagrer alle mursteinene private var xSpeed: int = 5; privat var ySpeed: int = -5; privat var xDir: int = 1; // x retning privat var yDir: int = 1; private var gameEvent: String = "; // lagrer hendelser som å vinne, miste, gameover private var currentLevel: int = 0; private var menyScreen: MenuScreen; // en forekomst av menyskjermen private var omScreen: OmScreen; privat var alertScreen: AlertScreen; private var liv: int = 3; private var nivåer: Array = []; // lagrer nivåene

Trinn 19: Nivåer

Alle våre nivåer vil bli lagret i flerdimensjonal array.

Dette er arrays som inneholder arrays; du kan skrive dem i en enkelt linje, men hvis du justerer dem, kan du faktisk se skjemaet som nivået vil ta.

 privat const LEVEL_1: Array = [[0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0, 1,1,0,0,0], [0,0,0,1,1,0,0,0], [0,1,1,1,1,1,1,0], [0, 1,1,1,1,1,1,0], [0,0,0,1,1,0,0,0], [0,0,0,1,1,0,0,0] , [0,0,0,0,0,0,0,0],]; // dette danner et + tegn! privat const LEVEL_2: Array = [[0,0,0,0,0,0,0,0], [0,0,0,1,1,0,0,0], [0,0,1, 0,0,1,0,0], [0,0,0,0,0,1,0,0], [0,0,0,0,1,0,0,0], [0, 0,0,1,0,0,0,0], [0,0,1,0,0,0,0,0], [0,0,1,1,1,1,0,0] ,]; // dette danner et nummer 2!

På disse nivåene 1s representerer plassen i scenen der en murstein skal plasseres, og 0s er bare tom plass. Disse nivåene leses senere av en funksjon som vil sette mursteinene på scenen. Du kan legge til så mange nivåer som du vil bruke denne klassen!


Trinn 20: Konstruktorkode

Konstruktøren er en funksjon som kjører når et objekt opprettes fra en klasse; Denne koden er den første som skal utføres når du lager en forekomst av et objekt (eller kjører når spillet laster, i tilfelle en dokumentklasse).

Det kaller de nødvendige funksjonene for å starte spillet. Sjekk ut disse funksjonene i de følgende trinnene.

 offentlig sluttfunksjon Main (): void / * Legg til nivåer * / levels.push (LEVEL_1, LEVEL_2); // Vi legger til nivåene i arrayet for å vite hvor mange de er / * Menyskjerm, Knapper Lyttere * / menyScreen = Ny menyskjerm (); addChild (menuScreen); menyScreen.startB.addEventListener (MouseEvent.MOUSE_UP, tweenMS); menyScreen.aboutB.addEventListener (MouseEvent.MOUSE_UP, tweenMS); 

Trinn 21: Menyskjerm og Om visning Animasjon

De neste linjene håndterer knappene på menyskjermbildet og mellom menyen eller Omvisning, avhengig av knapptrykket.

 privat sluttfunksjon tweenMS (e: MouseEvent): void if (e.target.name == 'startB') // hvis startknappen klikkes TweenNano.to (menyScreen, 0.3, y: -menuScreen.height, ease : Circ, onComplete: init); // mellom menyskjermbildet annet // hvis om knappen er klikket aboutScreen = ny OmScreen (); // legg til om skjermbildet addChild (omtrentScreen); TweenNano.from (omScreen, 0.3, x: stage.stageWidth, ease: Circ); // tween om skjermen aboutScreen.addEventListener (MouseEvent.MOUSE_UP, hideAbout); // legge til en muselytter for å fjerne den / * Fjerner om visning * / privat endelig funksjon hideAbout (e: MouseEvent): void TweenNano.to (omScreen, 0.3, x: stage.stageWidth, ease: Circ, onComplete : funksjon rmv (): void aboutScreen.removeEventListener (MouseEvent.MOUSE_UP, hideAbout); removeChild (ca.Screen);); 

Trinn 22: Init Funksjon

Denne funksjonen utfører de nødvendige operasjonene for å starte spillet, lese kommentarene i koden for å vite mer om det.

 privat endelig funksjon init (): void / * Destroy Menu Screen * / menuScreen.startB.removeEventListener (MouseEvent.MOUSE_UP, tweenMS); menuScreen.aboutB.removeEventListener (MouseEvent.MOUSE_UP, tweenMS); removeChild (menuScreen); menyScreen = null; / * Skjul markør * / Mouse.hide (); / * Bygg nivå teglstein * / buildLevel (LEVEL_1); / * Start Listener * / bg.addEventListener (MouseEvent.MOUSE_UP, startGame); 

Trinn 23: Flytt Padle

Padlen vil være Mus kontrollert, den vil følge musen x posisjon .

 privat endelig funksjon movePaddle (e: MouseEvent): void / * Følg Mouse * / paddle.x = mouseX; 

Trinn 24: Paddle Border Collision

For å stoppe padlen fra å forlate scenen, skaper vi usynlige grenser på sidene av skjermen.

 / * Følg Mus * / paddle.x = mouseX; / * Borders * / if ((paddle.x - paddle.width / 2) < 0)  paddle.x = paddle.width / 2;  else if((paddle.x + paddle.width / 2) > stage.stageWidth) paddle.x = stage.stageWidth - paddle.width / 2; 

Trinn 25: Bygg nivåfunksjon

Nivåene vil bli bygget av denne funksjonen.

Den bruker en parameter for å oppnå nivået som skal bygges, beregner størrelsen og kjører en nestet forløp, med en løkke for høyden og en for bredden. Deretter oppretter det en ny Brick-forekomst som er plassert i henhold til bredde, høyde og nummer som tilsvarer Jeg og j.

Til slutt blir mursten lagt til murstein vektor for å få tilgang til den utenfor denne funksjonen.

 privat endelig funksjon buildLevel (nivå: Array): void / * Nivålengde, høyde * / var len: int = level.length; for (var jeg: int = 0; i < len; i++)  for(var j:int = 0; j < W_LEN; j++)  if(level[i][j] == 1)  var brick:Brick = new Brick(); brick.x = OFFSET + (BRICK_W * j); brick.y = BRICK_H * i; addChild(brick); bricks.push(brick);    

Trinn 26: Spillelyttere

Denne funksjonen legger til eller fjerner musen og legger inn rammelykkere. Den bruker en parameter for å avgjøre om lytterne skal legges til eller fjernes: standard er Legg til.

 private endelige funksjon spilllistere (handling: String = 'add'): void if (action == 'add') stage.addEventListener (MouseEvent.MOUSE_MOVE, movePaddle); stage.addEventListener (Event.ENTER_FRAME, oppdatering);  else stage.removeEventListener (MouseEvent.MOUSE_MOVE, movePaddle); stage.removeEventListener (Event.ENTER_FRAME, oppdatering); 

Trinn 27: Start spillfunksjon

Den neste koden kaller gameListeners () funksjon for å starte spillet.

 privat endelig funksjon startGame (e: KeyboardEvent): void bg.removeEventListener (MouseEvent.MOUSE_UP, startGame); gameListeners (); 

Trinn 28: Ballbevegelse

Ballhastigheten bestemmes av xSpeed og ySpeed variabler, når Oppdater Funksjonen utføres, ballen begynner å bevege seg ved hjelp av disse verdiene hver ramme.

 privat endelig funksjon oppdatering (e: Event): void / * Ball Bevegelse * / ball.x + = xSpeed; ball.y + = ySpeed;

Trinn 29: Veggkollisjon

Denne koden kontrollerer kollisjoner mellom ballen og veggene.

 / * Veggkollisjon * / hvis (ball.x < 0)ball.x = ball.x + 3;xSpeed = -xSpeed;;//Left if((ball.x + ball.width) > stage.stageWidth) ball.x = ball.x - 3; xSpeed ​​= -xSpeed;; // Høyre hvis (ball.y < 0)ySpeed = -ySpeed;;//Up

Trinn 30: Tapt spillhendelse

En if-statement brukes til å sjekke når padlen savner ballen. I så fall mister spilleren et liv.

 hvis (ball.y + ball.height> paddle.y + paddle.height) alert ('You Lose', 'Play Again?'); gameEvent = 'lose'; lives -; livesTF.text = String (liv );; // ned / tape

Trinn 31: Paddle-Ball Kollisjoner

Når ballen treffer padlen, er ySpeed ​​satt til negativ for å få ballen til å gå opp. Vi sjekker også inn hvilken side av padlen ballen har slått for å velge siden der den vil bevege seg neste.

 / * Paddle Collision, kontroller hvilken side av padle ballen slår * / hvis (paddle.hitTestObject (ball) && (ball.x + ball.width / 2) < paddle.x)  ySpeed = -5; xSpeed = -5; //left  else if(paddle.hitTestObject(ball) && (ball.x + ball.width / 2) >= paddle.x) ySpeed ​​= -5; xSpeed ​​= 5; //Ikke sant 

Trinn 32: Teglkollisjoner

Vi bruker en til og hitTest for å sjekke om mursteinskollisjoner, når ballen rammer en murstein, brukes samme teknikk som brukes i padle til å bestemme siden ballen skal følge.

 / * Murstein Kollisjon * / for (var jeg: int = 0; i < bricks.length; i++)  if(ball.hitTestObject(bricks[i]))  /* Check the which side of the brick the ball hits, left, right */ if((ball.x + ball.width / 2) < (bricks[i].x + bricks[i].width / 2))  xSpeed = -5;  else if((ball.x + ball.width / 2) >= (murstein [i] .x + murstein [i] .bredde / 2)) xSpeed ​​= 5; 

Trinn 33: Bytt ballretning og fjern murstein

Følgende kode endrer ballen til Y-retningen og fjerner murstein fra scenen og vektoren.

 / * Endre ballen y retning * / ySpeed ​​= -ySpeed; removeChild (murstein [i]); bricks.splice (jeg, 1);

Hvis du vil, kan du endre denne logikken slik at ballens y-hastighet bare reverseres hvis den treffer toppen eller bunnen av en murstein, og ikke når den treffer sidene. Prøv det og se hva du synes.


Trinn 34: Legg til poeng og sjekk vinn

Hver mursteinslag vil legge til 100 til poengsummen, poengsummen blir tatt fra poengsummen konstant og lagt til nåværende poeng ved hjelp av int og string funksjoner. Denne koden kontrollerer også om det ikke er flere teglstein i Vector og viser et varsel hvis det er tilfelle.

 / * Score ++ * / scoreTF.text = String (int (scoreTF.text) + SCORE_CONST);  / * Sjekk om alle mursteinene er ødelagt * / hvis (bricks.length < 1)  alert('You Win!', 'Next Level ?'); gameEvent = 'win';  

Trinn 35: Alert Screen

Varslingsskjermbildet viser spillerens informasjon om statusen til spillet, det vises når en spillhendelse er nådd, for eksempel å miste et liv eller fullføre et nivå.

To parametere brukes i denne funksjonen:

  • t: Varsel tittelen
  • m: En kort melding
 privat sluttfunksjonsvarsel (t: String, m: String): void gameListeners ('remove'); Mouse.show (); alertScreen = ny AlertScreen (); addChild (alertScreen); TweenNano.from (alertScreen.box, 0.3, scaleX: 0.5, scaleY: 0.5, ease: Circ); alertScreen.box.titleTF.text = t; alertScreen.box.msgTF.text = m; alertScreen.box.boxB.addEventListener (MouseEvent.MOUSE_UP, start på nytt); 

Trinn 36: Start på nytt

Den neste funksjonen kontrollerer spillstatusen (seier, tap, ferdig) og utfører en handling i henhold til den.

 privat endelig gjenopprettelse (e: MouseEvent): void if (gameEvent == 'win' && levels.length> currentLevel + 1) // hvis nivået er klart, men flere nivåer er igjen currentLevel ++; changeLevel (nivåer [currentLevel]); // neste nivå levelTF.text = 'Level' + String (currentLevel + 1);  annet hvis (gameEvent == 'win' && levels.length <= currentLevel+1) //if level is clear and no more levels are available  alertScreen.box.boxB.removeEventListener(MouseEvent.MOUSE_UP, restart); removeChild(alertScreen); alertScreen = null; alert('Game Over', 'Congratulations!'); gameEvent = 'finished';  else if(gameEvent == 'lose' && lives > 0) // hvis nivået feilet, men lever> 0 changeLevel (levels [currentLevel]); // samme nivå annet hvis (gameEvent == 'lose' && lives <= 0) //if level failed and no more lives left  alertScreen.box.boxB.removeEventListener(MouseEvent.MOUSE_UP, restart); removeChild(alertScreen); alertScreen = null; alert('Game Over', 'Try Again!'); gameEvent = 'finished';  else if(gameEvent == 'finished') //reached when no more lives or levels are available  /* Add menu screen */ menuScreen = new MenuScreen(); addChild(menuScreen); menuScreen.startB.addEventListener(MouseEvent.MOUSE_UP, tweenMS); menuScreen.aboutB.addEventListener(MouseEvent.MOUSE_UP, tweenMS); TweenNano.from(menuScreen, 0.3, y: -menuScreen.height, ease: Circ); /* Reset vars */ currentLevel = 0; lives = 3; livesTF.text = String(lives); scoreTF.text = '0'; levelTF.text = 'Level ' + String(currentLevel + 1); xSpeed = 5; ySpeed = -5; clearLevel();  

Trinn 38: Endre nivå

Denne funksjonen endres til nivået som er skrevet i parameteren.

 privat endelig funksjon endringLevel (nivå: Array): void / * Clear * / clearLevel (); / * Redraw Bricks * / buildLevel (nivå); / * Start * / Mouse.hide (); bg.addEventListener (MouseEvent.MOUSE_UP, startGame); 

Trinn 39: Klar nivå

En funksjon for å fjerne de resterende mursteinene og varslene fra scenen. Det vil også tilbakestille stillingen til padle og ball.

 privat endelig funksjon clearLevel (): void / * Fjern Alert Screen * / alertScreen.box.boxB.removeEventListener (MouseEvent.MOUSE_UP, restart); removeChild (alertScreen); alertScreen = null; / * Clear Level Bricks * / var bricksLen: int = bricks.length; for (var jeg: int = 0; i < bricksLen; i++)  removeChild(bricks[i]);  bricks.length = 0; /* Reset Ball and Paddle position */ ball.x = (stage.stageWidth / 2) - (ball.width / 2); ball.y = (paddle.y - paddle.height) - (ball.height / 2) -2; paddle.x = stage.stageWidth / 2; 

Trinn 40: Sett hovedklasse


Vi bruker dokumentklassen i denne opplæringen, hvis du ikke vet hvordan du bruker den eller er litt forvirret, vennligst les denne QuickTip.


Konklusjon

Det endelige resultatet er et tilpassbart og underholdende spill, prøv å legge til din egendefinerte grafikk og nivåer!

Jeg håper du likte denne Active Premium-opplæringen, takk for å lese!