In diesem Schnelltipp erfahren Sie, wie Sie BitmapData verwenden copyPixels ()
Mit dieser Methode können Sie einen schnellen, verschwommenen Spureffekt für die Kugeln in Ihren Shooter-Spielen erzielen.
Werfen wir einen Blick auf das Endergebnis, auf das wir hinarbeiten:
Bewege das Schiff mit den Pfeiltasten oder WASD und drücke die Leertaste, um die Kugeln in Richtung des Mauszeigers abzufeuern.
Wir werden die Grundidee, die beim Blitting verwendet wird, schnell (sehr schnell) durchgehen, bevor wir weitermachen, da wir sie in diesem Quick Tip verwenden werden.
Das Kopieren von Pixeln auf dem Bildschirm ist der Kern des Blits. In AS3 wird dazu ein rechteckiger Pixelbereich von a kopiert BitmapData
zum anderen BitmapData
, mit BitmapData.copyPixels ()
.
Das Bild oben zeigt genau das. Wir kopieren die Pixel eines rechteckigen Bereichs von a BitmapData
und steckte es in ein anderes.
Die Idee, die wir in diesem Schnelltipp untersuchen werden, besteht darin, alles, was einen Unschärfeeffekt erfordert, in einen Container zu kopieren, und einen Nachblitzeffekt anzuwenden, um den gewünschten Effekt zu erzielen.
Es gibt bereits einen sehr grundlegenden Code für ein Space-Shooter-Spiel, das bereits in den Quelldateien erstellt wurde, da dies nicht der Schwerpunkt dieses Beitrags ist. Es gibt nur ein Schiff, das sich mit der WASD oder den Pfeiltasten bewegt. Der Code ist sehr kommentiert und ist sehr einfach, so dass Sie wahrscheinlich keine Probleme damit haben werden. Es verwendet eingebettete Bilder für die Bilder in Ihrem Spiel. Sie können jedoch auch Sprites mit einer leichten Drehung einer Funktion verwenden, die wir später erstellen werden (wir werden dies gleich besprechen)..
Lass uns hinein springen Main.as
und erstellen Sie ein Bitmap
das wird alle Kugeln und Objekte enthalten, die unscharf sein müssen. Fügen Sie es vor allen anderen Elementen in der Kinderliste hinzu.
private var _container: Bitmap; private var _containerData: BitmapData; private Funktion init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // Erstellen eines Spielerschiffs und des Vektors, der die Kugeln enthalten wird _playerShip = new PlayerShip (); _bullets = neuer Vektor.(); // // Initialisierung des Containers _containerData = new BitmapData (550, 400, true, 0xFFFFFFFF); _container = neue Bitmap (_containerData); // addChild (_container); addChild (_playerShip); // Listener für die Spielschleife addEventListener (Event.ENTER_FRAME, onEnterFrame);
Bisher war alles sehr einfach. Wir haben nur den Container erstellt und der Anzeigeliste hinzugefügt.
In diesem Schritt müssen wir die Kugeln in jedem Rahmen zeichnen. Das machen wir im onEnterFrame ()
Funktion des Main
Klasse.
private Funktion onEnterFrame (e: Event): void _playerShip.update (); // Aktualisieren jedes Aufzählungszeichens für (var i: int = 0; i < _bullets.length; i++) _bullets[i].update(); _containerData.copyPixels(Bitmap(_bullets[i].getChildAt(0)).bitmapData, Bitmap(_bullets[i].getChildAt(0)).bitmapData.rect, new Point(_bullets[i].x, _bullets[i].y)); //
Die einzige Zeile, die zählt, ist Zeile 10. In dieser Zeile zeichnen wir die Pixel jedes Aufzählungszeichens (durch den Zugriff auf die BitmapData
des Kindes der Kugel, das ist die BitmapData
Pixel des eingebetteten Bildes enthalten). Wenn Sie in Ihrem Spiel keine eingebetteten Bilder verwenden, können Sie verwenden BitmapData.draw ()
stattdessen. Diese Methode ist etwas langsamer, funktioniert aber genauso.
Wir passieren das ganze Rechteck der Kugel BitmapData
weil wir alles zeichnen wollen. Sie können mit diesem Rechteck und der zu zeichnenden Position spielen, um sehr unterhaltsame Ergebnisse zu erzielen (z. B. eine Position, die auf einer periodischen Funktion basiert, wie z. B. Math.sin ()
um einen interessanten Spureffekt zu erzeugen, auch wenn die Kugel nur in einer geraden Linie verläuft oder nur das "Feuer" einer Raketenkugel durch ein kleineres Rechteck zieht, um die Spur nur mit dem Schuss zu erzeugen).
Wenn Sie Ihr Spiel kompilieren und ausführen, erhalten Sie etwas davon, nachdem Sie ein paar Kugeln abgefeuert haben:
Das ist jedoch nicht das, was wir wirklich wollen. Wir möchten einen verschwommenen Spureffekt hinzufügen, also, was zu tun ist?
Dies ist der letzte Schritt. Alles, was wir noch tun müssen, ist den Unschärfeeffekt im BitmapData
das hält alle Bilder von den Kugeln. Dazu verwenden wir eine ColorMatrixFilter
.
private var _colorMatrixFilter: ColorMatrixFilter; private Funktion init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // Erstellen eines Spielerschiffs und des Vektors, der die Kugeln enthalten wird _playerShip = new PlayerShip (); _bullets = neuer Vektor.(); // // Initialisierung des Containers _containerData = new BitmapData (550, 400, true, 0); _container = neue Bitmap (_containerData); // // Initialisierung des Matrixfilters _colorMatrixFilter = neuer ColorMatrixFilter ([1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 0,99, 0]); // addChild (_container); addChild (_playerShip); // Listener für die Spielschleife addEventListener (Event.ENTER_FRAME, onEnterFrame); private Funktion onEnterFrame (e: Event): void _playerShip.update (); // Aktualisieren jedes Aufzählungszeichens für (var i: int = 0; i < _bullets.length; i++) _bullets[i].update(); _containerData.copyPixels(Bitmap(_bullets[i].getChildAt(0)).bitmapData, Bitmap(_bullets[i].getChildAt(0)).bitmapData.rect, new Point(_bullets[i].x, _bullets[i].y)); // // Adding the blur effect on the container _containerData.applyFilter(_containerData, _containerData.rect, new Point(0, 0), new BlurFilter(2, 2, 1)); _containerData.applyFilter(_containerData, _containerData.rect, new Point(0, 0), _colorMatrixFilter); //
Das ColorMatrixFilter
arbeitet durch Manipulieren jedes Pixels im BitmapData
entsprechend den Werten im Matrixfilter. Schauen Sie sich das an drin()
Funktion. Wir schaffen ein neues ColorMatrixFilter
dort, ein Array mit einer Reihe von Werten übergeben. Diese Werte erstellen die Transformationsmatrix des Matrixfilters, sodass wir die Pixel im Bild bearbeiten können.
Der Filter funktioniert im Wesentlichen wie folgt: Jede Komponente der resultierenden Farbe (Rot, Grün, Blau und Alpha) wird berechnet, indem die Quellkomponenten mit den entsprechenden Zahlen in der jeweiligen Zeile der Matrix multipliziert und zusammen mit dem fünften Wert summiert werden der Reihe.
Wenn wir zum Beispiel den Matrixfilter, den wir im Code erstellt haben, als Beispiel-Matrixfilter verwenden und ihn auf ein Pixel mit den Werten anwenden "Rot = 50, Grün = 10, Blau = 200, Alpha = 128
", die resultierende rote Komponente des Pixels ist"Rot = (50 * 1) + (10 * 0) + (200 * 0) + (128 * 0) + 0 = 50
", weil die erste Reihe unserer Matrix ist"1 0 0 0 0
". Die Alphakomponente wird"alpha = (50 · 0) + (10 · 0) + (200 · 0) + (128 · 0,99) + 0 = 126
", weil die letzte Reihe unserer Matrix ist"0 0 0 0,99 0
".
Sehen Sie, was jetzt passiert? Bei jedem Frame multiplizieren wir das Alpha jedes Pixels mit 0,99, um es etwas transparenter zu machen, um den Spureffekt zu erzeugen. Wenn Sie mehr über das erfahren möchten ColorMatrixFilter
, Sie können sich auf die Dokumentation beziehen.
Der Unschärfe-Effekt wird durch Anwenden eines einfachen Effekts sichergestellt BlurFilter
in dem BitmapData
.
Kompilieren Sie das Spiel jetzt und Sie erhalten unseren gewünschten Effekt!
Sie haben gerade gelernt, wie Sie eine Anwendung anwenden ColorMatrixFilter
Um einen verschwommenen Spureffekt zu erzeugen, verwenden Sie den sehr schnell BitmapData.copyPixels ()
Methode! Auf diese Weise können Sie jedem Objekt den Unschärfe-Effekt hinzufügen, ohne dass Flash Player langsamer wird, da Sie zu viele Kinder mit Unschärfefiltern auf der Bühne hinzufügen. Mit diesem Prinzip können viele coole Dinge gebaut werden; du musst nur kreativ sein.
Danke fürs Lesen! Wenn Sie Fragen haben, kommentieren Sie bitte!