Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.07.2009, 17:17
GydruS вне форума Посмотреть профиль Отправить личное сообщение для GydruS Найти все сообщения от GydruS
  № 1  
Ответить с цитированием
GydruS
 
Аватар для GydruS

Регистрация: Nov 2006
Сообщений: 33
The bomb! Звук запаздывает

Люди, такая штука: вешаю звук на OnMouseOver на мувики. А он срабатывает с сильным запаздыванием. Причем иногда запаздывание дольше, иногда короче. В чем может быть проблема?

Код AS3:
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.
Старый 12.07.2009, 17:33
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А вы еще больше прописных букв напихайте - вас вообще не понятно будет.
__________________
Hell is the possibility of sanity

Старый 12.07.2009, 17:41
GydruS вне форума Посмотреть профиль Отправить личное сообщение для GydruS Найти все сообщения от GydruS
  № 3  
Ответить с цитированием
GydruS
 
Аватар для GydruS

Регистрация: Nov 2006
Сообщений: 33
Цитата:
Сообщение от wvxvw Посмотреть сообщение
А вы еще больше прописных букв напихайте - вас вообще не понятно будет.
Извиняюсь - протупил. Сообщение отредактировал. Добавил недостающие строки в код.

Старый 12.07.2009, 17:59
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Да нет... в сообщении все было нормально... свойства и методы должны начинаться со строчной, а классы с прописной. Откуда нам знать, что Sounds - это не класс, например?
Код AS3:
var onLoadComplete = function () { aSound.Loaded=true; }
aSound.Sound.addEventListener(Event.COMPLETE, onLoadComplete);
Вот это, например не понятно вообще ни что делает, ни зачем это нужно, ни тем более никаким боком в представление о нормальном коде не вписывается - не используйте анонимные функции в АС.
Код AS3:
aSound.Sound.load(req);
- это вообще не понятно что... aSound - это пакет? если да, то за каким вы называете ваш класс, как и флешевый класс? Если это объект, то зачем свойства объекта называть так же, как и встроенные классы - мало того, что вас люди не поймут, компилятор вас тоже не поймет.
И все остальное в том же духе...
__________________
Hell is the possibility of sanity

Старый 12.07.2009, 18:24
GydruS вне форума Посмотреть профиль Отправить личное сообщение для GydruS Найти все сообщения от GydruS
  № 5  
Ответить с цитированием
GydruS
 
Аватар для GydruS

Регистрация: Nov 2006
Сообщений: 33
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Да нет... в сообщении все было нормально... свойства и методы должны начинаться со строчной, а классы с прописной. Откуда нам знать, что Sounds - это не класс, например?
Спасибо за замечания и пояснения. Исправился (исходники обновил).
только проблема не "ушла" =(

Старый 12.07.2009, 18:29
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
1. скорее всего звук не загружен к тому времени, когда вы его пытаетесь проиграть.
2. не используйте анонимные функции.
И логика происходящего в вашем коде от меня все-равно как-то ускользает... что вы хотели сделать-то?
__________________
Hell is the possibility of sanity

Старый 12.07.2009, 18:48
GydruS вне форума Посмотреть профиль Отправить личное сообщение для GydruS Найти все сообщения от GydruS
  № 7  
Ответить с цитированием
GydruS
 
Аватар для GydruS

Регистрация: Nov 2006
Сообщений: 33
Пытаюсь сделать кнопки, при наведении на которые мышью проигрывается звук.
Я пробовал убирать анонимную ф-ю - но это не помогло. Сама ф-я по загрузке mp3 файла устанавливает флаг loaded объекта soundObj в true. Флаг проверяется перед проигрыванием звука - т.е. если файл звука еще не загрузился - просто не играем его.
Но в итоге звук играет. Только с запаздыванием. Если провести мышью над мувиками то сколько раз случится MouseEvent.MOUSE_OVER - столько раз и проиграется звук (я специально немного жду, чтобы файл звука загрузился). Но, как уже сказал, мне надо начать проигрывание звука сразу, как только мышка оказалась над MovieClip. А он почему-то не сразу начинает проигрываться...

массив sounds нужен для того, чтобы можно было загрузить, скажем, три звука. Например: "over.mp3", "out.mp3" и "click.mp3". И суть GSSoundManager в таких строках:
Код AS3:
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.
Старый 12.07.2009, 19:19
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
ОК, для начала, ваш код должен был бы выглядеть вот так:
Код AS3:
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);
Если это был какой-то намек на то, как в C# оформляются слушатели, то, сигнатура слушателя в AS3 выглядит как
Код AS3:
//
[access modifiers] function functionScope_eventNameHandler(event:EventType):void {}
//
//
functionScope - указывает на то, какому объекту принадлежит функция-слушатель (в каком контексте она будет вызвана). Если контекст == this, то эту часть можно опустить вместе с подчерком.
eventName - соответствует тексту константы идентифицирующей событие, на которое подписываемся.
В AS3 не используют делегаты потому что они плохо реализованы на уровне языка. Да и причины, по которым их используют в C# в AS3 отсутствуют.

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

Посмотрите сюда:
http://code.google.com/p/e4xu/source...vxvws/encoding
(MP3Transcoder) и дополнительные файлы нужные для того, чтобы в рантайме сгенерить "заэмбедденый"
звук. В таком случае, получится, что вы загружаете весь звук до того, как начинаете его проигрывать. Но, все таки желательно "поправить" MP3 до загрузки - т.е. поудалять из них метаданные.
__________________
Hell is the possibility of sanity

Старый 12.07.2009, 20:25
GydruS вне форума Посмотреть профиль Отправить личное сообщение для GydruS Найти все сообщения от GydruS
  № 9  
Ответить с цитированием
GydruS
 
Аватар для GydruS

Регистрация: Nov 2006
Сообщений: 33
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Посмотрите сюда:
http://code.google.com/p/e4xu/source...vxvws/encoding
(MP3Transcoder) и дополнительные файлы нужные для того, чтобы в рантайме сгенерить "заэмбедденый" звук.
О! Спасибо Вам огромное за такую подсказку! Я посмотрел и понял "в первом чтении" код. Он понятно и изящно написан! =)
Правда, сейчас уже спать пойду (у нас третий час уже...), завтра буду разбираться дальше.. Отпишу об успехах по их появлению или непоявлению.

Вот только вопрос меня теперь мучает, почему все же не рекомендуется "в динамике" создавать ф-ии ( var f = function() {...} ) а потом их куда-нибудь "прицеплять"? Ведь мы так по сути получаем ссылку на область исполнимого p-кода, которая потом привязывается к слушателю и "сборщик мусора" этот код не почистит, пока на него кто-то ссылается. Т.е. все логично, вроде... Я уже немало так написал просто - и проблем нет. Пока... Вот это и беспокоит.

Старый 12.07.2009, 20:37
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Такие функции остаются безымянными для дебаггера... MethodInfo-(XXX) - вам никогда ошибки из такой функции не выпадали? кроме того, в такой функции нельзя ссылаться на this т.как не понятно, чем является this для нее, в некоторых случаях его вообще может не быть.
Код AS3:
var f:Function = function():void
{
	trace(this, new Error().getStackTrace());
}
f();
f.apply(null, []);
var f1:Function = function():void { };
f1["f"] = f;
f1["f"]();
Кроме того, если вы подпишите такую функцию на событие, то ссылка на нее может потерятся, например так:
Код AS3:
var f:Function = function(e:Event):void {};
addEventListener(Event.ENTER_FRAME, f);
f = null;
И вы приехали - этот листенер вы никак не сможете удалить.
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:01.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.