Search code examples
javascripthtmlflashcreatejsflashcanvas

HTML5 flash canva can't stop my sound with "mouseout" function


I found on the Adobe forum an answer to some of my questions about coding MouseOver in "flash html5 mycanva.fla" to trigger a sound when hovering a button. see here

The thing is, i'm stuck with the "MouseOut function" when it comes to stop the sound played when you MouseOut the button !

The cherry on top would be to pause the sound on mouseout and playit from the point it was paused when mouseover again. But i don't want to appear too greedy ;-)

Here's the code i used in my_flash_canva.fla:

var frequency = 3;  
stage.enableMouseOver(frequency);  
this.mybutton.addEventListener("mouseover", fl_MouseOverHandler);  

function fl_MouseOverHandler(){  
    playSound("monstres");  
    //linked sound from library by dble clicking on it and named a link in the blank area.Indeed, the action script panel in "mysound" properties panel is greyed..  
    //works like a charm   
}  

this.mybutton.addEventListener("mouseout", fl_MouseOutHandler);  
function fl_MouseOutHandler()  {  
    stopSound("monstres");  
    // doesn't work  
}  

Using flash pro cc 2014. I guess i must be missing something or bad syntaxing but in my mind what does work with playSound("xxx") should work with stopSound("xxx") . But apparently it 's not that simple. Any clue is welcome, I would be grateful. Thanx a lot.

Olivier.


Solution

  • You can not stop a sound that way. What is stopSound()? If you look at your exported HTML, the playSound is a function that plays a sound using an ID. It should return an instance that you can control. You have to store that instance, and call stop() on it.

    var sound;
    function fl_MouseOverHandler(){  
        sound = playSound("monstres"); 
    }  
    
    this.mybutton.addEventListener("mouseout", fl_MouseOutHandler);  
    function fl_MouseOutHandler()  {  
        sound.stop(); 
    } 
    

    You will have to modify the generated playSound method in the HTML to return the instance that is played, since it currently does not:

    function playSound(id, loop) {
        return createjs.Sound.play(id, createjs.Sound.INTERRUPT_EARLY, 0, 0, loop);
    }
    

    This is a good thing to report to Adobe, as it should do that already. I have logged a bug to do that. https://github.com/CreateJS/SoundJS/issues/218

    [Edit: This fix was included in Adobe Animate]