Как вызвать функцию только один раз в случае mouseEvent - PullRequest
0 голосов
/ 31 октября 2010

Я пытаюсь сделать простой mp3-плеер, используя flash.Песни загружаются с использованием файла XML, который содержит список песен.У меня есть кнопка «Play» с именем экземпляра «PlayBtn».У меня есть файл actioncript с именем «playctrl», содержимое которого указано ниже:

package classes
{
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.events.*;
    import flash.events.MouseEvent;
    import flash.net.URLRequest; 

    public class playctrl
    {
        private var MusicLoading:URLRequest;                        
        private var music:Sound;
        private var sc:SoundChannel;
        private var currentSound:Sound;
        private static var CurrentPos:Number;                               
        private var xml:XML;
        private var songlist:XMLList;                               
        private static var currentIndex:Number;                     

        public function playctrl()
        {
            music = new Sound();
            currentSound= music;
            CurrentPos = 0;
            currentIndex = 0;   
        }

        public function success(e:Event):void 
        {
            xml = new XML(e.target.data);
            songlist = xml.song;
            MusicLoading = new URLRequest(songlist[0].file);
            music.load(MusicLoading);
        }

        public function playSong(e:Event):void 
        {
            if(sc != null)
                sc.stop();

            sc = currentSound.play(CurrentPos);
            trace("HELLO !!!");
        }

    }
}

У меня есть второй файл с именем «play.as», содержимое которого указано ниже:

import classes.playctrl;

var obj:playctrl = new playctrl();
var XMLLoader:URLLoader = new URLLoader();          //XML Loader

XMLLoader.addEventListener(Event.COMPLETE, obj.success);
XMLLoader.load(new URLRequest("playlist.xml"));

PlayBtn.addEventListener(MouseEvent.CLICK, obj.playSong);

Однако, нажимая кнопку воспроизведения, я замечаю, что функция playSong () вызывается 7-8 раз (проверьте, печатая сообщение об ошибке внутри функции), что приводит к перекрытию вывода звука и падению плеерарезультат.Функция должна вызываться только один раз, когда вызывается MouseEvent.CLICK.Пожалуйста, помогите ...

Ответы [ 2 ]

0 голосов
/ 31 октября 2010

интересно, у звукового объекта нет встроенного логического свойства isPlaying (странно), поэтому вы можете просто создать свое собственное.

var isPlaying:Boolean

function playSong():void
     {
     if(!isPlaying)
       sound.play();
     }

function stopSong():void
     {
     if(isPlaying)
       {
       channel.stop();
       isPlaying = false;
       }

просто примечание: по договоренности, имена классоврегистр верблюдов с заглавной буквы, а имена экземпляров - регистр верблюдов без капитализации.поэтому ваш файл класса playctrl.as должен (или мог) быть PlayCtrl.as, а ваш экземпляр PlayBtn должен (или мог) быть playBtn.

0 голосов
/ 31 октября 2010

Edit:

Название вашего вопроса немного вводит в заблуждение, ответ, который я дал вам, является решением вопроса, выраженного в заголовке.

Глядя на ваш код, я бы посмотрел на разделение проблем, с одной стороны, вы хотите загрузить данные песни, с другой стороны, вы хотите контролировать звуки. Я бы реализовал отдельные классы для каждого концерна. Если вы создадите отдельный класс для своего элемента управления проигрывателем, вы сможете отправлять событие внутри этого класса, чтобы оно не всплывало во всем приложении и не вызывало ваши функции несколько раз.

// Предыдущий ответ Вы можете сделать это, применив логическое значение, которое будет установлено при остановке или воспроизведении звука.

В любом случае вот еще один способ отфильтровать нежелательные клики

 private function playSong(event:MouseEvent ):void
 {
     // set up a conditional to identify your button , 
     // here's an example...
     if( event.currentTarget.name is "PlayBtn" )
     {
         //do whatever
         //then...
         event.stopImmediatePropagation();
      }

  }

Это, как говорится, в вашем случае звучит немного быстро, так как MouseEvent не должен запускать функцию воспроизведения несколько раз ...

Имеет смысл отладить ваш код, чтобы понять, почему после щелчка мышью отправляется несколько событий

 private var _isPlaying:Boolean;

 public function playSong(e:Event):void 
 {
   if(sc != null)
   {
      sc.stop();
      _isPlaying = false;
   }

   if( !_isPlaying )
   {
      sc = currentSound.play(CurrentPos);
      _isPlaying = true;
      trace("HELLO !!!");
   }
 }
...