lucasmarcal 0 Denunciar post Postado Março 17, 2010 Boa tarde a todos. Estou com um problema em relação ao evento Event.SOUND_COMPLETE, fiz uma classe para tocar audios, mas o problema é que ele não me informa quando esse áudio já terminou de tocar, tentei adicionar um listner para me informar isso mas ainda sim ela não funciona, será que alguém pode me ajudar, abaixo segue a classe e a forma de utiliza-la classe package lmcosta.media { import flash.display.MovieClip; import flash.events.Event; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundTransform; import flash.net.URLRequest; import flash.utils.ByteArray; import com.greensock.TweenMax import com.greensock.easing.* /** * ... * @author lmcosta * @link www.lucasmarcal.com.br * @version 1.0 */ public class CreateMusic extends MovieClip { public var sound:Sound; public var soundC:SoundChannel public var musicStatus:Boolean = true; public var posicao:Number = 0 public var volumeSound:Number public var tocar:Boolean public var loopSound:Number public function CreateMusic(_str:String = "",_volume:Number = 0 , _tocar:Boolean = true, _loop:Number = 999) { this.soundC = new SoundChannel(); this.volumeSound = _volume; this.tocar = _tocar; this.loopSound = _loop; this.sound = new Sound(); this.sound.load(new URLRequest(_str)); this.sound.addEventListener(Event.COMPLETE, this.onComplete) //this.sound.addEventListener(Event.SOUND_COMPLETE , somCompleto) this.soundC.addEventListener(Event.SOUND_COMPLETE , somCompleto); } public function somCompleto(e:Event):void { trace("Final do som") } private function onComplete(e:Event):void { trace("Carregou") if (this.tocar == true) { this.soundC = this.sound.play(this.posicao, this.loopSound); this.myVolume(this.volumeSound); } else { this.myVolume(this.volumeSound); } } public function onPlay():void { this.soundC = this.sound.play(this.posicao, this.loopSound); } public function onStop():void { //this.posicao = this.soundC.position this.soundC.stop(); } public function myVolume(_volume:Number):void { var transform:SoundTransform = this.soundC.soundTransform; transform.volume = _volume; //this.soundC.soundTransform = transform; TweenMax.to(this.soundC, 0.2, { volume:_volume, ease:Linear.easeNone } ); } } } consumindo a classe import lmcosta.media.CreateMusic; var soundBt:CreateMusic; function init () { this.soundBt = new CreateMusic("NuvemCompleto.mp3", 1, true, 1); } init() abraços. Compartilhar este post Link para o post Compartilhar em outros sites
lucasmarcal 0 Denunciar post Postado Março 18, 2010 Consegui com a ajuda do @ptaranto @hvilela @AS3hash solucionar o problema, segue as modificações: Na classe CreateMusic.as o Listener só deve ser adicionado depois que o objeto sound receber o método play() ficando assim: package lmcosta.media { import flash.display.MovieClip; import flash.events.Event; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundTransform; import flash.net.URLRequest; import com.greensock.TweenMax import com.greensock.easing.* /** * ... * @author lmcosta * @link www.lucasmarcal.com.br * @version 1.0 */ public class CreateMusic extends MovieClip { public var sound:Sound; public var soundC:SoundChannel public var musicStatus:Boolean = true; public var posicao:Number = 0 public var volumeSound:Number public var tocar:Boolean public var loopSound:Number public function CreateMusic(_str:String = "",_volume:Number = 0 , _tocar:Boolean = true, _loop:Number = 999) { this.volumeSound = _volume; this.tocar = _tocar; this.loopSound = _loop; this.sound = new Sound(); this.sound.load(new URLRequest(_str)); this.sound.addEventListener(Event.COMPLETE, this.onComplete) //Deletei a instrução que adcionava o listner aqui } public function somCompleto(e:Event):void { trace("Final do som") } private function onComplete(e:Event):void { trace("Carregou o arquivo") if (this.tocar == true) { this.soundC = this.sound.play(this.posicao, this.loopSound); // E coloquei o listener depois que o objeto sound recebe o método play() this.soundC.addEventListener(Event.SOUND_COMPLETE , somCompleto); this.myVolume(this.volumeSound); } else { this.myVolume(this.volumeSound); } } public function onPlay():void { this.soundC = this.sound.play(this.posicao, this.loopSound); //Aqui tb this.soundC.addEventListener(Event.SOUND_COMPLETE , somCompleto); } public function onStop():void { //this.posicao = this.soundC.position this.soundC.stop(); } public function myVolume(_volume:Number):void { var transform:SoundTransform = this.soundC.soundTransform; transform.volume = _volume; //this.soundC.soundTransform = transform; TweenMax.to(this.soundC, 0.2, { volume:_volume, ease:Linear.easeNone } ); } } } E no consumo da classe o ultimo argumento que se refere a quantidade de loop do audio foi alterado para 0 import lmcosta.media.CreateMusic; var soundBt:CreateMusic; function init () { this.soundBt = new CreateMusic("som.mp3", 1, true, 0); //this.soundBt.soundC.addEventListener(Event.SOUND_COMPLETE , completou) } function completou (e:Event):void { trace("Som completo p****") } init() Com isso o problema foi solucionado, mas para mim isso ainda parece uma POG, a adobe tinha que dar um jeito nisso, espero que esse topico seja indexado pelo google, tem muita gente com esse problema. abraços. Compartilhar este post Link para o post Compartilhar em outros sites
Elektra 102 Denunciar post Postado Março 18, 2010 Obrigada lucasmarcal. Compartilhar este post Link para o post Compartilhar em outros sites