Search code examples
actionscript-3flash

Expand menu (movieclip) and music in music setting error


I have make a menu in Flash that can expand and there music setting inside.

The music plays when the application starts. To stop the music you must expand the menu and click the music icon.

  • It's working fine after I open the program and stop the music.
  • And it's working if I want to play again.

But there's problems after that:
I can't stop the music again and the music playing double in background.

This is my FLA file:

https://drive.google.com/file/d/1DpqdH64kDnI8xN6fBAt3pwi_bIRQ52mT/view?usp=drivesdk

Can anyone tell me the fault of my program? Thanks.


Solution

  • About "music playing double" does your (audio) playback function create a new anything?
    (eg: = new Sound or = new SoundChannel)? If yes...

    • Create your audio variables once outside of functions, then use your functions only to stop/start audio playback.

    • Use new Sound only when loading a new track, once loaded then use one SoundChannel to play/stop that Sound object.

    • You need a Boolean to keep track of whether a Sound is already playing or not. If true then don't send another .play() command (now gives two sounds to output/speakers).

    See if the code logic below guides you toward a better setup:

    //# declare variables globally (not trapped inside some function)
    var snd_Obj :Sound;
    var snd_Chann :SoundChannel = new SoundChannel();
    
    var snd_isPlaying :Boolean = false;
    
    //# main app code
    loadTrack("someSong.mp3"); //run a function, using "filename" as input parameter
    
    
    //# supporting functions
    function loadTrack (input_filename :String) : void 
    { 
        snd_Obj = new Sound(); 
        snd_Obj.addEventListener(Event.COMPLETE, finished_LoadTrack);
        snd_Obj.load( input_filename ); //read from function's input parameter
    }
    
    function finished_LoadTrack (event:Event) : void 
    { 
        snd_Chann = snd_Obj.play(); //# Play returned Speech convert result
        snd_Obj.removeEventListener(Event.COMPLETE, onSoundLoaded);
    
        //# now make your Play and Stop buttons active
        btn_play.addEventListener(MouseEvent.CLICK, play_Track);
        btn_stop.addEventListener(MouseEvent.CLICK, stop_Track);
    
    }
    
    function play_Track (event:Event) : void 
    { 
        //# responds to click of Play button 
    
        if(snd_isPlaying != true) //# check if NOT TRUE, only then start playback
        { 
            snd_Chann = snd_Obj.play(); 
            snd_isPlaying = true; //# now set TRUE to avoid multiple "Play" commands at once
        }
    }
    
    function stop_Track (event:Event) : void 
    {
        //# responds to click of Play button 
        snd_Chann.stop();
        snd_isPlaying = false; //# now set FALSE to reset for next Play check
    }