Lag et Space Shooter-spill i Flash ved hjelp av AS3

Følg de fremadrettede trinnene i denne Premium Tutorial for å lage en underholdende skyting med Flash og AS3.


Trinn 1: Kort oversikt

Ved å bruke pre-made sprites og Flash Tools, vil vi skape et flott grafisk grensesnitt som vil bli drevet av flere ActionScript 3-klasser.

Brukeren vil kunne styre et romskip og skyte flere fiender mens du reiser i rommet.


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


Grensesnittet vårt vil bestå av flere sprites, tekstfelt og filmklipp.

Fortsett videre til de neste trinnene, og vi vil se på hvordan du lager den.


Trinn 4: Bakgrunn

Bakgrunnen vil være veldig enkel, da stjernene genereres ved hjelp av ActionScript.

Lag et 320x480 px rektangel og fyll det med svart. Du kan legge til en liten radiell gradient.


Bruk Justeringspanelet (Cmd + K) for å sentrere det i scenen.


Trinn 5: Sprites

Jeg har brukt et flott sprite-bibliotek i demonstrasjonen av denne opplæringen, disse er en del av SpriteLib av Flying Yogi.



Trinn 6: Sprite MovieClips

Importer sprites til scenen (Cmd + R), konverter dem til MovieClips, og juster rammene for å vise en fin animasjon.



Trinn 7: Score TextField

En Dynamic TextField vil være nødvendig for å vise spillresultatet. Bruk tekstverktøyet (T) til å lage en; navngi det scoreTF og legg den i nederste venstre hjørne av scenen.



Trinn 8: Legge inn skrifttype

For å kunne bruke en egendefinert skrift i et dynamisk tekstfelt må du legge det inn i programmet. Velg tekstfeltet og bruk Eiendommer panelets embed? knappen for å legge til de nødvendige tegnene.



Trinn 9: Alertvisning

Varslingsvisningen vil bli vist når brukeren når en spilltilstand, (seier, tap). Bruk ønsket skrift for å lage en enkel skjerm med to dynamiske tekstfelter; navn dem titleTF og msgTF, konverter boksen til en MovieClip og angi klassenavnet til AlertView.



Trinn 10: Lyder


Vi bruker lydeffekter for å forbedre følelsen av spillet, du kan finne lydene som brukes i dette eksemplet i Soungle.com ved hjelp av søkeordene plass, eksplosjon og laser.


Trinn 11: Tween Nano


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

Du kan laste ned Tween Nano fra sitt offisielle nettsted.


Trinn 12: Ny ActionScript-klasse

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



Trinn 13: 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 14: Påkrevde klasser

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

 importer flash.display.Sprite; importere flash.ui.Mouse; importer com.greensock.TweenNano; importer com.greensock.easing.Expo; importer flash.events.MouseEvent; importere flash.events.Event; importere flash.utils.Timer; importer flash.events.TimerEvent;

Trinn 15: Variabler

Dette er variablene vi skal bruke, les kommentarene i koden for å få vite mer om dem.

 private var stjerner: Sprite; // Vil lagre stjernene bakgrunnen private var starsCopy: Sprite; // En annen versjon av stjernene bakgrunnen privat var skipet: Skip; private var kuler: Vector. = Ny Vector.(); // Vil holde kulene i scene private var fiender: Array = new Array (); // Vil holde fiender i scenen privat var-timer: Timer = Ny Timer (500); // Tiden der en ny fiende vil vises privat var alertView: AlertView; private var liv: Vector.; // Vil lagre livene grafikk privat var sjef: Boss; privat var sjefHelse: int = 20; privat var laserSound: Laser = ny Laser (); privat var sjefSound: UFO = ny UFO (); privat var exSound: eksplosjon = ny eksplosjon ();

Trinn 16: Konstruktorkode

Konstruktøren er en funksjon som kjører når et objekt er opprettet 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 ved hjelp av dokumentklassen.

Det kaller de nødvendige funksjonene for å starte spillet. Kontroller disse funksjonene i de neste trinnene.

 offentlig sluttfunksjon Main (): void
buildStars (200); // Denne funksjonen starter spillopprettelsen

Trinn 17: Bygg stjerner

De buildStars () Metoden bruker Star MC i biblioteket for å lage en bakgrunn med tilfeldig plasserte stjerner. To sprites er opprettet for å tween begge dem og simulere bevegelse, ved hjelp av det samme trikset som i denne parallellrulleopplæringen.

 privat endelig funksjon buildStars (n: int): void stars = new Sprite (); for (var jeg: int = 0; i < n; i++)  var star:Star = new Star(); star.alpha = Math.random() * 1; star.scaleX = Math.random() * 1; star.scaleY = star.scaleX; star.x = Math.floor(Math.random() * stage.stageWidth); star.y = Math.floor(Math.random() * stage.stageHeight-20); stars.addChild(star);  /* Create another stars sprite to make animation */ starsCopy = new Sprite(); for(var j:int = 0; j < n; j++)  var star2:Star = new Star(); star2.alpha = Math.random() * 1 + 0.2; star2.scaleX = Math.random() * 1; star2.scaleY = star.scaleX; star2.x = Math.floor(Math.random() * stage.stageWidth); star2.y = Math.floor(Math.random() * stage.stageHeight-20); starsCopy.addChild(star2);  starsCopy.y = -stage.stageHeight; addChild(starsCopy); addChild(stars); addShip(); //Add ship (player) to stage 

Trinn 18: Legg til skip

Denne funksjonen skaper en forekomst av Ship MC i biblioteket og plasserer den på scenen med en fin animasjon.

 privat endelig funksjon addShip (): void ship = new Ship (); ship.x = stage.stageWidth * 0,5; ship.y = scene.stageHeight + ship.height; addChild (skip); TweenNano.to (skip, 2, y: (scene.stageHeight - ship.height) - 10, lette: Expo.easeOut, onComplete: lyttere ()); addLives (); 

Trinn 19: Legg til liv

Gjenbruk av Ship MC, tre skip sprites blir lagt til scenen som en liv indikator. Skipene legges til en Vector for å se etter spillet senere i spillet.

 privat endelige funksjon addLives (): void lives = new Vector.(); for (var jeg: int = 0; i < 3; i++)  var live:Ship = new Ship(); live.stop(); live.width = 16; live.height = 16; live.x = (stage.stageWidth - live.width * 0.7) - (5 * i+1) - live.width * i; live.y = stage.stageHeight - live.height * 0.7; addChild(live); lives.push(live);  

Trinn 20: Legg til lyttere

Disse linjene vil legge til de nødvendige lytterne til scenen og timeren; Dette inkluderer mushendelse, Timer-hendelser og og EnterFrame-hendelser som vil oppdatere spillet hver ramme.

 private endelige funksjon lyttere (handling: String = 'add'): void if (action == 'add') stage.addEventListener (MouseEvent.MOUSE_MOVE, moveShip); stage.addEventListener (MouseEvent.MOUSE_DOWN, skyt); timer.addEventListener (TimerEvent.TIMER, addEnemy); stage.addEventListener (Event.ENTER_FRAME, oppdatering); timer.start ();  else stage.removeEventListener (MouseEvent.MOUSE_MOVE, moveShip); scene.removeEventListener (MouseEvent.MOUSE_DOWN, shoot); timer.removeEventListener (TimerEvent.TIMER, addEnemy); stage.removeEventListener (Event.ENTER_FRAME, oppdatering); timer.stop (); 

Trinn 21: Flytt skip

Spillerens skip vil være musekontrollert, den neste funksjonen håndterer at:

 privat endelig funksjon moveShip (e: MouseEvent): void ship.x = mouseX; 

Trinn 22: Skyt

Vårt skip vil kunne skyte kuler for å ødelegge og beskytte seg mot fiender. Denne funksjonen løper hver gang brukeren klikker scenen og vil plassere en kule foran skipet som senere flyttes av Oppdater() funksjon. Det spiller også en skytelyd.

 privat endelige funksjonsskyting (e: MouseEvent): void var bullet: Bullet = new Bullet (); bullet.x = ship.x; bullet.y = ship.y - (ship.height * 0.5); laserSound.play (); // Spill lydkuler.push (kule); addChild (bullet); 

Trinn 23: Legg til Enemy

Det ville ikke være en skytter uten noe å skyte. Fiender er skapt av den neste funksjonen, en Timer brukes til å lage en fiende hver 500 millisekunder (du kan endre verdien i variablertrinnet) som senere flyttes av Oppdater() funksjon.

 privat endelig funksjon addEnemy (e: TimerEvent): void var fiende: Enemy = new Enemy (); enemy.x = Math.floor (Math.random () * (scene.stageWidth - enemy.width)); fiende.y = -emy.height; enemies.push (fiende); addChild (fiende); 

Trinn 24: Alertvisning

Varslingsvisningen viser spillerens informasjon om statusen til spillet, det vises når en spillhendelse er nådd.

To parametere brukes i denne funksjonen:

  • t: Varsel tittelen
  • m: En kort melding
 privat sluttfunksjonsvarsel (t: String, m: String): void listeners ('remove'); / * Opprett og vis varsel * / alertView = ny AlertView (); alertView.x = stage.stageWidth * 0,5; alertView.y = scene.stageHeight * 0,5; alertView.titleTF.text = t; alertView.msgTF.text = m; alertView.addEventListener (MouseEvent.MOUSE_UP, start på nytt); addChild (alertView); 

Trinn 25: Oppdatering

De Oppdater() funksjonen utføres hver ramme, den håndterer alle spillbevegelser og kollisjoner. Det er spillsløyfen for dette spillet. Ta en titt på de neste trinnene for å se sin oppførsel.

 privat endelig funksjon oppdatering (e: Event): void // code

Trinn 26: Flytt bakgrunn

Bakgrunnen flyttes hver ramme for å simulere romreise; når bunnstjernen sprite når scenegrensen, flyttes den tilbake til toppen, og skaper en loop.

 stars.y + = 5; starsCopy.y + = 5; hvis (stars.y> = scene.stageHeight - 20) stars.y = -stars.height;  annet hvis (starsCopy.y> = scene.stageHeight - 20) starsCopy.y = -stars.height; 

Trinn 27: Flytt kuler

De neste kodelinjene kontrollerer om det er kuler i scenen; Hvis det er sant, blir kulene flyttet oppover; Når en kule ikke lenger er synlig, blir den ødelagt.

 hvis (bullets.length! = 0) for (var i: int = 0; i < bullets.length; i++)  bullets[i].y -= 10; /* Destroy offstage bullets */ if(bullets[i].y < 0)  removeChild(bullets[i]); bullets[i] = null; bullets.splice(i, 1);   

Trinn 28: Boss

Vi legger til en stor og dårlig sjef i spillet. Når brukeren når bestemt score, vil sjefen vises:

 hvis (int (scoreTF.text) == 500 && boss == null) boss = ny Boss (); bossSound.play (); boss.x = scene.stageWidth * 0,5; boss.y = -boss.height; TweenNano.to (sjef, 3, y: 80); addChild (boss); 

Trinn 29: Flytt fiendene

Fiender blir også flyttet hver ramme. Denne koden finner alle fiender i scenen ved hjelp av arrayen og beveger dem 5px nedover.

 hvis (enemies.length! = 0) for (var j: int = 0; j < enemies.length; j++)  /* Move enemies */ enemies[j].y += 5;

Trinn 30: Enemy-Ship Collision

Her ser vi om en fiende kolliderer med spillerens skip; hvis det gjøres, utføres en rekke handlinger som starter med eksplosjonslyden:

 / * hvis fienden treffer spilleren * / hvis (fiender [j] .hitTestObject (skip)) exSound.play ();

Trinn 31: Destroy Enemy

Etter å ha spilt lyden fjernes fienden fra scenen og arrayet, og er satt til null for å (til slutt) rydde det fra minnet.

 / * Fjern fiende * / removeChild (fiender [j]); fiender [j] = null; enemies.splice (j, 1);

Trinn 32: Fjern Live

En av livtellerens ikoner vil også bli fjernet på samme måte som fienden.

 / * Fjern Live * / removeChild (lever [lives.length-1]); lever [lives.length-1] = null; lives.splice (lives.length-1, 1);

Trinn 33: Test for spillover

Deretter sjekker vi livnummeret, hvis spilleren er ute av liv bruker vi varslingsmetoden for å vise et varsel som indikerer spillet over. Hvis det fortsatt er liv, er skipet animert inn i scenen.

 / * Hvis ingen lever igjen, spill over * / if (lives.length == 0) alert ('Spill over', 'Klikk for å fortsette');  ellers / * Tween Ship * / ship.y = scene.stageHeight + ship.height; TweenNano.to (skip, 2, y: (scene.stageHeight - ship.height), lette: Expo.easeOut); 

Trinn 34: Hit Boss

Følgende kode håndterer sjefskollisjonene, den bruker den samme metoden som brukes i fiendeskipskollisjonen. Her bruker vi bossHealth variabel for å bestemme når sjefen er beseiret.

 for (var k: int = 0; k < bullets.length; k++)  /* Hit Boss */ if(boss != null && bullets[k].hitTestObject(boss))  exSound.play(); removeChild(bullets[k]); bullets[k] = null; bullets.splice(k, 1); bossHealth--; scoreTF.text = String(int(scoreTF.text) + 50);  if(bossHealth <= 0 && boss != null)  removeChild(boss); boss = null; alert('You Won', 'Click to continue'); 

Trinn 35: Bullet-Enemy Collision

En annen kollisjonsdeteksjonskode. Kulene i gruppen er testet for kollisjon med fiender; Når dette skjer, blir begge fjernet fra scenen og deres arrays.

 / * hvis kulen rammer fienden * / hvis (bullets.length! = 0 && fiender [j]! = null && bullets [k] .hitTestObject (fiender [j])) exSound.play (); // Spill lyden fjernChild (fiender [j]); fiender [j] = null; enemies.splice (j, 1); removeChild (kuler [k]); kuler [k] = null; bullets.splice (k, 1); scoreTF.text = String (int (scoreTF.text) + 50); // Legg til poeng til tekstfeltet i scenen

Trinn 36: Start på nytt

Restart funksjon() kalles av varsling() funksjon, håndterer de nødvendige operasjoner for å tilbakestille spillet og starte det på nytt.

 privat endelig funksjonstart (e: MouseEvent): void // code

Trinn 37: Fjern Sprites

Den første delen av omstart() funksjonen håndterer sprites, de neste kodelinjene fjerner alle bildene fra scenen.

 / * Fjern grafikk * / removeChild (skip); skip = null; for (var jeg: int = 0; i < bullets.length; i++)  removeChild(bullets[i]); bullets[i] = null;  bullets.length = 0; for(var j:int = 0; j < enemies.length; j++)  removeChild(enemies[j]); enemies[j] = null;  enemies.length = 0; for(var k:int = 0; k < lives.length; k++)  removeChild(lives[k]); lives[k] = null;  lives.length = 0; removeChild(stars); stars = null; removeChild(starsCopy); starsCopy = null; if(boss != null)  removeChild(boss); boss = null; 

Trinn 38: Fjern varsel

Den neste delen av omstart() fjerner varselvisningen fra scenen:

 / * Fjern varsel * / removeChild (alertView); alertView = null;

Trinn 39: Tilbakestill Score / Boss Health

I neste del av omstart(), Resultatet og sjefshelsevariablene er tilbakestilt:

 / * Reset Score * / scoreTF.text = '0'; / * Tilbakestill Boss Helse * / bossHealth = 50;

Trinn 40: Ring omstartsmetode

Til slutt, på slutten av omstart(), vi kaller metoden som starter alt:

 / * Restart * / buildStars (200);

Trinn 41: Dokumentklasse


Legg klassenavnet til Klasse felt i publisere delen av Eiendommer panel for å knytte FLA til hoveddokumentklassen.


Konklusjon

Du har lært hvordan du lager et Space Shooter-spill med alle de grunnleggende funksjonene, prøv å utvide det med det du allerede vet!

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