Sounds mit Befehlen verwalten

Das Sound-Management ist für viele Arten von Flash-Anwendungen wie interaktive Websites und Spiele sehr wichtig. Wenn Sie ein reichhaltiges interaktives Erlebnis bieten möchten, sollten Sie Soundeffekte und Hintergrundmusik verwenden. In diesem Tutorial werde ich ein minimalistisches Sound-Management-Framework vorstellen, das Sounds in Soundtracks verwaltet. Ich zeige Ihnen, wie Sie das Sound-Framework mit dem Befehls-Framework aus meinen vorherigen Tutorials integrieren können.


Einführung

Ich habe Spiele mit unvorsichtigem Sound-Management gespielt, und dies beeinträchtigt die Benutzererfahrung. Haben Sie jemals ein Spiel gespielt, etwa ein Action-Spiel, bei dem die Ausrufezeichen des Charakters vor Ende der vorherigen Stimme gespielt werden und sich überlappen? Das ist auf ein schlechtes Sound-Management zurückzuführen: Es sollte nicht mehr als eine Stimme des gleichen Charakters gleichzeitig spielen. Das Sound-Management-Framework, das ich gerade behandeln werde, wird dieses Problem lösen, indem es Sounds mit Soundtracks verwaltet.

In den Beispielen in diesem Lernprogramm wird das Befehls-Framework und das Szenemanagement-Framework aus meinem vorherigen Lernprogramm Thinking in Commands (Teil 1, Teil 2) verwendet, und in den Beispielen wird auch die Datenmanager-Klasse aus Daten mit Befehlen laden verwendet. Ich empfehle Ihnen dringend, zuerst diese Tutorials durchzugehen, bevor Sie fortfahren. Außerdem benötigen Sie die GreenSock Tweening-Plattform, um die Beispiele abzuschließen.


Schritt 1: Theorie Tonspuren

Die Tonspur, über die wir hier sprechen, hat nichts mit Spiel- oder Film-Tonspuren zu tun. Eine Tonspur ist eine imaginäre "Spur", die einer Wiedergabe von a zugeordnet ist Single klingen. Bei einer einzelnen Tonspur kann nicht mehr als ein Sound gleichzeitig abgespielt werden. Wenn ein Soundtrack gerade einen Sound abspielt, sagen wir, es ist belegt. Wenn auf einem belegten Soundtrack ein anderer Sound abgespielt werden soll, wird der gerade gespielte Sound gestoppt und der neue Sound wird auf dem Track abgespielt. Es ist daher sinnvoll, die Stimmen eines einzelnen Charakters auf einer einzelnen Tonspur zu spielen, um das zuvor erwähnte Problem der Tonüberlappung zu vermeiden. In den meisten Fällen sollte auch nur eine Spur für Hintergrundmusik vorhanden sein.

Schauen wir uns einige konzeptionelle Figuren an. Eine einzelne Anwendung kann mehrere Tonspuren haben.

Jede Tonspur kann einen einzelnen Wiedergabeton enthalten.

Wenn ein Sound auf einer besetzten Spur abgespielt werden soll, wird zuerst der "alte" Sound gestoppt und dann der "neue" Sound auf der Spur abgespielt.


Schritt 2: Theorie Der Rahmen

Das Sound Management-Framework besteht aus zwei Klassen, der SoundManager Klasse und die SoundTrack Klasse. Jeder Tonspur wird eine eindeutige Tastenkette zugewiesen. Der unterliegende Sound eines besetzten Soundtracks ist eigentlich ein natives SoundChannel-Objekt, das von der nativen Sound.play () - Methode und der SoundManager Klasse verwaltet Tonspuren und organisiert die Wiedergabe von Sounds.

Hier finden Sie eine kurze Vorschau auf die Verwendung des Frameworks. Mit dem folgenden Code wird ein neuer Sound auf einer Tonspur abgespielt, die der Tastenkette "music" zugeordnet ist MySound ist eine Soundklasse aus der Bibliothek.

 // einen Sound auf der Spur "Musik" abspielen SoundManager.play ("Musik", neues MySound ());

Wenn dieselbe Codezeile erneut ausgeführt wird, bevor die Wiedergabe beendet ist, wird der Originalton gestoppt und ein neuer Ton wird auf der Spur "Musik" abgespielt.

 // Stoppen Sie den Originalton auf der "Musik" -Spur und spielen Sie einen neuen SoundManager.play ("Musik", neues MySound ());

Das SoundManager.stop () Die Methode stoppt eine Soundspur, die einer angegebenen Schlüsselzeichenfolge zugeordnet ist.

 // Stoppen der Tonspur "Musik" SoundManager.stop ("Musik");

Um den Sound zu transformieren, z. B. um die Lautstärke anzupassen, müssen wir einen Verweis auf den darunter liegenden Soundkanal eines Soundtracks erhalten. Die Referenz kann durch Zugriff auf die erhalten werden SoundTrack.channel Eigentum.

 var channel: SoundChannel = SoundManager.getSoundTrack ("Musik"). Kanal; var transform: SoundTransform = channel.soundTransform; transformiertes Volumen = 0,5; channel.soundTransform = transform;

Schritt 3: Klassen Die SoundTrack-Klasse

Genug Theorie. Kommen wir zur Kodierung. Wir werden anders verwenden Schlüsselketten verschiedene Tonspuren unterscheiden. Hier ist die SoundTrack Klasse, die im Wesentlichen ein Schlüssel-Kanal-Paar darstellt. Details werden in Kommentaren beschrieben.

 Paketklänge import flash.media.SoundChannel; / ** * Eine Tonspur repräsentiert ein Schlüsselkanalpaar. * / public class SoundTrack // Schreibgeschützter Schlüsselwert private var _key: String; öffentliche Funktion get key (): String return _key;  // Nur-Lese-Soundkanalreferenz private var _channel: SoundChannel; public function get channel (): SoundChannel return _channel;  public function SoundTrack (key: String, channel: SoundChannel) _key = key; _channel = channel;  / ** * Stoppt den zugrunde liegenden Soundkanal. * / public function stop (): void _channel.stop (); 

Schritt 4: Klassen Die SoundManager-Klasse

Und hier ist der SoundManager Klasse. Beachten Sie, dass die Key-Track-Zuordnung mithilfe der Dictionary-Klasse behandelt wird. Ein Titel wird automatisch geleert, wenn ein abgespielter Sound sein Ende erreicht hat.

 Paketklänge import flash.events.Event; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundTransform; import flash.utils.Dictionary; / ** * In dieser Klasse können Sie Sounds in Bezug auf Tonspuren verwalten. * / public class SoundManager // ein Wörterbuch, das die Spuren aller Tonspuren speichert. private static var _soundTracks: Dictionary = new Dictionary (); // ein Wörterbuch, das einen Soundkanal dem entsprechenden Schlüssel für die Wiedergabe abschließt, wenn er mit der privaten statischen Variable var variiert _soundKeys: Dictionary = new Dictionary (); / ** * Spielt einen Sound ab und gibt ein entsprechendes Soundtrack-Objekt zurück. * / public static function play (Taste: String, Sound: Sound, startTime: int = 0, Loops: int = 0, transform: SoundTransform = null): SoundTrack // Wenn die Tonspur belegt ist, stoppen Sie die aktuelle Tonspur if (isPlaying (key)) stop (Schlüssel); // den Sound abspielen und einen neuen Soundkanal erstellen var channel: SoundChannel = sound.play (startTime, loops, transform); // auf das vollständige Ereignis des Soundkanals hören channel.addEventListener (Event.SOUND_COMPLETE, onSoundComplete); // einen neuen Soundtrack erstellen var soundTrack: SoundTrack = new SoundTrack (Taste, Kanal); // füge den Soundtrack zum Wörterbuch hinzu _soundTracks [key] = soundTrack; // füge die Kanalschlüsselzuordnungsbeziehung hinzu _soundKeys [channel] = key; return soundTrack;  / ** * Gibt einen Verweis auf die Tonspur zurück, die der angegebenen Schlüsselzeichenfolge entspricht. * / public static function getSoundTrack (Schlüssel: String): SoundTrack return _soundTracks [Schlüssel];  / ** * Bestimmt, ob gerade eine Tonspur abgespielt wird. * / public static function isPlaying (key: String): Boolean return Boolean (_soundTracks [key]);  / ** * Stoppt eine Tonspur. * / public statische Funktion stop (key: String): void var soundTrack: SoundTrack = _soundTracks [key]; // Überprüfen, ob die Tonspur vorhanden ist if (soundTrack) // Stoppen der Tonspur soundTrack.stop (); // und entferne es aus dem Wörterbuch delete _soundTracks [key]; // zusammen mit der Kanal-Schlüssel-Beziehung delete _soundKeys [soundTrack.channel];  / ** * Entfernt eine Tonspur, wenn die Tonwiedergabe abgeschlossen ist. Ziel); // Entferne den Event-Listener channel.removeEventListener (Event.SOUND_COMPLETE, onSoundComplete); // extrahiere den entsprechenden Schlüssel var key: String = _soundKeys [channel]; // entferne den Tonspurhalt (Taste); 

Schritt 5: Beispiel Sound Manager Testdrive

Lassen Sie uns nun unser Sound-Management-Framework testen. Wir werden das Ergebnis wiederholter Anforderungen zum Abspielen eines Sounds mit und ohne Verwendung des Soundmanagers vergleichen.


Schritt 6: Beispiel für ein neues Flash-Dokument

Erstellen Sie ein neues Flash-Dokument (duh).


Schritt 7: Beispiel Schaltflächen erstellen

Erstellen Sie zwei Schaltflächen auf der Bühne. Sie können Ihre eigenen zeichnen und in Symbole umwandeln, oder Sie können, wie in meinem Fall, zwei Button-Komponenten aus dem Bedienfeld Komponenten ziehen. Nennen Sie sie "boing_btn" und "managedBoing_btn"..


Schritt 8: Beispiel Importieren Sie den Sound

Importieren Sie den Sound, den wir spielen möchten, in die Bibliothek. Sie finden die Datei "Boing.wav" im Beispielquellordner.


Schritt 9: Beispiel Die Dokumentenklasse

Erstellen Sie schließlich eine AS-Datei für die Dokumentenklasse. Der Code ist ziemlich einfach, deshalb erkläre ich alles in den Kommentaren.

 package import flash.display.Sprite; import flash.events.MouseEvent; import flash.media.Sound; Sounds importieren.SoundManager; public class BoingPlayer erweitert Sprite public function BoingPlayer () // füge die Klicklistener für beide Schaltflächen hinzu boing_btn.addEventListener (MouseEvent.CLICK, onBoing); managedBoing_btn.addEventListener (MouseEvent.CLICK, onManagedBoing);  // den Sound direkt abspielen, indem Sie die Sound.play () -Methode aufrufen. private Funktion onBoing (e: MouseEvent): void var sound: Sound = new Boing (); sound.play ();  // den Sound mit dem Soundmanager auf der privaten Funktion "Boing" des Soundtracks abspielen onManagedBoing (e: MouseEvent): void var sound: Sound = new Boing (); SoundManager.play ("boing", Ton); 

Schritt 10: Beispieltestfahrt

Wir sind fertig. Drücken Sie Strg + Eingabetaste, um den Film zu testen, und versuchen Sie, schnell auf die Schaltflächen zu klicken (denken Sie daran, die Lautsprecher einzuschalten). Für das "Boing!" Wenn Sie die Taste drücken, überlappen sich mehrere Sounds. Wie für das "Managed Boing!" Wenn Sie die Taste drücken, die den Sound-Manager verwendet, muss ein Sound angehalten werden, bevor der nächste gespielt wird. Sie hören also keine gemischten Sounds.

Meilenstein Online ansehen

Schritt 11: Rahmenintegration

Befehle, Befehle, Befehle. Es ist immer schön, deine Arbeit in deine vorherigen zu integrieren, richtig? Jetzt werden wir das Sound-Management-Framework zusammen mit dem Szenen-Management-Framework in das Befehls-Framework integrieren. Wenn Sie sich mit dem Befehls-Framework und dem Szenen-Management-Framework nicht auskennen, sollten Sie sie in meinen vorherigen Lernprogrammen (Teil 1, Teil 2) überprüfen, bevor Sie fortfahren.


Schritt 12: Framework PlaySound Command

Der Name dieses Befehls ist ziemlich selbsterklärend: Er gibt einen Sound mit dem Soundmanager ab.

 Paket Befehle.sounds Importbefehle.Befehl; import flash.media.Sound; import flash.media.SoundTransform; Sounds importieren.SoundManager; / ** * Dieser Befehl gibt einen Ton aus. * / public class PlaySound erweitert den Befehl public var key: String; öffentlicher var sound: sound; public var startTime: int; öffentliche var-Schleifen: int; public var transform: SoundTransform; public function PlaySound (key: String, Sound: Sound, startTime: int = 0, Schleifen: int = 0, transform: SoundTransform = null) this.key = key; this.sound = sound; this.startTime = startTime; this.loops = Schleifen; this.transform = transform;  Überschreiben der geschützten Funktion execute (): void // weist den Soundmanager an, den Sound abzuspielen SoundManager.play (Schlüssel, Sound, startTime, Loops, Transformation); // vervollständige den Befehl complete (); 

Schritt 13: Framework StopSound-Befehl

Dies ist im Grunde der böse Cousin des vorherigen Befehls. Dieser Befehl stoppt einen Soundtrack mithilfe des Soundmanagers.

 Paket Befehle.sounds Importbefehle.Befehl; Sounds importieren.SoundManager; / ** * Dieser Befehl stoppt eine Tonspur, die einer bestimmten Taste entspricht. * / public class StopSound erweitert den Befehl public var key: String; öffentliche Funktion StopSound (key: String) this.key = key;  Überschreiben der geschützten Funktion execute (): void // weist den Soundmanager an, die Tonspur anzuhalten, wie übel>:] SoundManager.stop (key); // vervollständige den Befehl complete (); 

Schritt 14: Framework SoundLoad-Befehl

Dieser Befehl lädt eine externe MP3-Datei in eine Klingen Objekt. Erst wenn das Laden abgeschlossen ist, wird der Befehl ausgeführt Komplett() Methode aufgerufen werden. Auf diese Weise können wir den Befehl mit anderen Befehlen problemlos verketten, ohne sich um den Ladevorgang kümmern zu müssen.

 Paketbefehle.Laden Importbefehle.Befehl; import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; / ** * Dieser Befehl lädt einen Sound. * / public class SoundLoad erweitert den Befehl public var sound: Sound; public var url: URLRequest; öffentliche Funktion SoundLoad (Sound: Sound, URL: URLRequest) this.sound = sound; this.url = url;  Überschreibe die geschützte Funktion execute (): void // füge den vollständigen Listener hinzu sound.addEventListener (Event.COMPLETE, onComplete); // fange an zu laden sound.load (url);  private Funktion onComplete (e: Event): void // den vollständigen Listener entfernen sound.removeEventListener (Event.COMPLETE, onComplete); // vervollständige den Befehl complete (); 

Integration abgeschlossen Machen Sie sich auf unser letztes Beispiel vorbereitet!


Schritt 15: Beispiel zum Verwalten von Sounds mit Befehlen

In diesem Beispiel erlauben wir Benutzern, zwei Musik auf derselben Tonspur zu spielen. Wenn bei besetzter Tonspur ein Ton abgespielt werden soll, wird zunächst die Originalmusik ausgeblendet und anschließend die neue Musik abgespielt. Das Ausblenden wird von der übernommen TweenMaxTo Befehl, der die spezielle Eigenschaft intern verwendet Volumen bereitgestellt von der TweenMax Klasse von GreenSock Tweening Platform. Die beiden Musiken sind externe MP3-Dateien, die zur Laufzeit geladen werden.

Beachten Sie, dass wir das Szenemanagement-Framework verwenden werden. Wenn Sie Ihr Gedächtnis auffrischen möchten, gehen Sie hier nach.


Schritt 16: Beispiel zum Kopieren eines Flash-Dokuments

Erstellen Sie eine Kopie der FLA-Datei, die im vorherigen Beispiel verwendet wurde. Benennen Sie die Schaltflächen in "music1_btn" und "music2_btn" um. Sie können die Tastenbeschriftungen auch in "Music 1" und "Music 2" ändern. Fügen Sie eine zusätzliche Schaltfläche mit dem Namen "stop_btn" hinzu, die zum Stoppen der Musik dient.


Schritt 17: Beispiel Kopieren Sie die MP3-Dateien

Die MP3-Dateien befinden sich im Quellordner. Kopieren Sie sie in den gleichen Ordner wie die FLA-Datei.


Schritt 18: Beispieldokumentklasse

Legen Sie eine neue AS-Datei für die Dokumentenklasse der neuen FLA-Datei an. Instantiieren Sie einen Szenenmanager und initialisieren Sie ihn in einem Ladezustand, in dem die beiden MP3-Dateien geladen werden.

 package import flash.display.Sprite; Szenen importieren. Szenenmanager; public class MusicPlayer erweitert Sprite public-Funktion MusicPlayer () // instanziiert ein Szenenmanagerobjekt var sceneManager: SceneManager = new SceneManager (); // eine Ladeszene als Anfangsszene festlegen sceneManager.setScene (new LoadingScene (this)); 

Schritt 19: Beispiel der Ladeszene

Die Ladeszene instantiiert zwei Klingen Objekte zum Laden der beiden MP3-Dateien. Die Schaltflächen sind zu Beginn unsichtbar und nach dem Laden wieder sichtbar. Wenn der Ladevorgang abgeschlossen ist, weist die Szene den Szenenmanager sofort an, zur Hauptszene zu wechseln, wie in der Überschreibung beschrieben onSceneSet () Methode. Weitere Details sind in den Kommentaren beschrieben.

 Paket Importbefehle.Befehl; import command.data.RegisterData; import command.loading.SoundLoad; Befehle importieren.ParallelCommand; Befehle importieren.SerialCommand; import command.utils.SetProperties; import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; Szenen importieren. Szene; public class LoadingScene erweitert Scene // einen Verweis auf den privaten Dokumentcontainer des privaten Containers: MusicPlayer; öffentliche Funktion LoadingScene (Container: MusicPlayer) this.container = Container;  override public function createIntroCommand (): Befehl // zwei Soundobjekte erstellen, um die beiden MP3-Dateien zu laden. var music1: Sound = new Sound (); var music2: Sound = neuer Sound (); Befehl var: Befehl = new ParallelCommand (0, // blendet die Schaltflächen neue SetProperties aus (container.music1_btn, alpha: 0, visible: false), neue SetProperties (container.music2_btn, alpha: 0, visible: false) , neue SetProperties (container.stop_btn, alpha: 0, visible: false), // registrieren Sie die beiden Klangobjekte im Datenmanager. new RegisterData ("music1", music1), neue RegisterData ("music2", music2). // Beginnen Sie mit dem Laden der MP3-Dateien. new SoundLoad (music1, neue URLRequest ("Music1.mp3")), neuer SoundLoad (music2, neue URLRequest ("Music2.mp3"))); Rückkehrbefehl;  override public function onSceneSet (): void // weist den Szenenmanager an, nach Abschluss des Intro-Befehls direkt zur Hauptszene zu wechseln sceneManager.setScene (new MainScene (container)); 

Schritt 20: Beispiel der Hauptszene

In der Hauptszene werden die ausgeblendeten Schaltflächen wieder sichtbar und das Symbol registriert spiel Musik() Methode und die stopMusic () Methode als Listener für das Click-Ereignis. In dem spiel Musik() wird ein serieller Befehl ausgeführt, wenn die Tonspur "bgm" belegt ist. Der Befehl entfernt zunächst die Click-Listener, blendet die aktuelle Musik aus, stoppt die aktuelle Musik, spielt die neue Musik auf der nun leeren "bgm" -Tonspur und fügt die Click-Listener schließlich wieder hinzu. Das stopMusic Methode macht im Grunde dasselbe, nur dass es keine neue Musikwiedergabe gibt. Diese komplexe Reihe von Aktionen wird in nur wenigen Zeilen sauberem Code ausgeführt. Ziemlich ordentlich, huh?

Beachten Sie, dass das Hinzufügen und Entfernen der Listener häufige Aktionen ist, die in beiden vorhanden sind spiel Musik() Methode und die stopMusic () Methode. Sie werden also als zwei private Immobilien ausgewertet, addListeners und removeListeners, im Konstruktor initialisiert.

 Paket Importbefehle.Befehl; import command.events.AddEventListener; import command.events.RemoveEventListener; import command.greensock.TweenMaxTo; Befehle importieren.ParallelCommand; Befehle importieren.SerialCommand; import command.sounds.PlaySound; import command.sounds.StopSound; Daten importieren. DataManager; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.media.Sound; import flash.utils.Dictionary; Szenen importieren. Szene; Sounds importieren.SoundManager; Sounds importieren.SoundTrack; / ** * Die Hauptszene wird angezeigt, wenn der Ladevorgang abgeschlossen ist. * / public class MainScene erweitert Scene // einen Verweis auf den privaten Dokumentencontainer des privaten Dokumentencontainers: MusicPlayer; private var btn1: Sprite; private var btn2: Sprite; private var btn3: Sprite; private var dataKeys: Dictionary = neues Dictionary (); private var addListeners: Befehl; private var removeListeners: Befehl; öffentliche Funktion MainScene (Container: MusicPlayer) this.container = Container; btn1 = container.music1_btn; btn2 = container.music2_btn; btn3 = container.stop_btn; // Datenschlüssel zum Abrufen von Klangobjekten vom Datenmanager in der playMusic () - Methode dataKeys [btn1] = "music1"; dataKeys [btn2] = "music2"; // Dieser Befehl fügt alle Listener hinzu. addListeners = new ParallelCommand (0, neuer AddEventListener (btn1, MouseEvent.CLICK, playMusic), neuer AddEventListener (btn2, MouseEvent.CLICK, playMusic), neuer AddEventListener (btn3, MouseEvent.CLICK, stopMusic). ; // Mit diesem Befehl werden alle Listener entfernt. removeListeners = new ParallelCommand (0, neuer RemoveEventListener (btn1, MouseEvent.CLICK, playMusic), neuer RemoveEventListener (btn2, MouseEvent.CLICK, playMusic), neuer RemoveEventListener (btn3, MouseEvent.CLICK, stopMail). ;  public function createIntroCommand () überschreiben: Befehl var Befehl: Befehl = Neuer SerialCommand (0, // Einblenden der Schaltflächen Neuer ParallelCommand (0, neuer TweenMaxTo (Btn1, 1, AutoAlpha: 1), neuer TweenMaxTo (Btn2, 1, autoAlpha: 1), neues TweenMaxTo (btn3, 1, autoAlpha: 1)), // Click-Listener hinzufügen addListeners); Rückkehrbefehl;  / ** * Spielt die Musik ab. * / private Funktion playMusic (e: Event): void // Abrufen des einem Datenschlüssel entsprechenden Soundobjekts var music: Sound = DataManager.getData (dataKeys [e.target]); // Überprüfen Sie, ob der BGM-Soundtrack bereits abgespielt wird, wenn (SoundManager.isPlaying ("bgm")) // den wiedergegebenen Soundtrack abrufen var soundTrack: SoundTrack = SoundManager.getSoundTrack ("bgm"); Befehl var: Befehl = new SerialCommand (0, // Entferne vorübergehend die Click-Listener, removeListeners, // blende den aktuellen Soundtrack aus, new TweenMaxTo (soundTrack.channel, 1, volume: 0), // und stoppe den Soundtrack new StopSound ("bgm"), // einen neuen Sound auf demselben Soundtrack abspielen new PlaySound ("bgm", music, 0, int.MAX_VALUE), // Klick-Listener neu hinzufügen addListeners); command.start ();  else // spielt den Ton einfach ab, wenn die Tonspur frei ist SoundManager.play ("bgm", music, 0, int.MAX_VALUE);  / ** * Stoppt die aktuell wiedergegebene Musik. * / private Funktion stopMusic (e: Event): void // Überprüfen Sie, ob der BGM-Soundtrack bereits abgespielt wird, wenn (SoundManager.isPlaying ("bgm")) // den abzuspielenden Soundtrack abrufen var soundTrack: SoundTrack = SoundManager. getSoundTrack ("bgm"); Befehl var: Befehl = new SerialCommand (0, // Entferne vorübergehend die Click-Listener, removeListeners, // blende den aktuellen Soundtrack aus, new TweenMaxTo (soundTrack.channel, 1, volume: 0), // und stoppe den Soundtrack new StopSound ("bgm"), // Klicklistener hinzufügen addListeners); command.start (); 

Schritt 21: Beispiel Testen Sie den Film

Wir sind bereit, den Film zu testen. Drücken Sie STRG + EINGABETASTE, um es zu testen. Wenn Sie auf eine Schaltfläche klicken, beginnt die Musikwiedergabe. Nachdem Sie auf eine andere geklickt haben, wird die Musik ausgeblendet, und eine neue beginnt am Anfang.

Meilenstein Online ansehen

Schritt 22: Extra Code Jockey Version

Ich weiß, es ist das Ende des Tutorials. Aber ich konnte einfach nicht widerstehen, dir das zu zeigen. Wenn Sie ein Code-Jockey sind, wette ich, dass Sie bereits bemerkt haben, dass es viele Gemeinsamkeiten gibt spiel Musik() Methode und die stopMusic () Methode. Warum nicht sie in einen einzigen umwandeln? Wenn Sie an dieser Code-Jocky-Version des Musik-Players nicht interessiert sind, können Sie zum Übersichtsabschnitt springen. Ansonsten lesen Sie einfach weiter!

Ersetzen Sie zunächst alle spiel Musik und stopMusic im Quellcode mit handleMusic, unser neuer Event-Listener. Als nächstes löschen Sie die spiel Musik und das stopMusic Methode und fügen Sie Folgendes hinzu handleMusic () Methode in der Hauptszenenklasse.

 / ** * Spielt oder stoppt die Musik. Code-Jockey-Version. * / private Funktion handleMusic (e: Event): void var music: Sound = DataManager.getData (dataKeys [e.target]); if (SoundManager.isPlaying ("bgm")) var soundTrack: SoundTrack = SoundManager.getSoundTrack ("bgm"); Befehl var: Befehl = Neuer SerialCommand (0, removeListeners, neuer TweenMaxTo (soundTrack.channel, 1, volume: 0), neuer StopSound ("bgm"), // bestimmen, ob eine andere Musik (Musik) abgespielt wird )? (new PlaySound ("bgm", music, 0, int.MAX_VALUE)): (new Dummy ()), addListeners); command.start ();  else if (music) SoundManager.play ("bgm", music, 0, int.MAX_VALUE); 

Sie werden feststellen, dass der einzige wesentliche Unterschied zwischen dieser Methode und den ursprünglichen Zuhörern der folgende Code-Block ist:

 (Musik)? (new PlaySound ("bgm", music, 0, int.MAX_VALUE)): (new Dummy ()),

Was zur Hölle ist das überhaupt? Dies ist eigentlich der?: Bedingungsoperator. Es ist ein ternärer Operator, dh es sind drei Operanden A, B und C erforderlich. Die Anweisung "A? B: C" wertet B aus, wenn A wahr ist, oder ansonsten C. Das Musik- Variable soll einen Verweis auf a halten Klingen Objekt, damit die Variable als wahr ausgewertet wird. Wenn das Ereignis-Dispatcher-Ziel jedoch die Schaltfläche "stop_btn" ist, enthält die Variable einen Nullwert, der im ternären Operator mit false ausgewertet wird. Wenn Sie also auf die beiden Musiktasten klicken, wird der obige Codeabschnitt als die einzige Codezeile betrachtet.

 neuer PlaySound ("bgm", Musik, 0, int.MAX_VALUE)

Andernfalls wird der Code-Block als Dummy-Befehl betrachtet, wenn die Stopp-Schaltfläche angeklickt wird, was einfach nichts tut.

 neuer Dummy ()

Nur noch eine Sache zu beachten. Die folgende Codezeile

 SoundManager.play ("bgm", music, 0, int.MAX_VALUE);

wird in geändert

 if (music) SoundManager.play ("bgm", music, 0, int.MAX_VALUE);

Dies ist für die Handhabung die Ausnahme, dass die Tonspur derzeit leer ist. Wenn Sie den Code-Abschnitt oben verstehen können, bin ich mir ziemlich sicher, dass Sie herausfinden können, worum es in dieser Zeile geht.

Testen Sie den Film durch Drücken von Strg + Eingabetaste. Das Ergebnis wird wie im letzten Beispiel angezeigt. Sie können es als Erfüllung der Kodierungseier eines Codejockeys ansehen.


Zusammenfassung

In diesem Lernprogramm haben Sie gelernt, wie Sounds mit Tonspuren verwaltet werden. Bei einer Tonspur kann jeweils nur ein Sound abgespielt werden, ideal, um die Stimme oder Hintergrundmusik einer einzelnen Figur darzustellen. Sie haben auch gesehen, wie Sie das Sound-Management-Framework in das Befehls-Framework integrieren, was Ihnen eine enorme Wartbarkeit und Flexibilität für Ihre Anwendungen bietet.

Dies ist das Ende des Tutorials. Ich hoffe, dass es Ihnen gefallen hat. Vielen Dank fürs Lesen!