Double Down met een Awesome Flash BlackJack Game

In deze Premium-zelfstudie bouwen we een geweldige BlackJack-game vanaf nul met behulp van Flash en AS3.



Stap 1: Kort overzicht

Met behulp van de Flash-tekengereedschappen maken we een goed uitziende grafische interface die wordt aangedreven door verschillende ActionScript 3-klassen.

De gebruiker kan inzetten op de cpu en spelen op basis van de willekeurig gegenereerde kaarten.


Stap 2: Documentinstellingen

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



Stap 3: Interface


Er wordt een kleurrijke, mooi uitziende interface weergegeven, dit omvat meerdere vormen, knoppen, bitmaps en meer.

Ga door naar de volgende stappen voor meer informatie over het maken van deze GUI.


Stap 4: Pokervormen


We moeten de vormen van de pokerkaarten maken of krijgen om de kaarten te maken, een eenvoudige manier om dit te doen is een lettertype gebruiken.

Ga naar deze website en kopieer en plak de symbolen in uw FLA-bestand. Je kunt ze converteren naar MovieClips om ze gemakkelijk te kunnen verwerken.


Stap 5: Hoofdscherm


Dit is het hoofdscherm of scherm, het zal de eerste afbeelding zijn die in onze game verschijnt, ga verder met de volgende stap om te beginnen met het maken ervan.


Stap 6: Achtergrond

Maak een rechthoek van 320x480 px en vul deze met de volgende radiale gradiënt: # 2c753d, # 3b9d52.


Met behulp van het gereedschap Rechthoek en de pokervormen die we eerder hebben gemaakt, vormen we een patroon om onze achtergrond er beter uit te laten zien.


Dupliceer het patroon en rangschik het om de volledige achtergrondgradiënt te dekken.


U kunt uw achtergrond converteren naar een enkele afbeelding en deze centreren of het Flash-exportmenu gebruiken om een ​​gesegmenteerde png-afbeelding te krijgen. Ik gebruikte de png-optie en kwam met zoiets als dit:


Converteer de definitieve afbeelding naar MovieClip en noem deze bg.

Voor de hoofdweergave gebruiken we een zwart verloop bovenaan deze achtergrond, dupliceren het groene verloop, veranderen de kleur in zwart en de alpha-waarden in (0, 70).



Stap 7: Titel

Selecteer het Tekstgereedschap (T), selecteer een goed uitziend lettertype om de titel van je spel te schrijven en pas dit radiaal verloop toe: # a08c66, # f6e7be.


Converteer de tekst naar MovieClip en pas het volgende filter toe:


Je kunt ook een pokervorm als detail toevoegen:



Stap 8: knopinfo

De tooltip toont de gebruiker een instructie in de hoofdweergave.

Maak een 84x23px afgeronde rechthoek en vul deze met een verloop van # 000000 tot # 333333, verander de hoekradius naar 6.


Dupliceer de vorm en draai deze verticaal, verander de grootte naar 80x18px en centreer deze in de laatste vorm.


Gebruik het Polystar-gereedschap om een ​​driehoek te maken en plaats deze onderaan in het midden van de werkelijke vorm.


Voeg ten slotte een TextField (T) toe en centreer het.



Stap 9: Chips

Tijd voor de chips.

Begin met een eenvoudige zwarte cirkel en gebruik het lijntool (N) om een ​​witte cirkel met streepjes in de vorm te maken:


Gebruik het gereedschap Rechthoek om een ​​plussymbool te maken en dit te gebruiken om de chip te versieren. U kunt ook een logo of een andere afbeelding toevoegen aan het midden van de chip.


Er zal ook een witte chip worden gebruikt, verander gewoon de zwarte vormen naar wit en omgekeerd.



Stap 10: Informatieknop

De infoknop belt de About View wanneer erop wordt geklikt.

Maak een witte cirkel van 16x16px en wijzig de alpha in 15%. Gebruik de Teksttool (T) om een ​​cursieve i te schrijven.


Converteer de vormen naar Knop en noem deze infoButton.


Stap 11: Kaarten cardback

Gebruik het Primitive Tool Rechthoek om een ​​66x86px, # 858D8F vorm te maken en verander de hoekradius in 16.


Dupliceer de vorm en verklein de vorm met 4 pixels, pas dit verloop toe: #FFFDFC, #DCDDDF.


Converteer de afbeeldingen naar MovieClip en gebruik de slagschaduwfilter die we eerder in de titel gebruikten.


Gebruik de overeenkomstige pokervorm en centreer deze in de kaart.


Dupliceer de vorm en gebruik het tekstgereedschap (T) om een ​​statisch tekstveld te maken in de linkerbovenhoek.


Herhaal dit proces met de benodigde kaarten en gebruik de functie Afbeelding exporteren in Flash om de kaarten in png-indeling te maken. Bewaar de kaarten in een map genaamd afbeeldingen.


Vergeet niet om ze een eenvoudige en beschrijvende naam te geven om het laden te vergemakkelijken. Ik heb twee letters gebruikt, de eerste letter van de kaartvorm en het nummer.


Stap 12: Over het scherm

Het scherm Info toont de credits, het jaar en het copyright van het spel.

Het zal vrij eenvoudig zijn om te creëren omdat we al alle elementen erin hebben gebruikt.



Stap 13: Spelscherm


Dit is de gameweergave, deze gebruikt de originele lichtgroene achtergrond en een onderste balk die de weddenschappen en balans toont.

Twee dynamische tekstvelden worden gebruikt, balans en inzet. Er is ook een knop met de naam stayButton, waardoor het spel stopt en de kaarttesten worden uitgevoerd.


Stap 14: kaartteller

Een tooltip-achtige afbeelding toont de werkelijke score van de speler terwijl dezelfde afbeelding een a laat zien ? op de dealer.


Gebruik de grafiekinfo om een ​​vakje van 30x24px te maken, maak een dynamisch tekstveld en noem het n. Converteer ze naar MovieClip en markeer het vak Exporteren voor ActionScript, stel de klassenaam in op CardCounter.


Stap 15: Bet Panel

Het inzetpaneel geeft de informatie over de weddenschappen weer.

De speler kan inzetten in veelvouden van 100 en 500.


Hier zijn de instantienamen van de interactieve objecten:

  • White Chip: wit.
  • Black Chip: zwart.
  • Ok knop: okButton.

Converteer de objecten naar een enkele MovieClip en markeer het vak Exporteren voor ActionScript, stel de klassenaam in BetPanel.


Stap 16: Waarschuwingsscherm

Dit scherm verschijnt wanneer het spel is beslist, of je wint, verliest of je bereikt het spel (wanneer de speler alle chips verliest).

Een dynamisch tekstveld wordt gebruikt in deze weergave om de status weer te geven waarin het spel zich bevindt. Dit TextField wordt genoemd tekst, en het is binnen de genoemde zwarte doos berichten box.


Converteer de grafische groep naar een MovieClip en markeer het vak Exporteren voor ActionScript; stel de klassenaam in AlertScreen.

Hiermee beëindigt u het grafische gedeelte, laat het ActionScript starten!


Stap 17: Nieuwe ActionScript-klasse

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



Stap 18: Tween Nano


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

Je kunt Tween Nano downloaden van de officiële website.


Stap 19: Pakket

Met het sleutelwoord van het pakket kunt u uw code indelen in groepen die door andere scripts kunnen worden geïmporteerd. Het wordt aanbevolen deze een naam te geven, te beginnen met een kleine letter en intercaps te gebruiken voor volgende woorden, bijvoorbeeld: mijn lessen. Het is ook gebruikelijk om ze een naam te geven via de website van uw bedrijf: com.mycompany.classesType.myClass.

In dit voorbeeld gebruiken we een enkele klasse, dus het is niet echt nodig om een ​​klassenmap te maken.

 pakket 

Stap 20: Importrichtlijn

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.Sprite; import flash.display.Loader; import flash.net.URLRequest; import flash.events.Event; import flash.events.MouseEvent; import com.greensock.TweenNano; import com.greensock.easing.Elastic;

Stap 21: Class Declaration

Hier verklaren we de klas met behulp van de klasse definitie sleutelwoord gevolgd door de naam die we voor de klas willen, onthoud dat je het bestand met deze naam moet opslaan.

De strekt keyword definieert een klasse die een subklasse van een andere klasse is. De subklasse erft alle methoden, eigenschappen en functies, op die manier kunnen we ze in onze klasse gebruiken.

 publieke slotklasse Main breidt 

Stap 22: Variabelen

Dit zijn de variabelen die we zullen gebruiken, lees de opmerkingen in de code om meer over hen te weten.

 private var aboutView: AboutView = new AboutView (); // Een exemplaar van het scherm ongeveer vóór privé vartype: Vector. = nieuwe Vector.(); // Bevat het vormtype van het privé-nummer van de kaarten: Vector. = nieuwe Vector.(); // Bevat de beschikbare kaartnummers private var xPos: Vector. = nieuwe Vector.(); // Slaat de X-posities op waar kaarten privé kunnen worden geplaatst. YPos: Vector. = nieuwe Vector.(); private var betPanel: BetPanel = nieuwe BetPanel (); // Een instantie van het bet panel private var currentBet: int = 0; // Het bedrag van de huidige weddenschap private var cardGFX: Vector. = nieuwe Vector.(); // Slaat alle kaarten op die zijn geladen private var cardTerug: CardBack = new CardBack (); // Exemplaar van de achterkant van een kaart private var additionalCards: int = 0; // De spelerskaarten die zijn geladen na de eerste 2 privévadditionalCards: int = 0; private var dealerCounter: CardCounter = nieuwe CardCounter (); // Geeft de som van de kaarten van de dealer weer private var playerCounter: CardCounter = new CardCounter (); privé var dScore: int = 0; // Slaat de som van de kaarten van de dealer op private var pScore: int = 0; privé var-waarschuwing: AlertScreen = nieuw AlertScreen (); // Een instantie van het waarschuwingsscherm private var isNewGame: Boolean = false; // Gebruikt om een ​​nieuw spel te starten als het waar is

Stap 23: 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 of wordt uitgevoerd met behulp van de documentklasse.

Het roept de nodige functies op om het spel te starten. Controleer die functies in de volgende stappen.

 public final function Main (): void // Code ...

Stap 24: Stel de waarde van de vector in

In de constructorfunctie stellen we de waarden in van de vectoren die eerder zijn gedeclareerd.

  • Type: Slaat de initialen van het decktype op, c voor klaveren, d voor ruiten enzovoorts.
  • Aantal: Slaat het kaartnummer op. Het gebruikt 11, 12 en 13 als J, Q en K.
  • xPos, yPos: Slaat de X- en Y-posities op waar kaarten kunnen worden geplaatst
 public final function Main (): void type.push ('c', 'd', 'h', 's'); number.push ('2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13 '); xPos.push (97, 158, 36, 219); yPos.push (30, 330); 

Stap 25: Hoofdweergave Luisteraars

Muisluisteraars worden toegevoegd aan de infoButton en de hoofdaanzicht MovieClip, deze luisteraars schakelen tussen weergaven.

 public final function Main (): void type.push ('c', 'd', 'h', 's'); number.push ('2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13 '); xPos.push (97, 158, 36, 219); yPos.push (30, 330); / * Hoofdweergave Luisteraars * / infoButton.addEventListener (MouseEvent.MOUSE_UP, addAboutView); mainView.addEventListener (MouseEvent.MOUSE_UP, tweenMainView); 

Stap 26: Tween Hoofdweergave

Deze functie verwijdert de infoButton en tweens de hoofdaanzicht op met behulp van TweenNano; wanneer de animatie voorbij is, wordt een functie gebeld.

 private finale functie tweenMainView (e: MouseEvent): void removeChild (infoButton); TweenNano.to (mainView, 0.4, y: -480, onComplete: removeMainView); 

Stap 27: Hoofdweergave verwijderen

De volgende code wordt gebruikt om het te vernietigen hoofdaanzicht. Het roept ook de functie aan die het inzetpaneel zal tonen.

 private laatste functie removeMainView (): void mainView.removeEventListener (MouseEvent.MOUSE_UP, removeMainView); removeChild (MAINVIEW); mainView = null; addBetPanel (); 

Stap 28: Over bekijken

De weergave Info wordt weergegeven wanneer de gebruiker op de InfoButton op het hoofdscherm klikt. De volgende regels behandelen dat.

 private finale functie addAboutView (e: MouseEvent): void aboutView.x = 0; // Herstelt de positie in het geval dat de weergave opnieuw wordt aangeroepen addChild (aboutView); TweenNano.from (overView, 0.4, x: -320); aboutView.addEventListener (MouseEvent.MOUSE_UP, hideAboutView);  private laatste functie hideAboutView (e: MouseEvent): void aboutView.removeEventListener (MouseEvent.MOUSE_UP, hideAboutView); TweenNano.to (aboutView, 0.4, x: -320, onComplete: removeAboutView);  private final-functie removeAboutView (): void removeChild (aboutView); 

Stap 29: Inzetpaneel toevoegen

Laten we nu het inzetpaneel toevoegen, dit zal worden gebruikt om het inzetbedrag te kiezen voordat het spel begint.

 private finale functie addBetPanel (): void / * Bet Panel * / betPanel.y = stage.stageHeight / 2; // Centre it betPanel.white.addEventListener (MouseEvent.MOUSE_UP, makeBet); // Muisluisteraars betPanel.black.addEventListener (MouseEvent.MOUSE_UP, makeBet); addChild (betPanel); TweenNano.to (betPanel, 0.7, x: stage.stageWidth / 2, ease: Elastic.easeOut); / * OK / Stay-knoppen standaard verborgen / uitgeschakeld * / betPanel.okButton.visible = false; stayButton.visible = false; 

Stap 30: Zet in

De makeBet () functie verwerkt zowel witte als zwarte chips.

De witte chip voegt 100 toe aan de inzet en de zwarte voegt er 500 aan toe.

 private finale functie makeBet (e: MouseEvent): void var balanceInt: int = int (balance.text); // Converteer de saldotekst naar int var betAmount: int = 0; // Bewaart het bedrag dat aan de weddenschap moet worden toegevoegd / * Controleer op welke chip is geklikt * / e.target.name == 'wit'? betAmount = 100: betAmount = 500; / * Controleer of er voldoende saldo * / if is (balanceInt> = betAmount) / * OK-knop inschakelen * / betPanel.okButton.visible = true; betPanel.okButton.addEventListener (MouseEvent.MOUSE_UP, init); currentBet + = betAmount * 2; balance.text = String (balanceInt - betAmount); balanceLP.text = balance.text; / * Huidige wedtekst * / bet.text = String (currentBet); betLP.text = String (currentBet); 

Stap 31: Verwijder het inzetpaneel

Deze regels zullen het inzetpaneel verwijderen wanneer het inzetten is gedaan.

De start het spel() functie wordt in deze code genoemd.

 private finale functie init (e: MouseEvent): void betPanel.white.removeEventListener (MouseEvent.MOUSE_UP, makeBet); betPanel.black.removeEventListener (MouseEvent.MOUSE_UP, makeBet); betPanel.okButton.removeEventListener (MouseEvent.MOUSE_UP, init); TweenNano.to (betPanel, 0.2, x: stage.stageWidth + betPanel.width / 2, onComplete: removeBetPanel); stayButton.visible = true;  private finale functie removeBetPanel (): void removeChild (betPanel); start het spel(); 

Stap 32: Start Game

Dit codeblok start alle actie, het gebruikt de loadCard () functie om een ​​willekeurige kaart dynamisch te laden, roept de score-teller op en voegt de luisteraars van de spelbesturing toe.

 private laatste functie startGame (): void loadCard (xPos [0], yPos [0], true); loadCard (xPos [1], yPos [0], true, true); loadCard (xPos [0], yPos [1], false); loadCard (xPos [1], yPos [1], false); loadCounter (); luisteraars (); 

Stap 33: Functie laadkaart

Een van de belangrijkste functies in deze app, deze voert alle vereiste acties uit om een ​​kaart uit de. Te laden \afbeeldingen\ map en plaats deze in het werkgebied.

De loadCard () functie heeft vier parameters nodig:

  • xp: De x-positie van de geladen kaart
  • yp: De y-positie van de geladen kaart
  • isDealer: Klopt als de kaart die wordt geladen door de dealer wordt gebruikt
  • verborgen: Waar als de geladen kaart wordt bedekt door de cardback Filmclip

Deze functie geeft ook de kaartscore-waarden door aan de overeenkomstige variabelen.

 private laatste functie loadCard (xp: int, yp: int, isDealer: Boolean, hidden: Boolean = false): void var loader: Loader = new Loader (); // A Loader om de met bitmap geladen cardGFX.push (loader) op te slaan; // Deze vector slaat alle geladen kaarten op var num: String = number [Math.floor (Math.random () * 12)]; // Een willekeurig gekozen aantal beschikbare kaartnummers var urlLoader: URLRequest = nieuwe URLRequest ('images /' + String (type [Math.rand (Math.random () * 4)] + num) + '.png') ; // laadt een willekeurige kaart loader.x = xp; loader.y = yp; Loader.load (URLLoader); addChild (loader); if (verborgen) cardBack.x = xp + 2; cardBack.y = yp + 1; addChild (cardback);  / * Als num> 10 dan j, q of k is geselecteerd, wijzigt u de waarde in 10 * / if (int (num)> 10) num = '10';  / * Controleer of kaarten voor speler of dealer * / if (isDealer) zijn dScore + = int (num); dealerCounter.n.text = String (dScore);  else pScore + = int (num); playerCounter.n.text = String (pScore); 

Natuurlijk zou je dit veel complexer en realistischer kunnen maken door een array te genereren met waarden voor een heel pak kaarten (of meerdere), deze te "shuffelen" en ze uit te delen zoals vereist, maar de eenvoudige willekeurige methode die we hier gebruikten is prima voor onze doeleinden.


Stap 34: kaartenteller

De loadCounter () functie voegt de CardCounter-instanties toe en plaatst deze in de juiste positie. De waarden worden verkregen uit de scorevariabelen.

 private eindfunctie loadCounter (): void dealerCounter.x = 145; dealerCounter.y = 4; playerCounter.x = 145; playerCounter.y = 417; dealerCounter.n.text = '?'; playerCounter.n.text = String (pScore); addChild (dealerCounter); addChild (playerCounter); 

Stap 35: Hit Me!

De speler kan een andere kaart aanvragen door op de achtergrond te dubbelklikken. De volgende code verwerkt die functie.

 private finale functietreffer (e: MouseEvent): void loadCard (xPos [2 + additionalCards], yPos [1], false); // laad een andere kaart additionalCards ++; if (additionalCards> = 2) bg.doubleClickEnabled = false; bg.removeEventListener (MouseEvent.DOUBLE_CLICK, hit);  / * Controleer of score hoger is dan 21 * / if (pScore> 21) blackjack ('lost'); 

Stap 36: Blijf

De knop Blijven voert deze code uit wanneer erop wordt geklikt. Het zal de score van de deler onthullen en de functie oproepen die beide scores zal controleren.

 privé laatste functie verblijf (e: MouseEvent): void / * Onthul dealer score * / dealerCounter.n.text = String (dScore); / * Controleer op speler en dealer score * / checkScore (); 

Stap 37: Score controleren

Deze functie vergelijkt de scores van de speler en de dealer; afhankelijk hiervan worden meer kaarten toegevoegd of wordt het spel gewonnen of verloren verklaard.

 private final function checkScore (): void if (pScore < dScore)  blackjack('lost');  else if(pScore > dScore && dScore < 21)  hitDealer();  else if(pScore == dScore && dScore < 21 && dScore != 21)  hitDealer();  else if(pScore == 21 && dScore == 21)  blackjack('lost');  else if(pScore > dScore) blackjack (); 

Stap 38: Hit dealer

De volgende functie behandelt de kaarten die aan de hand van de dealer zijn toegevoegd.

 private final function hitDealer (): void loadCard (xPos [2 + dAdditionalCards], yPos [0], true); dAdditionalCards ++; / * Controleer of de score hoger is dan 21 * / if (dScore> 21) blackjack ();  else checkScore (); 

Stap 39: Game Luisteraars

Muisgestuurde objecten worden gebruikt om het spel te besturen. De volgende functie voegt de benodigde luisteraars toe om met deze besturingselementen om te gaan.

Een parameter wordt gebruikt om te weten of de luisteraars zullen worden toegevoegd of verwijderd.

 prive-luisteraars in de finale functie (what: String = 'add'): void if (what == 'add') bg.doubleClickEnabled = true; bg.addEventListener (MouseEvent.DOUBLE_CLICK, hit); stayButton.addEventListener (MouseEvent.MOUSE_UP, stay);  else bg.doubleClickEnabled = false; bg.removeEventListener (MouseEvent.DOUBLE_CLICK, hit); stayButton.removeEventListener (MouseEvent.MOUSE_UP, stay); 

Stap 40: Blackjack-functie

Deze functie wordt uitgevoerd wanneer de speler wint of verliest, de standaardparameter is winnen.

 privé-finale functie blackjack (e: String = 'win'): void / * Onthul dealer verborgen kaart * / removeChild (cardBack); / * Onthul de score van de dealer * / dealerCounter.n.text = String (dScore); / * Luisteraars * / luisteraars verwijderen ('verwijderen'); / * Waarschuwingsscherm * / if (e == 'lost') alert.messageBox.txt.text = 'Je bent verloren';  else alert.messageBox.txt.text = 'Win u!'; / * Huidige weddenschap toevoegen aan saldo * / balance.text = String (int (balance.text) + int (bet.text)); balanceLP.text = balance.text;  / * Controleer balansbedrag * / if (int (balance.text)! = 0) alert.addEventListener (MouseEvent.MOUSE_UP, restart);  else alert.messageBox.txt.text = 'Game Over'; isNewGame = true; alert.addEventListener (MouseEvent.MOUSE_UP, restart);  / * Huidige weddenschap wissen * / bet.text = '0'; betLP.text = '0'; currentBet = 0; addChild (alert); TweenNano.from (alert.messageBox, 0.7, y: -alert.messageBox.height, ease: Elastic.easeOut); 

Stap 41: start opnieuw op

Als u op het waarschuwingsscherm klikt, worden variabelen, weergaveobjecten en andere waarden opnieuw ingesteld om nog een ronde te spelen.

Als het isNewGame variabele is waar, de balans wordt ook gereset.

 privé laatste functie opnieuw opstarten (e: MouseEvent): void alert.removeEventListener (MouseEvent.MOUSE_UP, restart); removeChild (alert); dScore = 0; pScore = 0; removeChild (dealerCounter); removeChild (playerCounter); var cardsLen: int = cardGFX.length; for (var i: int = 0; i < cardsLen; i++)  removeChild(cardGFX[i]);  cardGFX.length = 0; additionalCards = 0; dAdditionalCards = 0; /* Check for new game */ if(isNewGame)  balance.text = '1000'; balanceLP.text = '1000'; isNewGame = false;  addBetPanel(); 

Stap 42: Documentklasse


Stel de documentklasse in. Als je niet weet hoe je het moet gebruiken of een beetje in de war bent, lees dan deze Snelle tip.


Conclusie

Het eindresultaat is een kleurrijk en vermakelijk spel. Probeer het aan te passen - hoe zit het met een poort naar een mobiel apparaat?

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