Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Сбой звука (http://www.flasher.ru/forum/showthread.php?t=136641)

Ar_PHARAZON 22.02.2010 01:26

Сбой звука
 
Добрый вечер. Проблемы следующего характера:
1) Подгружаю звук во флешку. Вес мп3-файла приблизительно 60 Мб. Звук запускается, однако, при первом проигрыше, иногда он срывается где-то на 2-3 минуте и перезапускается заново! Такое происходит только один раз (то есть, после перезапуска играет от начала до конца) Вот код (стоит во 2 кадре после прелоадера):
Код AS1/AS2:

stop();
my_sound = new Sound();
my_sound.onLoad = function() {
        my_sound.start();
};
my_sound.loadSound("http://мой_домен/music/mixdown.mp3",true);

С чем может быть связан этот лаг?

2) приблизительно тоже самое происходит и в средине самой флешки, только теперь уже с кадрами! Иногда, флешка сама-по-себе возвращает предыдущий кадр, но ведь в каждом из них стоит stop()! впервые с подобным сталкиваюсь(( Как такое может быть??

3) лаги при движении контейнеров с подгруженными картинками. На компе почти не глючит, а в инете - картинки слегка вздрагивают, когда двигаются. Можно ли что-то сделать?? Код (контейнеров их более 30, я сократил):
Код AS1/AS2:

//1-container
var container_1:MovieClip = _root.anim_pic.cont.createEmptyMovieClip('img', this.getNextHighestDepth());
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener (this);
 
mcLoader.loadClip('./SlideShow/1.jpg',container_1);
container_1._x = 0;
 
//2-container
var container_2:MovieClip = _root.anim_pic.cont.createEmptyMovieClip('img_2', this.getNextHighestDepth());
var mcLoader2:MovieClipLoader = new MovieClipLoader();
mcLoader2.addListener (this);
 
mcLoader2.loadClip('./SlideShow/2.jpg',container_2);
container_2._x = 713;
 
//3-container
var container_3:MovieClip = _root.anim_pic.cont.createEmptyMovieClip('img_3', this.getNextHighestDepth());
var mcLoader3:MovieClipLoader = new MovieClipLoader();
mcLoader3.addListener (this);
 
////////////
this.onLoadInit = function (mc:MovieClip) {
        _root.anim_pic.gotoAndStop(2);
}

_root.anim_pic.gotoAndStop(2) - здесь задается движение мувика (с уже загруженными контейнерами)

Код AS1/AS2:

var xStart = 840
var xFinish = -20100
var myTime1 = 250
var myTime2 = 1000
import mx.transitions.Tween;
var myTween:Tween = new Tween(_root.anim_pic.cont, "_x", mx.transitions.easing.None.easeNone, xStart, xFinish, myTime1, true);
function myStart() {
        myTween.start();
}
function myFunction() {
        myTween.onMotionFinished = function() {
                _root.gotoAndStop(3);
        };
}
myFunction();


И ВСЕ ЭТО БЕЗОБРАЗИЕ ПРОИСХОДИТ В ОДНОМ ФАЙЛЕ!
Заранее благодарен за внимание!

mooncar 22.02.2010 10:00

По поводу (1), попробуйте убрать вот эти строки:
Код AS1/AS2:

my_sound.onLoad = function() {
        my_sound.start();
};

В потоковом режиме (параметр true) звук стартуется автоматически, как только в буфер попадет достаточное количество данных. А у вас старт происходит еще раз, дополнительно, уже по факту полной загрузки - отсюда перезапуск.

По поводу (2):
Причина, вероятно, имеет сходные корни. Вот эта строка автоматически стартует анимацию Tween, по факту определения Tween, без участия myTween.start();
Код AS1/AS2:

var myTween:Tween = new Tween(_root.anim_pic.cont, "_x", mx.transitions.easing.None.easeNone, xStart, xFinish, myTime1, true);

Таким образом, строка myTween.start(); повторно стартует анимацию myTween, и myTween.onMotionFinished отрабатывается вторично и происходит _root.gotoAndStop(3);

Далее. У вас получается так, что this.onLoadInit отрабатывает _root.anim_pic.gotoAndStop(2); всякий раз, кода происходит загрузка в контейнер. Вы так задумали?

(3) - возможно проблема в работе самого плеера, с отрисовкой содержимого связано. похожее тут обсуждалось, но универсального рецепта не нашлось.
- попробуйте поварьировать FPS
- при анимации громоздкого содержимого, если оно векторное, имеет смыл его предварительно растеризовать. Готовые алгоритмы и функции растеризации на форуме и в инете есть.

Чисто по записи кода.
При такой записи
Код AS1/AS2:

function myFunction() {
        myTween.onMotionFinished = function() {
                _root.gotoAndStop(3);
        };
}

функция myFunction объявляется перед выполнением кода, но, поскольку на этот момент myTween еще не определен, функция обработки события onMotionFinished остается не определена.
В последствии, конечно, происходит вызов myFunction(); (у вас он идет в конце кода) и myTween уже определен, но последовательность событий получается кривовата, так как обработчик события onMotionFinished назначается в вашем случае уже в процессе анимацмии myTween.
Да и громоздко это.

Поэтому:
Код AS1/AS2:

myTween.onMotionFinished = myFunction;
myFunction();
 
function myFunction() {
        _root.gotoAndStop(3);
}

Вообще, без алгоритмической необходимости не стоит делать вложенное объявление функции (в другой функции). Бывают случаи, конечно, когда оперативное объявление функции является алгоритмически необходимым, например, при оперативных изменениях какой-то общей ситуации, определенных событиях, но это не ваш случай.


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

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