2012-03-26 7 views
0

Also dieser hat mich ratlos. Mein Plan für meine Website besteht darin, Musiktitel aus einer XML-Datei zu ziehen, die als Hintergrundmusik für die verschiedenen .swfs dienen, die über die Menüschaltflächen geladen werden. I.e. Hit 'Home', und es bringt Sie zurück nach Hause. SWF und spielt die entsprechende Musik. Ich möchte dies über XML tun, anstatt die Musik direkt an die .swf anzuhängen, um die Ladezeit zu verkürzen (Synchronisierung ist kein Problem), da ich die Audioqualität scheinbar nicht beibehalten kann, ohne die .swf signifikant zu vergrößern.AS3 - XML-Playlist mit Single-Track-Looping

Ich stoße auf zwei Probleme: eine ist, dass mit dem aktuellen Code die Musik nur einmal abgespielt wird, und keine Schleife. Die andere ist, dass ich möchte, dass die Funktion einen Song als Intro spielt und dann einen anderen Song wiederholt. D. h., Drücken Sie die Home-Taste, Intro-Spiele, gefolgt vom Looping-Bereich, und kehren Sie niemals zum Intro zurück, es sei denn, Sie treffen wieder zu Hause. Ich kann nicht herausfinden, wie man mit diesen beiden Dingen fertig wird, ohne eine einzigartige Funktion für jede Taste zu erstellen.

Hier ist der Code, den ich mit:

var my_songs:XMLList; 
var my_total:Number; 

var my_sound:Sound; 
var my_channel:SoundChannel; 

var current_song:Number; 

var myXMLLoader:URLLoader = new URLLoader(); 
myXMLLoader.load(new URLRequest("playlist.xml")); 
myXMLLoader.addEventListener(Event.COMPLETE, processXML); 

function processXML(e:Event):void { 
    var myXML:XML = new XML(e.target.data); 

    my_songs = myXML.SONG; 
    my_total = my_songs.length(); 

    //playSong(0); 

    myXMLLoader.removeEventListener(Event.COMPLETE, processXML); 
    myXMLLoader = null; 

} 

function playSong(mySong:Number):void { 
    var myURL = my_songs[mySong][email protected]; 

    if (my_channel) { 
     my_channel.stop(); 
     my_channel.removeEventListener(Event.SOUND_COMPLETE, playSong); 
    } 

    my_sound = new Sound(); 
    my_sound.load(new URLRequest(myURL)); 
    my_channel = my_sound.play(); 
    my_channel.addEventListener(Event.SOUND_COMPLETE, playSong); 
} 

test_btn.addEventListener(MouseEvent.CLICK, onPlay); 
function onPlay(e:MouseEvent):void { 
     playSong(0); 
} 

Vielen Dank im Voraus für jede Hilfe, die Sie geben können!

Antwort

0
YourSongstarting(0,999); // how ever you call to play the song 

Diese oben wird Lied für immer wiederholen. Ich empfehle Ihnen, die Audiodatei zu streamen, da dies den Song schneller lädt. Dann können Sie die Songs im Speicher behalten. Sie können weiterhin XML oder eine andere externe Textdatei für die Audiospuren oder direkt in Flash/Class-Dateien verwenden Beton.

Alle Ereignisse, die Sie gerne steuern möchten, vergleichen Sie einfach den "Buffer" -Wert von 100% .Lesen Sie Streaming-Audio as3 gibt es viele Tutorials mit Quellcode, wenn nötig lassen Sie mich wissen, ich kann Ihnen ein Beispiel geben.

+0

Dank Parele! Ich habe ein wenig recherchiert und glaube, dass ich das Streaming eingerichtet habe, indem ich eine SoundLoaderContext-Variable am Anfang des Skripts beanspruche und dann "my_sound.load (newURLRequest (myURL))"; zu "my_sound.load (newURLRequest (myURL), Kontext);" - Zumindest scheint das alles zu sein, aber ich werde es später sicher testen müssen. – DoomJTHM

+0

Leider weiß ich nicht genau, was ich mit der von Ihnen bereitgestellten Zeile machen soll. Ich vermute, ich möchte eine neue Funktion so definieren? Ich bin mir einfach nicht sicher, wo es platziert werden soll oder was genau es leistet. Sorry für die neue Frage, deine Hilfe war bisher großartig! = X – DoomJTHM

0

Sie waren in der Nähe

var my_songs:XMLList; 
var my_total:Number; 

var my_sound:Sound; 
var my_channel:SoundChannel; 

var current_song:Number; 

var myXMLLoader:URLLoader = new URLLoader(); 
myXMLLoader.load(new URLRequest("playlist.xml")); 
myXMLLoader.addEventListener(Event.COMPLETE, processXML); 

function processXML(e:Event):void { 
    var myXML:XML = new XML(e.target.data); 

    my_songs = myXML.SONG; 
    my_total = my_songs.length(); 

    playSong(0); 

    myXMLLoader.removeEventListener(Event.COMPLETE, processXML); 
    myXMLLoader = null; 

} 

function playSong(e:Event):void { 
    if(current_song > my_total) 
     current_song = 0; 

    var myURL = my_songs[current_song++][email protected]; 

    if (my_channel) { 
     my_channel.stop(); 
     my_channel.removeEventListener(Event.SOUND_COMPLETE, playSong); 
    } 

    my_sound = new Sound(); 
    my_sound.load(new URLRequest(myURL)); 
    my_channel = my_sound.play(); 
    my_channel.addEventListener(Event.SOUND_COMPLETE, playSong); 
} 

test_btn.addEventListener(MouseEvent.CLICK, onPlay); 
function onPlay(e:MouseEvent):void { 
     playSong(e); 
}