Goed beheer is erg belangrijk voor veel soorten Flash-toepassingen, zoals interactieve websites en games. Zolang u een rijke interactieve ervaring wilt leveren, kunt u overwegen geluidseffecten en achtergrondmuziek te gebruiken. In deze tutorial zal ik een minimalistisch kader voor geluidsbeheer presenteren dat geluiden in soundtracks beheert. En ik zal laten zien hoe ik het degelijke framework kan integreren met het command framework van mijn vorige tutorials.
Ik heb games gespeeld met onvoorzichtig geluidsmanagement en dat verslechtert de gebruikerservaring. Heb je ooit een spel gespeeld, laten we zeggen een actiegame, waarbij de uitroeptoon van het personage speelt voordat de vorige stem eindigt, elkaar overlappend? Dat is het gevolg van slecht geluidsbeheer: er mag niet meer dan één stem van hetzelfde personage tegelijk worden afgespeeld. Het kader voor het geluidsbeheer dat ik ga behandelen, zal dit probleem oplossen door geluiden met geluidssporen te beheren.
De voorbeelden in deze zelfstudie maken gebruik van het opdrachtraamwerk en het kader voor scènebeheer uit mijn vorige zelfstudie, Thinking in Commands (deel 1, deel 2), en de voorbeelden maken ook gebruik van de Data Manager-klasse van Data laden met opdrachten. Ik raad u ten zeerste aan eerst deze zelfstudies door te nemen voordat u verdergaat. U hebt ook het GreenSock Tweening Platform nodig om de voorbeelden te voltooien.
De soundtrack waar we het hier over hebben heeft niets te maken met geluidssporen van games of films. Een soundtrack is een denkbeeldige "track" geassocieerd met een playback van a single geluid. Eén enkel geluidsspoor laat niet meer dan één geluid tegelijkertijd spelen. Als een soundtrack momenteel een geluid afspeelt, zeggen we dat het dat is bezet. Als er op een bezet geluidsspoor een ander geluid moet worden afgespeeld, wordt het huidig spelende geluid gestopt en wordt het nieuwe geluid op de track afgespeeld. Het is dus redelijk om de stemmen van een enkel personage op een enkel geluidsspoor af te spelen, om het eerder genoemde probleem met geluidoverlappingen te voorkomen. In de meeste gevallen zou er ook maar één nummer voor achtergrondmuziek moeten zijn.
Laten we een paar conceptuele figuren bekijken. Een enkele applicatie kan meerdere soundtracks hebben.
Elke soundtrack kan één enkel afspeelgeluid bevatten.
Als een geluid op een bezet spoor moet worden afgespeeld, wordt het "oude" geluid eerst gestopt en vervolgens wordt het "nieuwe" geluid op het nummer afgespeeld.
Het Sound Management-raamwerk bestaat uit twee klassen, de SoundManager klasse en de Soundtrack klasse. Aan elke soundtrack wordt een unieke key-string toegewezen. Het onderliggende afspeelgeluid van een bezette soundtrack is eigenlijk een native SoundChannel-object dat is verkregen uit de oorspronkelijke methode Sound.play () en de SoundManager klasse beheert geluidssporen en organiseert het afspelen van geluiden.
Hier zijn enkele snelle voorbeelden van het gebruik van het framework. De volgende code speelt een nieuw geluid af op een soundtrack die is gekoppeld aan de toetsreeks "music", waar MySound is een geluidsklasse uit de bibliotheek.
// speel een geluid af op de "muziek" track SoundManager.play ("music", nieuwe MySound ());
Als dezelfde regel code opnieuw wordt uitgevoerd voordat het afspelen is voltooid, wordt het originele geluid gestopt en wordt een nieuw geluid afgespeeld op de track "music".
// stop het originele geluid op de "muziek" -track en speel een nieuwe SoundManager.play ("music", nieuwe MySound ());
De SoundManager.stop () methode stopt een soundtrack verbonden aan een gespecificeerde sleutelstring.
// stop de "muziek" soundtrack SoundManager.stop ("muziek");
Om het geluid te transformeren, zoals het volume aan te passen, moeten we een verwijzing naar het onderliggende geluidskanaal van een geluidsspoor verkrijgen. De referentie kan worden verkregen door de SoundTrack.channel eigendom.
var channel: SoundChannel = SoundManager.getSoundTrack ("music"). channel; var-transformatie: SoundTransform = channel.soundTransform; transform.volume = 0,5; channel.soundTransform = transformeren;
Genoeg theorie. Laten we naar de codering gaan. We gaan verschillende gebruiken sleutelreeksen om verschillende geluidssporen te onderscheiden. Hier is de Soundtrack klasse, die in wezen een sleutelkanaalpaar vertegenwoordigt. Details worden beschreven in reacties.
pakketgeluiden import flash.media.SoundChannel; / ** * Een soundtrack vertegenwoordigt een key-channel-paar. * / public class SoundTrack // alleen-lezen sleutelwaarde private var _key: String; public function get key (): String return _key; // alleen-lezen geluidskanaalreferentie private var _channel: SoundChannel; public function get channel (): SoundChannel return _channel; openbare functie SoundTrack (key: String, channel: SoundChannel) _key = key; _kanaal = kanaal; / ** * Stopt het onderliggende geluidskanaal. * / openbare functie stop (): void _channel.stop ();
En hier is de SoundManager klasse. Merk op dat de sleutel-track koppeling wordt afgehandeld door de klasse Dictionary te gebruiken. Een nummer wordt automatisch geleegd als een afspeelgeluid het einde heeft bereikt.
pakketgeluiden import flash.events.Event; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundTransform; import flash.utils.Dictionary; / ** * Met deze klasse kunt u geluiden beheren op basis van geluidssporen. * / public class SoundManager // een woordenboek dat tracks van alle soundtracks privé statische var bevat _soundTracks: Dictionary = new Dictionary (); // een woordenboek dat een geluidskanaal toewijst aan de corresponderende sleutel voor het voltooien van het afspelen van de verwerking van privéstatistieken var _soundKeys: Dictionary = new Dictionary (); / ** * Speelt een geluid af en geeft een bijbehorend geluidsspoorobject terug. * / openbare statische functie spelen (key: String, geluid: Sound, startTime: int = 0, loops: int = 0, transform: SoundTransform = null): SoundTrack // als de soundtrack bezet is, stop dan de huidige soundtrack if (isPlaying (toets)) stop (toets); // speel het geluid af, maak een nieuw kanaal voor het geluidskanaal var: SoundChannel = sound.play (startTime, loops, transform); // luister naar de complete gebeurtenis van het kanaalkanaal channel.addEventListener (Event.SOUND_COMPLETE, onSoundComplete); // maak een nieuwe soundtrack var soundTrack: SoundTrack = nieuwe SoundTrack (sleutel, kanaal); // voeg de soundtrack toe aan het woordenboek _soundTracks [key] = soundTrack; // voeg de kanaal-sleutel afbeeldingsrelatie toe _soundKeys [channel] = key; return soundTrack; / ** * Retourneert een verwijzing naar het geluidsspoor dat overeenkomt met de opgegeven sleutelreeks. * / openbare statische functie getSoundTrack (key: String): SoundTrack return _soundTracks [sleutel]; / ** * Bepaalt of een soundtrack wordt afgespeeld. * / public static function isPlaying (key: String): Boolean return Boolean (_soundTracks [key]); / ** * Stopt een soundtrack. * / public static function stop (key: String): void var soundTrack: SoundTrack = _soundTracks [key]; // controleer of de soundtrack bestaat als (soundTrack) // stop de soundtrack soundTrack.stop (); // en verwijder het uit het woordenboek delete _soundTracks [key]; // samen met de kanaal-sleutelrelatie delete _soundKeys [soundTrack.channel]; / ** * Hiermee verwijdert u een soundtrack wanneer het afspelen van het geluid is voltooid * / persoonlijke statische functie onSoundComplete (e: Event): void // cast de gebeurtenisverdeler naar een geluidskanaalobject var-kanaal: SoundChannel = SoundChannel (e. doelwit); // verwijder de gebeurtenislistener channel.removeEventListener (Event.SOUND_COMPLETE, onSoundComplete); // extraheer de bijbehorende sleutelvarensleutel: String = _soundKeys [channel]; // verwijder de soundtrackstop (toets);
Laten we nu ons kader voor goed beheer testen. We gaan het resultaat van herhaalde verzoeken vergelijken om een geluid te spelen met en zonder gebruik van de geluidsbeheerder.
Maak een nieuw Flash-document (duh).
Maak twee knoppen op het podium. U kunt uw eigen tekens tekenen en deze converteren naar symbolen, of u kunt, zoals in mijn geval, twee componenten Button uit het deelvenster Componenten slepen. Noem ze "boing_btn" en "managedBoing_btn".
Importeer het geluid dat we gaan spelen naar de bibliotheek. U kunt het bestand "Boing.wav" vinden in de voorbeeldbronmap.
Maak ten slotte een AS-bestand voor de documentklasse. De code is vrij eenvoudig, dus leg ik alles uit in de opmerkingen.
pakket import flash.display.Sprite; import flash.events.MouseEvent; import flash.media.Sound; importeert geluiden. SoundManager; openbare klasse BoingPlayer breidt Sprite uit openbare functie BoingPlayer () // voeg de kliklisters toe voor beide knoppen boing_btn.addEventListener (MouseEvent.CLICK, onBoing); managedBoing_btn.addEventListener (MouseEvent.CLICK, onManagedBoing); // speel het geluid direct af door de methode Sound.play () aan te roepen. private function onBoing (e: MouseEvent): void var sound: Sound = new Boing (); sound.play (); // speel het geluid af met de soundmanager op de "boing" soundtrack private functie op ManagedBoing (e: MouseEvent): void var sound: Sound = new Boing (); SoundManager.play ("boing", geluid);
Werden gedaan. Druk op Ctrl + Enter om de film te testen en probeer snel op de knoppen te klikken (vergeet niet om uw luidsprekers in te schakelen). Voor de "Boing!" knop, meerdere geluiden overlappen elkaar tijdens het spelen. Wat betreft de "Managed Boing!" knop, die gebruik maakt van de sound manager, een geluid wordt gedwongen om te stoppen voordat de volgende wordt gespeeld, zodat je geluiden niet door elkaar hoort horen.
Mijlpaal Bekijk het onlineCommando's, commando's, commando's. Het is altijd fijn om je werk te integreren met je vorige, toch? Nu gaan we het kader voor goed beheer integreren met het opdrachtraamwerk, samen met het kader voor scènebeheer. Nogmaals, als u niet bekend bent met het opdrachtkader en het kader voor scènebeheer, kunt u ze beter bekijken in mijn eerdere zelfstudies (deel 1, deel 2) voordat u doorgaat.
De naam van deze opdracht spreekt voor zich: hij speelt een geluid met de geluidsbeheerder.
package commands.sounds import commands.Command; import flash.media.Sound; import flash.media.SoundTransform; importeert geluiden. SoundManager; / ** * Deze opdracht speelt een geluid af. * / public class PlaySound breidt Command uit public var key: String; openbaar var-geluid: geluid; public var startTime: int; openbare var-lussen: int; public var transform: SoundTransform; openbare functie PlaySound (key: String, sound: Sound, startTime: int = 0, loops: int = 0, transform: SoundTransform = null) this.key = key; this.sound = geluid; this.startTime = startTime; this.loops = loops; this.transform = transformeren; override protected function execute (): void // vertel de geluidsbeheerder om het geluid SoundManager.play (key, sound, startTime, loops, transform) af te spelen; // voltooi de opdracht voltooid ();
Dit is eigenlijk de boze neef van het vorige commando. Deze opdracht stopt een soundtrack met behulp van de geluidsbeheerder.
package commands.sounds import commands.Command; importeert geluiden. SoundManager; / ** * Deze opdracht stopt een geluidsspoor dat overeenkomt met een bepaalde toets. * / openbare klasse StopSound verlengt opdracht public var key: String; openbare functie StopSound (key: String) this.key = key; override protected function execute (): void // vertel de geluidsbeheerder om het geluidsspoor te stoppen, hoe kwaad>:] SoundManager.stop (sleutel); // voltooi de opdracht voltooid ();
Deze opdracht laadt een extern MP3-bestand in een Geluid voorwerp. Pas als het laden is voltooid, zal het commando verschijnen compleet() methode wordt aangeroepen. Dit stelt ons in staat om de opdracht eenvoudig samen te voegen met andere opdrachten, zonder ons zorgen te hoeven maken over het afhandelen van de laadvoltooiing.
pakket commands.loading import commands.Command; import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; / ** * Deze opdracht laadt een geluid. * / public class SoundLoad breidt Command uit public var sound: Sound; public var url: URLRequest; openbare functie SoundLoad (geluid: geluid, url: URLRequest) this.sound = geluid; this.url = url; override protected function execute (): void // add the complete listener sound.addEventListener (Event.COMPLETE, onComplete); // begin met het laden van sound.load (url); private function onComplete (e: Event): void // verwijder de complete listener sound.removeEventListener (Event.COMPLETE, onComplete); // voltooi de opdracht voltooid ();
Integratie voltooid. Bereid u voor op ons laatste voorbeeld!
In dit voorbeeld gaan we gebruikers toestaan twee muziek af te spelen op dezelfde soundtrack. Als een geluid moet worden afgespeeld wanneer de soundtrack bezet is, wordt de oorspronkelijke muziek eerst vervaagd en wordt de nieuwe muziek afgespeeld. De vervaging wordt afgehandeld door de TweenMaxTo opdracht, die intern de speciale eigenschap gebruikt volume aangeboden door de TweenMax klas van GreenSock Tweening Platform. De twee muziek zijn externe MP3-bestanden geladen tijdens runtime.
Merk op dat we het scenariobeheerkader gaan gebruiken. Als je je geheugen wilt vernieuwen, kijk dan hier.
Maak een kopie van het FLA-bestand dat in het vorige voorbeeld werd gebruikt. Hernoem de knoppen naar "music1_btn" en "music2_btn". U kunt de knoplabels ook wijzigen in "Muziek 1" en "Muziek 2". En voeg een extra knop toe met de naam "stop_btn", die bedoeld is om de muziek te stoppen.
De MP3-bestanden zijn te vinden in de bronmap. Kopieer ze naar dezelfde map als het FLA-bestand.
Maak een nieuw AS-bestand voor de documentklasse van het nieuwe FLA-bestand. Start een scènebeheerder en initialiseer deze in een laadstatus, waarin de twee MP3-bestanden zijn geladen.
pakket import flash.display.Sprite; import scenes.SceneManager; public class MusicPlayer breidt uit Sprite public function MusicPlayer () // instantiate a scene manager object var sceneManager: SceneManager = new SceneManager (); // stel een laadscène in als de initiële scènescèneManager.setScene (nieuwe LoadingScene (this));
De laadscène zorgt voor twee Geluid objecten voor het laden van de twee MP3-bestanden. De knoppen zijn aan het begin onzichtbaar en worden opnieuw zichtbaar zodra het laden is voltooid. Wanneer het laden is voltooid, geeft de scène de scènemanager onmiddellijk opdracht om naar de hoofdscène te gaan, zoals beschreven in de overschreven taal onSceneSet () methode. Verdere details worden beschreven in de commentaren.
pakket import commands.Command; import commands.data.RegisterData; import commands.loading.SoundLoad; importeer commando's. ParallelCommand; importeer commando's.SerialCommand; import commands.utils.SetProperties; import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; scènes importeren. Scene; public class LoadingScene breidt Scene uit // een verwijzing naar de document root container private var container: MusicPlayer; publieke functie LoadingScene (container: MusicPlayer) this.container = container; override public function createIntroCommand (): Command // maak twee geluidsobjecten om de twee MP3-bestanden te laden var music1: Sound = new Sound (); var music2: Sound = new Sound (); var-opdracht: Command = new ParallelCommand (0, // verberg de knoppen nieuwe SetProperties (container.music1_btn, alpha: 0, visible: false), nieuwe SetProperties (container.music2_btn, alpha: 0, visible: false) , nieuwe SetProperties (container.stop_btn, alpha: 0, visible: false), // registreer de twee geluidsobjecten bij de gegevensmanager nieuwe RegisterData ("music1", music1), nieuwe RegisterData ("music2", music2), // begin met het laden van de MP3-bestanden nieuwe SoundLoad (music1, nieuwe URLRequest ("Music1.mp3")), nieuwe SoundLoad (music2, nieuwe URLRequest ("Music2.mp3"))); terugkeer commando; override public function onSceneSet (): void // vertel de scènebeheerder om direct naar de hoofdscène te schakelen nadat de intro-opdracht voltooid is sceneManager.setScene (new MainScene (container));
De hoofdscène brengt de verborgen knoppen terug naar zichtbaar en registreert de speel muziek() methode en de stopMusic () methode als luisteraars voor de klikgebeurtenis. In de speel muziek() methode, wordt een serieel commando uitgevoerd als de "bgm" soundtrack bezet is. De opdracht verwijdert eerst de klikluisteraars tijdelijk, vervaagt de huidige muziek, stopt de huidige muziek, speelt de nieuwe muziek af op het nu lege "bgm" -geluidsspoor en voegt de luisteraars eindelijk opnieuw toe. De stopMusic methode is in principe hetzelfde, alleen dat er geen nieuwe muziek wordt afgespeeld. Deze complexe reeks acties wordt uitgevoerd in slechts enkele regels met schone code. Behoorlijk goed, he?
Merk op dat het toevoegen en verwijderen van luisteraars veel voorkomende acties zijn die aanwezig zijn in zowel de speel muziek() methode en de stopMusic () methode. Dus ze worden weggelaten als twee privé-eigendommen, addListeners en removeListeners, geïnitialiseerd in de constructor.
pakket import commands.Command; import commands.events.AddEventListener; import commands.events.RemoveEventListener; import commands.greensock.TweenMaxTo; importeer commando's. ParallelCommand; importeer commando's.SerialCommand; import commands.sounds.PlaySound; import commands.sounds.StopSound; import data.DataManager; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.media.Sound; import flash.utils.Dictionary; scènes importeren. Scene; importeert geluiden. SoundManager; importeer geluids.SoundTrack; / ** * De hoofdscène wordt weergegeven wanneer het laden is voltooid. * / public class MainScene breidt Scene uit // een verwijzing naar de document root container private var container: MusicPlayer; privé var btn1: Sprite; privé var btn2: Sprite; privé var btn3: Sprite; private var dataKeys: Dictionary = new Dictionary (); private var addListeners: Command; private var removeListeners: Command; openbare functie MainScene (container: MusicPlayer) this.container = container; btn1 = container.music1_btn; btn2 = container.music2_btn; btn3 = container.stop_btn; // gegevenstoetsen die worden gebruikt om geluidobjecten op te halen uit de gegevensmanager in de methode playMusic () dataKeys [btn1] = "music1"; dataKeys [btn2] = "music2"; // deze opdracht voegt alle listeners toe addListeners = nieuwe ParallelCommand (0, nieuwe AddEventListener (btn1, MouseEvent.CLICK, playMusic), nieuwe AddEventListener (btn2, MouseEvent.CLICK, playMusic), nieuwe AddEventListener (btn3, MouseEvent.CLICK, stopMusic)) ; // deze opdracht verwijdert alle listeners removeListeners = nieuwe ParallelCommand (0, nieuwe RemoveEventListener (btn1, MouseEvent.CLICK, playMusic), nieuwe RemoveEventListener (btn2, MouseEvent.CLICK, playMusic), nieuwe RemoveEventListener (btn3, MouseEvent.CLICK, stopMusic)) ; override public function createIntroCommand (): Commando var command: Command = new Serial Commando (0, // fade in de knoppen new ParallelCommand (0, new TweenMaxTo (btn1, 1, autoAlpha: 1), nieuwe TweenMaxTo (btn2, 1, autoAlpha: 1), nieuwe TweenMaxTo (btn3, 1, autoAlpha: 1)), // add click listeners addListeners); terugkeer commando; / ** * Speelt de muziek af. * / persoonlijke functie playMusic (e: Event): void // haalt het geluidsobject op dat overeenkomt met een gegevenssleutel var music: Sound = DataManager.getData (dataKeys [e.target]); // controleer of het BGM-geluidsspoor al wordt afgespeeld als (SoundManager.isPlaying ("bgm")) // het afspeelgeluidsspoor ophalen var soundTrack: SoundTrack = SoundManager.getSoundTrack ("bgm"); var command: Command = new SerialCommand (0, // tijdelijk klik luisteraars verwijderen removeListeners, // vervaag het huidige soundtrack nieuw TweenMaxTo (soundTrack.channel, 1, volume: 0), // en stop dan het soundtrack nieuwe StopSound ("bgm"), // speel een nieuw geluid op dezelfde soundtrack nieuwe PlaySound ("bgm", muziek, 0, int.MAX_VALUE), // voeg clicklistlisters addListeners opnieuw toe); command.start (); else // speel gewoon het geluid af als de soundtrack niet actief is SoundManager.play ("bgm", music, 0, int.MAX_VALUE); / ** * Stopt de muziek die momenteel wordt afgespeeld. * / persoonlijke functie stopMusic (e: Event): void // controleer of het BGM-geluidsspoor al wordt afgespeeld als (SoundManager.isPlaying ("bgm")) // het afspeelgeluidsspoor ophalen var soundTrack: SoundTrack = SoundManager. getSoundTrack ( "AGM"); var command: Command = new SerialCommand (0, // tijdelijk klik luisteraars verwijderen removeListeners, // vervaag het huidige soundtrack nieuw TweenMaxTo (soundTrack.channel, 1, volume: 0), // en stop dan het soundtrack nieuwe StopSound ("bgm"), // klik clicklisters addListeners opnieuw toe); command.start ();
We zijn klaar om de film te testen. Druk op CTRL + ENTER om het te testen. Wanneer u op een knop klikt, wordt een muziek afgespeeld. Nadat je op een andere hebt geklikt, verdwijnt de muziek en begint een nieuwe vanaf het begin.
Mijlpaal Bekijk het onlineHet is het einde van de tutorial, ik weet het. Maar ik kon het gewoon niet laten om dit aan u te laten zien. Als je een code jockey bent, wed ik dat je al hebt opgemerkt dat er veel overeenkomsten in de speel muziek() methode en de stopMusic () methode. Waarom niet refactoren in een enkele? Als u niet geïnteresseerd bent in deze code jocky-versie van de muziekspeler, kunt u doorgaan naar de samenvatting sectie. Ga anders gewoon door met lezen!
Vervang eerst alle speel muziek en stopMusic in de broncode met handleMusic, onze nieuwe gebeurtenisluisteraar. Verwijder vervolgens de speel muziek en de stopMusic methode en voeg het volgende toe handleMusic () methode in de hoofdscenerklasse.
/ ** * Hiermee wordt de muziek afgespeeld of gestopt. Code jockey-versie. * / private function handleMusic (e: Event): void var music: Sound = DataManager.getData (dataKeys [e.target]); if (SoundManager.isPlaying ("bgm")) var soundTrack: SoundTrack = SoundManager.getSoundTrack ("bgm"); var command: Command = new SerialCommand (0, removeListeners, new TweenMaxTo (soundTrack.channel, 1, volume: 0), new StopSound ("bgm"), // bepaal of we een andere muziek gaan spelen (muziek )? (nieuwe PlaySound ("bgm", muziek, 0, int.MAX_VALUE)): (nieuwe Dummy ()), addListeners); command.start (); else if (muziek) SoundManager.play ("bgm", muziek, 0, int.MAX_VALUE);
Je zult merken dat het enige grote verschil tussen deze methode en de originele luisteraars het volgende stuk code is:
(muziek)? (nieuwe PlaySound ("bgm", muziek, 0, int.MAX_VALUE)): (nieuwe Dummy ()),
Wat is dit in vredesnaam eigenlijk? Dit is eigenlijk de operator?: Conditional. Het is een ternaire operator, wat betekent dat het drie operanden vereist, A, B en C. De verklaring "A? B: C" evalueert naar B als A waar is, of C anders. De muziek- variabele hoort een verwijzing naar a te bevatten Geluid object, zodat de variabele evalueert naar true. Als het doel van de gebeurtenisverdeler echter de knop "stop_btn" is, bevat de variabele een nulwaarde, die in de ternaire operator resulteert in false. Dus, als op de twee muziekknoppen wordt geklikt, wordt het bovenstaande codeblok als de enige regel code hieronder beschouwd.
nieuwe PlaySound ("bgm", muziek, 0, int.MAX_VALUE)
Anders, als op de stopknop wordt geklikt, wordt het codeblok als een dummy-commando beschouwd, wat simpelweg niets doet.
nieuwe Dummy ()
Nog een ding om op te letten. De volgende regel code
SoundManager.play ("bgm", muziek, 0, int.MAX_VALUE);
is veranderd in
if (muziek) SoundManager.play ("bgm", muziek, 0, int.MAX_VALUE);
Dit is voor het verwerken van de uitzondering dat de soundtrack momenteel leeg is. Als je de bovenstaande code kunt begrijpen, ben ik er vrij zeker van dat je erachter kunt komen waar deze regel over gaat.
Test de film door op Ctrl + Enter te drukken, u zult exact hetzelfde resultaat zien als in het laatste voorbeeld. Je kunt het beschouwen als een vervulling van de coderende ijdelheid van een code jockey.
In deze zelfstudie hebt u geleerd hoe u geluiden met soundtracks kunt beheren. Eén geluidsspoor laat toe dat slechts één geluid tegelijkertijd wordt afgespeeld, en is daarom ideaal om de stem of achtergrondmuziek van een enkel personage weer te geven. Ook hebt u gezien hoe u het framework voor geluidsbeheer kunt integreren met het opdrachtraamwerk, dat u een enorme onderhouds- en flexibiliteitsbevorderende werking geeft voor uw toepassingen..
Dit is het einde van de tutorial. Ik hoop dat je het leuk vond. Heel erg bedankt voor het lezen!