Maak een ballon knallend spel in Flash

Een van de meest populaire Flash-spellen ooit is Bloons, waarin je een aap speelt die darts gooit om ballonnen te laten knallen. Het heeft vele vervolgspellen voortgebracht, zelfs vertakkend in andere genres zoals torenverdediging. Deze tutorial laat je zien hoe je je eigen ballon-knallende game kunt maken met behulp van de QuickBox2D-engine.


Eindresultaat voorbeeld

Laten we eens kijken naar het eindresultaat waar we naartoe zullen werken:

Klik en houd ingedrukt om de hoek van de foto te bepalen. Probeer alle ballonnen te laten knappen!


Stap 1: Kort overzicht

In deze zelfstudie gebruiken we een reeks ActionScript-klassen om een ​​Bloons geïnspireerd spel te maken. Het doel van het spel is om op de ballonnen te schieten om ze allemaal te laten knallen.


Stap 2: Instellingen voor Flash-document

Open Flash en maak een 480 pixels breed, 320 pixels lang document. Stel de beeldsnelheid in op 24 fps.


Stap 3: Interface

Er wordt een kleurrijke en eenvoudige interface gebruikt met verschillende vormen, knoppen en MovieClips. In de volgende paar stappen zullen we deze GUI bouwen. De afbeeldingen van eekhoorns en eikels zijn van openclipart.org.


Stap 4: Achtergrond

Deze achtergrond is gemaakt in Flash met behulp van eenvoudige rechthoek en ovale vormen. De bruine balk onderaan zal dienen als informatiebalk.


Stap 5: Titel en ballonnen

Als u de titel wilt maken, selecteert u het gereedschap Tekst (T) en wijzigt u de kleur in #EEEEEE; schrijf je titeltekst (ik heb het lettertype GoodDog gebruikt) en voeg een eenvoudige slagschaduw toe. Selecteer de ovale tool (O) voor de ballon en maak een # FFCE47 ovaal van 20 x 30 px. Gebruik de Poly Star Tool voor de kleine driehoek eronder.


Stap 6: Knoppen

Gebruik opnieuw de Text Tool om twee knoppen te maken zoals in de bovenstaande afbeelding. Converteer ze naar knoppen en geef ze beschrijvende instantienamen zodat we ze later eenvoudig in de code kunnen gebruiken. Converteer de graphics op het podium naar een single Filmclip en noem het TitleView - vergeet niet om de Exporteren voor ActionScript-box.


Stap 7: Spelscherm

Dit is het spelscherm, dat alle dynamische en interactieve elementen van het spel bevat. Meer van hen zullen tijdens runtime worden gegenereerd met behulp van ActionScript. U kunt de instantienamen in de afbeelding hierboven lezen.


Stap 8: Credits scherm

De credits scherm verschijnt voor de Titel scherm; gebruik de afbeeldingen en lettertypen van voordat u deze maakt. Noem maar op CreditsView en vergeet niet om de Exporteren voor ActionScript doos.


Stap 9: Waarschuwing

Een waarschuwing wordt getoond als alle ballonnen zijn gepoft; het toont een game over het bericht en de score. Gebruik de Rechthoekgereedschap om het te maken en de naam van het exemplaar in te stellen AlertView. Nogmaals, markeer de Exporteren voor ActionScript doos.


Stap 10: Geluiden

We zullen geluidseffecten gebruiken om het gevoel van het spel te verbeteren; je kunt het geluid dat in dit voorbeeld wordt gebruikt in Soungle.com vinden met behulp van het trefwoord knal.


Stap 11: TweenNano

We gebruiken een andere tween-engine dan de standaard die is opgenomen in Flash, dit verhoogt de prestaties en is gemakkelijker te gebruiken.

Je kunt TweenNano downloaden van de officiële website.


Stap 12: QuickBox 2D

We zullen de handige natuurbibliotheek van QuickBox2D gebruiken om dit spel te maken. Als u hiermee niet vertrouwd bent, kunt u de Introductiereeks uit Activetuts volgen+.

U kunt QuickBox2D downloaden van de officiële website.


Stap 13: Stel de documentklasse in


We zullen onze applicatie interactief maken door een externe klasse te gebruiken. Voeg de naam toe aan de Klasse veld in de Publiceren deel van de eigenschappen panel om de FLA te koppelen aan de hoofddocumentklasse.


Stap 14: Maak een nieuwe ActionScript-klasse


Maak een nieuwe ActionScript 3.0-klasse (Cmd + N) en sla deze op als Main.as in je klasmap.


Stap 15: klassenstructuur

Maak uw standaard klassenstructuur om te beginnen met het schrijven van uw code.

 pakket import flash.display.Sprite; public class Hoofd breidt uit openbare functie Main (): void // constructor code

Stap 16: Vereiste klassen

Dit zijn de klassen die we moeten importeren voor onze klas om te werken; de importeren richtlijn maakt extern gedefinieerde klassen en pakketten beschikbaar voor uw code.

 import flash.display.MovieClip; import com.actionsnippet.qbox. *; import com.greensock.TweenNano; import com.greensock.easing.Expo; import flash.events.MouseEvent; import Box2D.Common.Math. *; import flash.events.Event; import flash.net.navigateToURL; import flash.net.URLRequest;

Stap 17: Variabelen

Dit zijn de variabelen die we zullen gebruiken. Lees de opmerkingen in de code om meer over hen te weten te komen; sommige van hun namen spreken voor zich, dus daar zal geen commentaar zijn.

 private var titleView: TitleView = new TitleView (); private var credits: CreditsView; private var world: QuickBox2D; private var acorn: QuickObject; private var acorns: Array = []; // slaat de eikels op die door particuliere var contacten zijn gegooid: QuickContacts; // gebruikt om botsingen in quickbox2d privé var-ballonnen af ​​te handelen: Array = []; // slaat de ballonnen op in het stadium privé var yImpulse: Number = 0; // verticale kracht om de eikel te schieten privé var xImpulse: int = 3; // standaard horizontale sterkte de eikel wordt gegooid private var pop: Pop = new Pop (); // het geluid in de bibliotheek

Stap 18: Constructor

De constructor is een functie die wordt uitgevoerd wanneer een object wordt gemaakt op basis van een klasse. Deze code is de eerste die wordt uitgevoerd wanneer u een exemplaar van een object maakt. De constructor van de documentklasse is een speciaal geval: het draait aan het begin van het spel.

We gebruiken dit om de nodige functies te bellen om het spel te starten. Controleer die functies in de volgende stappen.

 public final function Main (): void // Code

Stap 19: Titelweergave toevoegen

We beginnen met het toevoegen van de titelweergave van de bibliotheek aan het podium.

 addChild (titleView); startButtonListeners ();

Stap 20: Startknoppen Luisteraars

Hiermee worden de muisluisteraars toegevoegd aan de knoppen in de titelweergave, die ons naar het spel- of creditscherm leiden.

 private final function startButtonListeners (action: String = 'add'): void if (action == 'add') titleView.creditsBtn.addEventListener (MouseEvent.MOUSE_UP, showCredits); titleView.playBtn.addEventListener (MouseEvent.MOUSE_UP, showGameView);  else titleView.creditsBtn.removeEventListener (MouseEvent.MOUSE_UP, showCredits); titleView.playBtn.removeEventListener (MouseEvent.MOUSE_UP, showGameView); 

Stap 21: Toon credits

De credits scherm wordt weergegeven wanneer de gebruiker op de knop Credits klikt. Een muisluisteraar wordt volledig toegevoegd Filmclip om het te verwijderen.

 private finale functie showCredits (e: MouseEvent): void titleView.creditsBtn.visible = false; titleView.playBtn.visible = false; credits = nieuwe CreditsView (); addChild (credits); TweenNano.from (credits, 0.3, x: -credits.width, onComplete: function (): void credits.addEventListener (MouseEvent.MOUSE_UP, hideCredits);); 

Stap 22: Verberg tegoeden

Wanneer de credits op het scherm wordt geklikt, het wordt terug getweend en van het werkgebied verwijderd.

 private laatste functie hideCredits (e: MouseEvent): void TweenNano.to (credits, 0.3, x: -credits.width, onComplete: function (): void titleView.creditsBtn.visible = true; titleView.playBtn.visible = true; credits.removeEventListener (MouseEvent.MOUSE_UP, hideCredits); removeChild (credits); credits = null;); 

Stap 23: Spelweergave tonen

De volgende regels verwijderen de Titel scherm en verlaat de Spel Scherm zichtbaar. Hier noemen we ook de nodige functies om het spel te starten; deze functies worden in de volgende stappen uitgelegd.

 private finale functie showGameView (e: MouseEvent): void TweenNano.to (titleView, 0.3, y: -titleView.height, onComplete: function (): void startButtonListeners ('rmv'); removeChild (titleView); titleView = null; startGame ();); 

Laten we hier stoppen om een ​​snelle test uit te voeren en ervoor te zorgen dat onze spelcode werkt:

Houd er rekening mee dat sommige regels zijn weggelaten, omdat sommige functies nog niet zijn gemaakt.

Vergeet niet dat de mijlpalen zijn opgenomen in de bronbestanden, dus als dit om een ​​of andere reden niet in dit bestand voorkomt, kijk dan eens naar de bron om te zien wat de oorzaak is.


Stap 24: Game Luisteraars

Deze functie voegt de muisluisteraars toe die nodig zijn om de eikelschieten uit te voeren.

 private slotfunctie gameListeners (actie: String = 'add'): void if (action == 'add') bg.addEventListener (MouseEvent.MOUSE_DOWN, startCharge); bg.addEventListener (MouseEvent.MOUSE_UP, shot); restartBtn.addEventListener (MouseEvent.MOUSE_UP, restartLvl); stage.addEventListener (Event.ENTER_FRAME, update);  else bg.removeEventListener (MouseEvent.MOUSE_DOWN, startCharge); bg.removeEventListener (MouseEvent.MOUSE_UP, shot); restartBtn.removeEventListener (MouseEvent.MOUSE_UP, restartLvl); stage.removeEventListener (Event.ENTER_FRAME, update); 

Stap 25: Start Game

Hier beginnen we het spel door de Box2D-wereld te creëren en de functies aan te roepen die de ballonnen zullen maken en muisgebeurtenissen afhandelen.

 private final function startGame (): void / * Hide gCircle * / gCircle.visible = false; / * Nieuwe B2D-wereld * / world = nieuwe QuickBox2D (deze, debug: 0); contacten = world.addContactListener (); contacts.addEventListener (QuickContacts.ADD, onAdd); / * Maak ballonfunctie * / gameListeners (); createBalloons (); 

Stap 26: Maak ballonnen

genesteld voor loops worden gebruikt om de ballonnen op het podium te plaatsen. Deze functie gebruikt de QuickBox2D addBox methode om een ​​nieuw Box2D-object te maken dat wordt ingesteld als een Sensor - dit betekent dat er geen fysische reactie op de botsing zal zijn (d.w.z. de eikel zal er niet vanaf botsen), maar een botsing zal nog steeds worden gedetecteerd. Met behulp van deze methode kunnen we de ballon vernietigen, maar laat de eikel verder gaan alsof er niets gebeurd is.

De ballon wordt dan toegevoegd aan een array; dit geeft ons toegang tot alle ballonnen buiten deze functie.

 private laatste functie createBalloons (h: int = 5, v: int = 3): void for (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(); 

Natuurlijk hoeft u geen genest te gebruiken voor lussen om de ballonnen te positioneren; dit is de gemakkelijkste manier om ze in een raster te plaatsen, maar u kunt ze handmatig plaatsen als u dat wilt.


Stap 27: Collision Detection

Deze functie handelt de botsing af die in stap 26 wordt genoemd. Het eerste dat u moet doen, is door de reeks van ballonnen gaan en elke ballon controleren om te zien of deze in botsing komt met de eikel.

 private finale functie onAdd (e: Event): void for (var i: int = 0; i < balloons.length; i++)  if(contacts.isCurrentContact(balloons[i], acorn)) 

Stap 28: Ballon vernietigen

Als de botsing waar is, noemen we de vernietigen() methode van de ballon QuickObject en verwijder het element uit de array.

 ballons [i] .destroy (); balloons.plice (i, 1);

Stap 29: speel geluid

Daarna spelen we een geluid dat de slag aangeeft, waardoor het spelgevoel verbetert.

 pop.play ();

Stap 30: Update Score en Target Counters

De score- en doeltellers worden bijgewerkt volgens de ballonnen die zijn gepoft en de ballonnen zijn overgebleven.

 scoreTF.text = String (int (scoreTF.text) + 50); targetTF.text = String (balloons.length);

Stap 31: Controleer of Level voltooid is

Er wordt een melding gegeven wanneer alle ballonnen zijn gepoft; we zullen deze functie later in de tutorial zien.

 if (targetTF.text == '0') alert (); 

Stap 32: Start Charge

Deze code zal de richtingaanwijzer van de eikel onthullen, de y-impulsvariabele van de eikel resetten en een enterframe luisteraar toevoegen die het doel zal behandelen.

 private finale functie startCharge (e: MouseEvent): void yImpulse = 0; gCircle.visible = true; gCircle.addEventListener (Event.ENTER_FRAME, charge); 

Stap 33: opladen

De doelindicator draait om de richting weer te geven waarin de eikel zal worden afgevuurd en past de y-impulsvariabele dienovereenkomstig aan. De richting van de opname wordt beïnvloed door twee variabelen, xImpulse en yImpulse, die worden gecombineerd om een ​​te vormen impuls vector later. xImpulse blijft constant, en yImpulse wordt gewijzigd als de gebruiker de muisknop ingedrukt houdt.

 privé uiteindelijke functielading (e: Event): void gCircle.rotation - = 3; yImpulse - = 0,2; / * Voorkom overbrugging * / if (gCircle.rotation < -80)  yImpulse = -5.4; gCircle.rotation = -80;  

Stap 34: Schot

De volgende acties vinden plaats wanneer de muisknop omhoog staat.

 privé uiteindelijke functie shot (e: MouseEvent): void / * Hide gCircle * / gCircle.removeEventListener (Event.ENTER_FRAME, charge); gCircle.visible = false; gCircle.rotation = 0; / * Maak nieuwe Acorn * / acorn = world.addBox (x: 2.76, y: 7.33, width: 0.66, height: 0.53, skin: Acorn, fixedRotation: true, draggable: false, density: 1); acorns.push (acorn); / * Schiet eikel * / var-impuls: b2Vec2 = nieuwe b2Vec2 (xImpulse, yImpulse); acorn.body.ApplyImpulse (impulse, acorn.body.GetWorldCenter ()); / * Update Acorn-teller * / acornsTF.text = String (int (acornsTF.text) -1); 

Laten we hier stoppen om een ​​snelle test uit te voeren en ervoor te zorgen dat onze spelcode werkt:

Houd er rekening mee dat sommige regels zijn weggelaten omdat deze functies nog niet zijn gemaakt.


Stap 35: Update-functie

De update-functie voert een reeks EnterFrame-bewerkingen uit. Laten we die acties in de volgende stappen bekijken.

 update van privé-finale functie (e: Event): void 

Stap 36: Verwijder Eikels uit het toneel

De volgende regels verwijderen elke eikel die van het podium af gaat.

 / * Verwijder eikels op het toneel * / for (var i: int = 0; i < acorns.length; i++)  if(acorns[i].y > 10.66) eikels [i] .destroy (); acorns.splice (i, 1);

Stap 37: Controleer of het niveau mislukt is

Het spel is afgelopen als de speler geen eikels meer heeft (of alle ballonnen vernietigt zoals eerder vermeld).

 / * Controleer of het niveau mislukt is * / if (int (acornsTF.text) <= 0)  alert('lose');    

Stap 38: start het level opnieuw

Deze code wordt uitgevoerd wanneer op de knop Opnieuw opstarten wordt geklikt. Het zal de nodige variabelen en luisteraars resetten om het niveau opnieuw te starten.

 private laatste functie restartLvl (e: MouseEvent): void / * Luisteraars verwijderen * / gameListeners ('rmv'); / * Vernietig World * / world = null; / * Vernietig ballonnen, reset score en eikels * / voor (var i: int = 0; i < balloons.length; i++)  balloons[i].destroy(); scoreTF.text = '0'; acornsTF.text = '5';  balloons = [];//clear balloons array startGame(); 

Stap 39: Waarschuwing

Met deze functie wordt het spel gestopt en het bericht Game Over getoond. Het voegt ook een muisluisteraar toe om het spel te resetten wanneer erop wordt geklikt.

 private laatste functie alert (gameState: String = 'win'): void gameListeners ('rmv'); world.stop (); var alert: AlertView = nieuwe AlertView (); alert.x = stage.stageWidth * 0.5; alert.y = stage.stageHeight * 0.5; alert.scoreTF.text = score TF.text; alert.addEventListener (MouseEvent.MOUSE_UP, restart); if (gameState == 'lose') alert.titleTF.text = 'Level Failed!';  addChild (waarschuwing); TweenNano.from (alert, 0.6, scaleX: 0.2, scaleY: 0.2, ease: Expo.easeOut); 

Stap 40: start opnieuw op

Deze code laadt de SWF opnieuw, herstelt alle waarden en keert terug naar het beginscherm.

 privé laatste functie opnieuw opstarten (e: MouseEvent): void navigateToURL (nieuwe URLRequest (stage.loaderInfo.url), '_level0'); 

Conclusie

Maak je eigen aanpassingen aan het spel en geniet ervan om het te maken. Misschien kunt u de lay-out van de ballonnen wijzigen of nieuwe niveaus toevoegen of de afbeeldingen wijzigen.

Ik hoop dat je deze tutorial leuk vond, bedankt voor het lezen!