![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Nov 2006
Сообщений: 33
|
Люди, такая штука: вешаю звук на OnMouseOver на мувики. А он срабатывает с сильным запаздыванием. Причем иногда запаздывание дольше, иногда короче. В чем может быть проблема?
import GSSoundManager; ... var sm: GSSoundManager = new GSSoundManager(); ... sm.preload('Over','over.mp3'); ... var overFunc = function () { sm.playSound('Over'); } theMovieClip1.addEventListener(MouseEvent.MOUSE_OVER, overFunc); theMovieClip2.addEventListener(MouseEvent.MOUSE_OVER, overFunc); theMovieClip3.addEventListener(MouseEvent.MOUSE_OVER, overFunc); ... ======================================= package { import flash.display.Loader; import flash.net.URLRequest; import flash.media.Sound; import flash.events.*; import flash.media.SoundChannel; public class GSSoundManager extends Loader{ private var sounds:Array = new Array(); private var i:int; // counter public function GSSoundManager() { } public function preload(name:String, path:String):void { var soundObj:Object = new Object; /*...*/ soundObj.name = name; soundObj.path = path; soundObj.sound = new Sound(); soundObj.channel = null;// = new SoundChannel(); soundObj.loaded = false; var onLoadComplete = function () { soundObj.loaded=true; } soundObj.sound.addEventListener(Event.COMPLETE, onLoadComplete); var req:URLRequest = new URLRequest(soundObj.path); soundObj.sound.load(req); sounds.push(soundObj); } public function playSound(name:String):void { for(i=0; i<sounds.length; i++) { if (sounds[i].name == name) { if (sounds[i].loaded == true) sounds[i].channel = sounds[i].sound.play(); } } } } } Последний раз редактировалось GydruS; 12.07.2009 в 18:21. |
|
|||||
|
Регистрация: Nov 2006
Сообщений: 33
|
Извиняюсь - протупил. Сообщение отредактировал. Добавил недостающие строки в код.
|
|
|||||
|
Modus ponens
|
Да нет... в сообщении все было нормально... свойства и методы должны начинаться со строчной, а классы с прописной. Откуда нам знать, что Sounds - это не класс, например?
var onLoadComplete = function () { aSound.Loaded=true; } aSound.Sound.addEventListener(Event.COMPLETE, onLoadComplete); - это вообще не понятно что... aSound - это пакет? если да, то за каким вы называете ваш класс, как и флешевый класс? Если это объект, то зачем свойства объекта называть так же, как и встроенные классы - мало того, что вас люди не поймут, компилятор вас тоже не поймет. И все остальное в том же духе...
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Nov 2006
Сообщений: 33
|
Цитата:
только проблема не "ушла" =( |
|
|||||
|
Modus ponens
|
1. скорее всего звук не загружен к тому времени, когда вы его пытаетесь проиграть.
2. не используйте анонимные функции. И логика происходящего в вашем коде от меня все-равно как-то ускользает... что вы хотели сделать-то?
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Nov 2006
Сообщений: 33
|
Пытаюсь сделать кнопки, при наведении на которые мышью проигрывается звук.
Я пробовал убирать анонимную ф-ю - но это не помогло. Сама ф-я по загрузке mp3 файла устанавливает флаг loaded объекта soundObj в true. Флаг проверяется перед проигрыванием звука - т.е. если файл звука еще не загрузился - просто не играем его. Но в итоге звук играет. Только с запаздыванием. Если провести мышью над мувиками то сколько раз случится MouseEvent.MOUSE_OVER - столько раз и проиграется звук (я специально немного жду, чтобы файл звука загрузился). Но, как уже сказал, мне надо начать проигрывание звука сразу, как только мышка оказалась над MovieClip. А он почему-то не сразу начинает проигрываться... массив sounds нужен для того, чтобы можно было загрузить, скажем, три звука. Например: "over.mp3", "out.mp3" и "click.mp3". И суть GSSoundManager в таких строках: var overFunc = function () { sm.playSound('over'); } var outFunc = function () { sm.playSound('out'); } var clickFunc = function () { sm.playSound('click'); } theMovieClip1.addEventListener(MouseEvent.MOUSE_OVER, overFunc); theMovieClip1.addEventListener(MouseEvent.MOUSE_OUT, outFunc); theMovieClip1.addEventListener(MouseEvent.CLICK, clickFunc); Последний раз редактировалось GydruS; 12.07.2009 в 18:57. |
|
|||||
|
Modus ponens
|
ОК, для начала, ваш код должен был бы выглядеть вот так:
function overFunc(event:MouseEvent):void { sm.playSound('over'); } function outFunc(event:MouseEvent):void { sm.playSound('out'); } function clickFunc(event:MouseEvent):void { sm.playSound('click'); } theMovieClip1.addEventListener(MouseEvent.MOUSE_OVER, overFunc); theMovieClip1.addEventListener(MouseEvent.MOUSE_OUT, outFunc); theMovieClip1.addEventListener(MouseEvent.CLICK, clickFunc); // [access modifiers] function functionScope_eventNameHandler(event:EventType):void {} // // eventName - соответствует тексту константы идентифицирующей событие, на которое подписываемся. В AS3 не используют делегаты потому что они плохо реализованы на уровне языка. Да и причины, по которым их используют в C# в AS3 отсутствуют. Я так предполагаю, что задержка может быть связана с тем, что нужно прочитать метаданные из MP3, кроме того, загруженные звуки проигрываются в режиме "подкачки", т.е. весь звуковой файл не находится во флешке во время проигрывания, а считывается порциями. Посмотрите сюда: http://code.google.com/p/e4xu/source...vxvws/encoding (MP3Transcoder) и дополнительные файлы нужные для того, чтобы в рантайме сгенерить "заэмбедденый" звук. В таком случае, получится, что вы загружаете весь звук до того, как начинаете его проигрывать. Но, все таки желательно "поправить" MP3 до загрузки - т.е. поудалять из них метаданные.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Nov 2006
Сообщений: 33
|
Цитата:
Правда, сейчас уже спать пойду (у нас третий час уже...), завтра буду разбираться дальше.. Отпишу об успехах по их появлению или непоявлению. Вот только вопрос меня теперь мучает, почему все же не рекомендуется "в динамике" создавать ф-ии ( var f = function() {...} ) а потом их куда-нибудь "прицеплять"? Ведь мы так по сути получаем ссылку на область исполнимого p-кода, которая потом привязывается к слушателю и "сборщик мусора" этот код не почистит, пока на него кто-то ссылается. Т.е. все логично, вроде... Я уже немало так написал просто - и проблем нет. Пока... Вот это и беспокоит. |
|
|||||
|
Modus ponens
|
Такие функции остаются безымянными для дебаггера... MethodInfo-(XXX) - вам никогда ошибки из такой функции не выпадали? кроме того, в такой функции нельзя ссылаться на this т.как не понятно, чем является this для нее, в некоторых случаях его вообще может не быть.
var f:Function = function():void { trace(this, new Error().getStackTrace()); } f(); f.apply(null, []); var f1:Function = function():void { }; f1["f"] = f; f1["f"](); И вы приехали - этот листенер вы никак не сможете удалить.
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:01. |
|
|
« Предыдущая тема | Следующая тема » |
|
|