Erstellen Sie ein frenzic inspiriertes Puzzlespiel in Flash

Sehen Sie sich dieses Premium-Tutorial an, um ein unterhaltsames Puzzlespiel zu erstellen, das von Frenzic mit Flash und ActionScript 3 inspiriert ist.

Füllen Sie in der obigen Demo die äußeren Kästen mit farbigen Quadraten. Sie erhalten mehr Punkte, wenn Sie ein Feld mit Quadraten füllen, die alle die gleiche Farbe haben.


Schritt 1: Kurzübersicht

Mit den Flash-Zeichenwerkzeugen erstellen wir eine gut aussehende grafische Benutzeroberfläche, die von mehreren ActionScript 3-Klassen unterstützt wird.

Der Spieler kann auf vier verschiedene Orte klicken, um die Farbblöcke auf den Feldern zu sortieren. Wenn Sie ein Feld mit einer Blockfarbe füllen, erhalten Sie mehr Punkte.


Schritt 2: Flash-Dokumenteinstellungen

Öffnen Sie Flash und erstellen Sie ein 320 Pixel breites und 480 Pixel hohes Dokument. Stellen Sie die Bildrate auf 24fps ein.



Schritt 3: Schnittstelle


Eine farbenfrohe, schön aussehende Oberfläche wird angezeigt. Dazu gehören mehrere Formen, Schaltflächen, Sounds und mehr.

Fahren Sie mit den nächsten Schritten fort, um zu erfahren, wie Sie diese GUI erstellen.


Schritt 4: Hintergrund


Wählen Sie das Rechteckwerkzeug (R) aus, um ein 320x480px # 0D6191, # 001217-Rechteck zu erstellen, und zentrieren Sie es in der Bühne. Verwenden Sie dasselbe Werkzeug, um eine schwarze 2x480px-Linie mit 20% Alpha zu kitten, drücken Sie CMD + D, um sie mehrmals zu duplizieren, und verteilen Sie die Linien, um den Effekt in der Abbildung oben zu erhalten.


Schritt 5: Titelansicht


Wähle das Textwerkzeug (T), wähle eine gut aussehende Schrift und schreibe deinen Spieletitel. Ich habe dieses Format verwendet: Orbitron Bold, 60pt, # A3FF24. Sie können einen einfachen Glühfilter hinzufügen, damit er besser aussieht.

Verwenden Sie die gleiche Technik, um zwei Schaltflächen zu erstellen, sie an der Mitte auszurichten und sie zu benennen startB und creditsB. Alle in a konvertieren Filmausschnitt und seinen Namen auf TitleView; Markiere die Export für ActionScript Box und löschen Sie den Clip von der Bühne.


Schritt 6: Partitur und Leben


Das wird das sein GameView. Fügen Sie den Hintergrund hinzu MC auf die Bühne und zwei erstellen Dynamische Textfelder und platzieren Sie sie wie im Bild gezeigt. Benennen Sie die Textfelder LivesTF und scoreTF.


Schritt 7: Behälter


Verwenden Sie die Rechteckwerkzeug (R) Um ein 70x70px-Quadrat zu erstellen und es mit dem Hintergrundverlauf auszufüllen, konvertieren Sie es in MC und drücken Sie CMD + D, um es zu duplizieren, so dass Sie insgesamt fünf haben. Verwenden Sie das Ausrichtungsfenster, um sie wie im Bild gezeigt zu platzieren.

Die Instanznamen sollten zu ihren Positionen passen - das heißt: rauf runter links rechts und das Zentrum wird sein mainHolder.


Schritt 8: Blöcke


Verwenden Sie dieselbe Technik, die im letzten Schritt zum Erstellen von drei 30x30px-Blöcken verwendet wurde, konvertieren Sie sie in MC und benennen Sie sie entsprechend ihrer Farbe: OrangeBlock, PurpleBlock und GreenBlock. Vergiss nicht, das zu markieren Export für ActionScript Box.


Schritt 9: Alarm


Eine Warnung wird angezeigt, wenn Sie alle Ihre Leben verlieren, und es wird die erreichte Endpunktzahl angezeigt. Verwenden Sie die Rechteckiges Grundwerkzeug Erstellen Sie es und füllen Sie es mit diesem linearen Farbverlauf: # 000000 bis # 333333. Setzen Sie den Instanznamen auf AlertView und markieren Sie das Export für ActionScript Box.


Schritt 10: Credits


Dieser Bildschirm ist leicht zu erstellen, da wir bereits alle Grafiken haben. Setzen Sie den Instanznamen auf CreditsView und markieren Sie das Export für ActionScript Box.


Schritt 11: Tween Nano


Wir verwenden eine andere Tween-Engine als die in Flash enthaltene Standardeinstellung. Dies erhöht die Leistung und ist einfacher zu verwenden.

Sie können Tween Nano von der offiziellen Website herunterladen.


Schritt 12: Soungle


Wir verwenden Soundeffekte, um das Spielgefühl zu verbessern. Sie können die in diesem Beispiel verwendeten Sounds in Soungle.com anhand der Schlüsselwörter finden Glocke und summen. Fügen Sie sie zu Ihrer Bibliothek hinzu, mit Klassennamen von Glocke, Bell4, und Summen, beziehungsweise.


Schritt 13: Erstellen Sie eine neue ActionScript-Klasse


Erstellen Sie eine neue (Cmd + N) ActionScript 3.0-Klasse, und speichern Sie sie als Main.as in Ihrem Klassenordner.


Schritt 14: Klassenstruktur

Erstellen Sie Ihre grundlegende Klassenstruktur, um mit dem Schreiben Ihres Codes zu beginnen.

 package import flash.display.Sprite; public class Main erweitert Sprite öffentliche Funktion Main (): void // constructor code

Schritt 15: Erforderliche Klassen

Dies sind die Klassen, die wir importieren müssen, damit unsere Klasse funktionieren kann einführen Die Direktive macht extern definierte Klassen und Pakete für Ihren Code verfügbar.

 import flash.display.Sprite; import flash.events.MouseEvent; import com.greensock.TweenNano; import com.greensock.easing.Bounce; import flash.utils.Timer; import flash.events.TimerEvent; import flash.net.navigateToURL; import flash.net.URLRequest;

Schritt 16: Variablen

Dies sind die Variablen, die wir verwenden werden. Lesen Sie die Kommentare im Code, um mehr über sie zu erfahren. Einige ihrer Namen sind selbsterklärend, so dass dort kein Kommentar enthalten ist.

 private var titleView: TitleView = new TitleView (); private var credits: CreditsView; private var blockColor: Vektor. = neuer Vektor.(); // Speichert die verfügbaren Farben, die zum Erstellen neuer privater Var-Blöcke für Blockinstanzen verwendet werden: Vektor. = neuer Vektor.(); // speichert alle Blöcke auf dem Bildschirm, um jederzeit auf private Vari-Positionen zugreifen zu können: Vektor. = neuer Vektor.(); // enthält die möglichen Blockpositionen private var currentXPosition: int; private var currentYPosition: int; private var eventTarget: Object; // Wird verwendet, um auf das Ereignisziel der Ortsfunktion zuzugreifen. private var timer: Timer = neuer Timer (3000); // Sie haben 3 Sekunden, um den Block in der Mitte private private Leben: int zu platzieren = 5; private var-Bewertung: int = 0; private var bell: Bell = new Bell (); private var bell4: Bell4 = neue Bell4 (); privates var-Buzz: Buzz = neues Buzz ();

Schritt 17: Konstruktor

Der Konstruktor ist eine Funktion, die ausgeführt wird, wenn ein Objekt aus einer Klasse erstellt wird. Dieser Code wird als erster ausgeführt, wenn Sie eine Instanz eines Objekts erstellen, oder (wenn in der Dokumentklasse) der erste, der ausgeführt wird, wenn das Projekt geladen wird.

Es ruft die notwendigen Funktionen auf, um das Spiel zu starten. Überprüfen Sie diese Funktionen in den nächsten Schritten.

 öffentliche abschließende Funktion Main (): void // code? 

Schritt 18: Titelansicht hinzufügen

Wir beginnen mit dem Hinzufügen von TitleView zur Bühne; Andernfalls wird der erste Bildschirm angezeigt GameView.

 addChild (titleView);

Schritt 19: Fügen Sie Vektorenwerte hinzu

Das blockColor Mit dem Vektor wird eine neue Instanz des ausgewählten Blocks erstellt. Die Parameter sind die Blöcke, die wir in den vorherigen Schritten erstellt haben.

Das Positionen Vektor speichert das Mögliche x und y Positionen, die ein Block haben kann; Wenn Sie dies vermischen, erhalten Sie die endgültige Position in Bezug auf die mainHolder MC.

 blockColor.push ('orange', 'grün', 'lila'); Positionen.Push (5, 35); startButtonListeners ();

Schritt 20: Button Listeners

In dieser Funktion fügen wir die Maus-Listener zu den Schaltflächen in der Titelansicht hinzu. Diese führen uns zum Spielbildschirm oder zum Credits-Bildschirm.

 private letzte Funktion startButtonListeners (action = 'add'): void if (action == 'add') titleView.creditsB.addEventListener (MouseEvent.MOUSE_UP, showCredits); titleView.startB.addEventListener (MouseEvent.MOUSE_UP, showGameView);  else titleView.creditsB.removeEventListener (MouseEvent.MOUSE_UP, showCredits); titleView.startB.removeEventListener (MouseEvent.MOUSE_UP, showGameView); 

Schritt 21: Credits anzeigen

Der Bildschirm "Credits" wird angezeigt, wenn der Benutzer auf die Schaltfläche "Credits" klickt. Ein Mauslistener wird zum vollständigen MC hinzugefügt, um ihn zu entfernen.

 private letzte Funktion showCredits (e: MouseEvent): void credits = new CreditsView (); addChild (credits); TweenNano.from (credits, 0.3, x: stage.stageWidth, onComplete: function (): void titleView.visible = false; credits.addEventListener (MouseEvent.MOUSE_UP, hideCredits);; 

Schritt 22: Credits ausblenden

Wenn der Credits-Bildschirm angeklickt wird, wird er von der Bühne getweent und entfernt.

 private letzte Funktion hideCredits (e: MouseEvent): void titleView.visible = true; TweenNano.to (credits, 0.3, x: stage.stageWidth, onComplete: function (): void credits.removeEventListener (MouseEvent.MOUSE_UP, hideCredits); removeChild (credits); credits = null;); 

Schritt 23: Spielansicht

Wenn der Start Wenn Sie die Taste drücken, wird die Titelansicht getweent und entfernt, um die Spielansicht anzuzeigen.

 private letzte Funktion showGameView (e: MouseEvent): void TweenNano.to (titleView, 0.3, y: -titleView.height, onComplete: function (): void startButtonListeners ('rmv'); removeChild (titleView); titleView = Null;   ); counter.gotoAndStop (1); addListeners (); 

Lasst uns hier aufhören, um einen schnellen Test zu machen und sicherzustellen, dass unsere Bildschirmumschalter Code funktioniert (Test Credits zuerst, damit Sie zurückgehen können). Legen Sie die Dokumentenklasse Ihres FLA auf fest Main.

Denken Sie daran, dass die Meilensteine ​​in den Quelldateien enthalten sind. Wenn Ihre Datei aus irgendeinem Grund nicht imitiert, werfen Sie einen Blick auf die Quelle, um herauszufinden, was die Ursache sein kann.


Schritt 24: Game Listeners

Kehren Sie zum Code zurück und fügen Sie die folgende Funktion hinzu. Es wird ein Maus-Listener zu den Quadraten hinzugefügt, sodass Sie darauf klicken können, um den aktuellen Block zu platzieren.

 private letzte Funktion addListeners (): void up.addEventListener (MouseEvent.MOUSE_UP, placeBlock); right.addEventListener (MouseEvent.MOUSE_UP, placeBlock); down.addEventListener (MouseEvent.MOUSE_UP, placeBlock); left.addEventListener (MouseEvent.MOUSE_UP, placeBlock);

Schritt 25: Container-Arrays

Diese Arrays werden in den quadratischen MovieClips erstellt. Sie werden verwendet, um die Blöcke, Farben und Positionen in jedem Quadrat zu registrieren.

Die Buchstaben repräsentieren die folgenden Positionen:

  • a: oben links
  • b: oben rechts
  • c: links unten
  • d: rechts unten

Fahre mit dem fort addListeners () Funktion:

 / * Erstellen Sie für jeden Container ein Array, um zu bestimmen, wann voll und die Blöcke Farbe haben * / up.blocks = []; right.blocks = []; down.blocks = []; left.blocks = []; / * Erstellen Sie für jeden Container einen Boolean, um zu vermeiden, dass Blöcke an derselben Position platziert werden. * / Up.a = false; right.a = falsch; down.a = falsch; left.a = falsch; up.b = falsch; right.b = falsch; down.b = falsch; left.b = falsch; up.c = falsch; right.c = falsch; down.c = falsch; left.c = falsch; up.d = falsch; right.d = falsch; down.d = falsch; left.d = falsch; newBlock (true); 

Schritt 26: Zufällige Blockfarbe erzeugen

Dieser Code wählt eine zufällige Blockfarbe aus dem Vektor aus, mit der der tatsächliche Block instanziiert wird. Mit einem Parameter wird festgelegt, ob der Timer zum Starten des Zählens aktiviert wird.

 private letzte Funktion newBlock (firstTime: Boolean = false): void / * Neuer Block * / var randomBlock: int = Math.floor (Math.random () * 3); var-Block: Sprite; switch (blockColor [randomBlock]) case 'orange': block = new OrangeBlock (); brechen; case 'green': block = new GreenBlock (); brechen; case 'purple': block = new PurpleBlock (); brechen; default: trace ('BlockColor Error'); brechen; 

Schritt 27: Neuen Block hinzufügen

Nachdem Sie die Blockfarbe ausgewählt haben, wird die Position, an der sie platziert wird, mithilfe von berechnet Positionen Vektor und dann dem Blockvektor und der Bühne hinzugefügt. Fahre mit dem fort newBlock () Funktion:

 currentXPosition = Positionen [Math.floor (Math.random () * 2)]; currentYPosition = Positionen [Math.floor (Math.random () * 2)]; block.x = mainHolder.x + currentXPosition; block.y = mainHolder.y + currentYPosition; blocks.push (block); addChild (block);

Schritt 28: Überprüfen Sie den verfügbaren Speicherplatz

Bevor Sie mit dem Spiel fortfahren, müssen Sie überprüfen, ob der neu erstellte Block tatsächlich in einem quadratischen Container platziert werden kann. Mit dem folgenden Code wird jedes Container-Array überprüft, um sicherzustellen, dass in einer der Boxen, in denen der Block platziert werden kann, eine leere Position verfügbar ist. Wenn nicht, wird der Block zerstört und die Funktion wird erneut aufgerufen, um einen neuen zu generieren.

 / * Nach einem verfügbaren Platz zum Verschieben des Blocks suchen * / var position: Array = [currentXPosition, currentYPosition]; if (String (Position) == '5,5' && up.a && right.a && down.a && left.a) removeChild (block); Block = Null; newBlock ();  else if (String (Position) == '35, 5 '&& up.b && right.b && down.b && left.b) removeChild (block); Block = Null; newBlock ();  else if (String (Position) == '5,35' && up.c && right.c && down.c && left.c) removeChild (block); Block = Null; newBlock ();  else if (String (Position) == '35, 35 '&& up.d && right.d && down.d && left.d) removeChild (block); Block = Null; newBlock (); 

Wenn Sie ein anderes Layout für Ihr Spiel verwendet haben, stellen Sie sicher, dass Sie den Wert ändern, den Sie überprüfen (d. H. Nicht) '35, 35 ', da die Blöcke Ihres Spiels an diesem Punkt nicht unbedingt erscheinen werden).


Schritt 29: Timer starten

Der Timer beginnt zu zählen, wenn die Funktion zum ersten Mal aufgerufen wird.

 if (firstTime) / * Start Timer * / timer.addEventListener (TimerEvent.TIMER, timesUp); timer.start (); counter.play ();  // Die newBlock () - Funktion beenden

Schritt 30: Lebt

Drei Sekunden stehen zur Verfügung, um einen Block in einem quadratischen Behälter zu platzieren. Wenn diese Zeit verstrichen ist und der Block noch im mittleren Quadrat ist, wird das Leben entfernt.

 private letzte Funktion timesUp (e: TimerEvent): void / * Remove Live * / lives--; livesTF.text = String (lebt); buzz.play ();

Schritt 31: Nicht verwendete Blöcke

Nach dem Entfernen der Lebensdauer wird der Block im mittleren Quadrat zerstört und ein neuer Block wird generiert. Dieser Code überprüft auch, ob der Player kein Leben mehr hat, und ruft eine Funktion auf, die wir später schreiben werden.

 / * Nicht verwendeten Block entfernen * / var i: int = blocks.length - 1; removeChild (Blöcke [i]); Blöcke [i] = Null; Blöcke.Splice (i, 1); / * Überprüfen Sie, ob es keine Leben mehr gibt * / if (lebt < 1)  alert();  else  /* Next Block */ newBlock();  

Lassen Sie uns noch eine Pause einlegen, um zu sehen, wie unser Code an dieser Stelle funktioniert:


Schritt 32: Blöcke platzieren

Diese Funktion wird ausgeführt, wenn der Spieler auf eines der Containerquadrate klickt. Es prüft grundsätzlich, ob die richtige Position für das Platzieren verfügbar ist, und platziert sie, falls sie wahr ist. Die Funktion im nächsten Schritt wird aufgerufen, wenn der Block platziert wird.

 private letzte Funktion placeBlock (e: MouseEvent): void var i: int = blocks.length - 1; eventTarget = e.target; / * Prüfen, ob Position verfügbar ist * / var position: Array = [currentXPosition, currentYPosition]; if (String (Position) == '5,5' &&! e.target.a) Blöcke [i] .x = e.target.x + Position [0]; Blöcke [i] .y = e.Target.y + Position [1]; e.target.a = true; blockPlaced ();  else if (String (Position) == '35, 5 '&&! e.target.b) Blöcke [i] .x = e.target.x + Position [0]; Blöcke [i] .y = e.Target.y + Position [1]; e.target.b = true; blockPlaced ();  else if (String (Position) == '5,35' &&! e.target.c) Blöcke [i] .x = e.target.x + Position [0]; Blöcke [i] .y = e.Target.y + Position [1]; e.target.c = true; blockPlaced ();  else if (String (Position) == '35, 35 '&&! e.target.d) Blöcke [i] .x = e.target.x + Position [0]; Blöcke [i] .y = e.Target.y + Position [1]; e.target.d = true; blockPlaced (); 

Möglicherweise müssen Sie die Werte, die hier geprüft werden, möglicherweise ändern, um sie an die Position Ihrer Blöcke anzupassen.


Schritt 33: Block zu Array hinzufügen

Wenn der Block in den Container eingefügt wird, fügen wir den Block dem Array hinzu, in dem die gespeicherten Blöcke in diesem Container aufgezeichnet werden. Dies hilft uns zu bestimmen, wann der Behälter voll ist.

 private letzte Funktion blockPlaced (): void var i: int = blocks.length - 1; / * Block in Containerblöcke des Arrays verschieben * / eventTarget.blocks.push (blocks [i]);

Schritt 34: Ergebnis

Jeder gesetzte Block erhöht die Punktzahl um eins. Wenn die Box voll ist, erhöht sich die Punktzahl um 50 und wenn die Box vollständig mit einer einzigen Farbe gefüllt ist, erhöht sich die Gesamtpunktzahl um 200.

 Score ++;

Schritt 35: Ton

Ein kurzer Ton zeigt an, dass der Block platziert wurde.

 bell.play ();

Schritt 36: Füllen Sie den einfarbigen Behälter aus

Der nächste Code prüft, ob der Container mithilfe des Container-Arrays von einem einzelnen Farbblock gefüllt wurde. Er erhöht die Punktzahl um 200, gibt den entsprechenden Sound wieder und prallt den Container als visuelles Zeichen ab. Außerdem werden die Variablen im Container gelöscht.

 / * Wenn Container voll ist und jeder Block dieselbe Farbe hat * / if (eventTarget.blocks.length == 4 && String (eventTarget.blocks [0]) == String (eventTarget.blocks [1]) && String (eventTarget.) blocks [1]) == String (eventTarget.blocks [2]) && String (eventTarget.blocks [2]) == String (eventTarget.blocks [3])) score + = 200; bell4.play (); TweenNano.from (eventTarget, 0.4, x: eventTarget.x - 5, Leichtigkeit: Bounce.easeOut, onComplete: function (): void for (var j: int = 0; j. J < 4; j++)  removeChild(eventTarget.blocks[j]);  eventTarget.blocks = [];   ); eventTarget.a = false; eventTarget.b = false; eventTarget.c = false; eventTarget.d = false; 

Schritt 37: Behälter füllen

Dieser Code wird ausgeführt, wenn der Container voll ist, die Blöcke jedoch nicht die gleiche Farbe haben.

 / * Wenn der Container voll ist, die Blöcke aber unterschiedliche Farben haben * / else if (eventTarget.blocks.length == 4) bell4.play (500, 2); Bewertung + = 50; TweenNano.from (eventTarget, 0.4, x: eventTarget.x - 5, Leichtigkeit: Bounce.easeOut, onComplete: function (): void for (var j: int = 0; j. J < 4; j++) removeChild(eventTarget.blocks[j]);  eventTarget.blocks = [];   ); eventTarget.a = false; eventTarget.b = false; eventTarget.c = false; eventTarget.d = false; 

Schritt 38: Timer neu starten

Nach dem Löschen der vollen Container wird die Bewertung auf der Bühne auf das Textfeld gesetzt, der Timer zurückgesetzt und ein anderer Block aufgerufen.

 scoreTF.text = String (score); Timer.stop (); timer.start (); counter.gotoAndPlay (1); newBlock (); 

Schritt 39: Alarm

Die Alarmfunktion wird ausgeführt, wenn der Spieler keine Leben mehr hat. Es zeigt das erreichte Endergebnis an und fügt einen Listener hinzu, um zum Titelbildschirm zurückzukehren.

 private letzte Funktionswarnung (): void timer.stop (); counter.gotoAndStop (1); var alert: AlertView = new AlertView (); alert.messageBox.msgTF.text = 'Score:' + String (Score); alert.addEventListener (MouseEvent.MOUSE_UP, Neustart); addChild (alert); TweenNano.from (alert.messageBox, 0.7, y: -alert.messageBox.height, ease: Bounce.easeOut); 

Schritt 40: Starten Sie neu

Die nächste Funktion lädt die SWF-Datei neu, startet alle Variablen und Methoden neu und kehrt zur SWF zurück Titelbildschirm.

 private letzte Funktion restart (e: MouseEvent): void navigateToURL (neue URLRequest (stage.loaderInfo.url), '_level0'); 

Fazit

Sie haben ein sehr unterhaltsames Spiel erstellt, versuchen Sie, Ihre eigenen Funktionen und Grafiken hinzuzufügen.

Ich hoffe, Ihnen hat dieses Tutorial gefallen, vielen Dank für das Lesen!