2015-12-22 5 views
0

У меня есть звук, который играет, когда я переворачиваю объект. Чтобы сделать его менее раздражающим, я хочу, чтобы звук воспроизводился, только если он уже не играет. Поскольку мне нужно это с помощью нескольких разных звуков, я не хочу использовать таймер (если не совсем необходимо). Я нашел это:AS3 Простой способ проверить, закончен ли звук.

var channel:SoundChannel = snd.play(); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 

public function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
} 

но я не уверен, что смогу использовать его, так как у меня также есть фоновая музыка. Какие-нибудь советы?

+0

Если вам нужно управлять несколькими звуками, настало время подумать о каком-то централизованном подходе, таком как звуковой менеджер, - включить/выключить глобальный звук, управлять несколькими звуками/тем же звуком и т. Д. Их много: https://github.com/treefortress/SoundAS, http://evolve.reintroducing.com/2011/01/06/as3/as3-soundmanager-v1-4/, google _as3 sound mananer_ для более – fsbmain

ответ

0

Вы можете использовать такой трюк выборочно. Тем не менее, если вы планируете иметь много таких объектов, которые вызывают звуки на мыши, вы можете решить, иметь класс менеджера или таблицу данных, которые будут иметь запись на такой объект, и поле будет иметь значение true, если звук, и слушатель, назначенный как таковой, очистит значение в этом поле, получив правильную запись из зарегистрированного набора из SoundChannel. Разумеется, это будет предустановленный звукорежиссер, но лучше сделать индивидуальный. Пример:

public class SoundManager { 
    private var _fhOPO:Dictionary; 
    private var _bhOPO:Dictionary; 
    // going sophisticated. Names stand for "forward hash once per object" and "backward" 
    // forward hash stores links to SoundChannel object, backward stores link to object from 
    // a SoundChannel object. 
    // initialization code skipped 
    public static function psOPO(snd:Sound,ob:Object):void 
    { 
     // platy sound once per object 
     if (_fhOPO[ob]) return; // sound is being played 
     var sc:SoundChannel=snd.play(); 
     _fhOPO[ob]=sc; 
     _bhOPO[sc]=ob; 
     sc.addEventListener(Event.SOUND_COMPLETE, _cleanup); 
    } 
    private static function _cleanup(e:Event):void 
    { 
     var sc:SoundChannel=event.target as SoundChannel; 
     if (!sc) return; // error handling 
     var ob:Object=_bhOPO[sc]; 
     _bhOPO[sc]=null; 
     _fhOPO[ob]=null; // clean hashes off now obsolete references 
     sc.removeEventListener(Event.SOUND_COMPLETE, _cleanup); 
     // and clean the listener to let GC collect the SoundChannel object 
    } 
} 

Затем, когда вы должны играть звук, но предел одного экземпляра канала на объект, вы вызываете SoundManager.psOPO(theSound,this); обеспечивает опорную кнопку вместо this в случае необходимости. Вы можете использовать нормальный Sound.play() наряду с этим видом управления звуком, если вам нужно, или использовать другой тип управления для BGM или других типов звуков, если вам нужно.

Смежные вопросы