Форум 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=125206)

МихаилК 18.05.2009 23:29

Помогите разобраться с подтормаживанием ролика
 
Ролик представляет из себя ротацию надписей, которые вылетают из центра ролика в случайных направлениях и на случайное расстояние, потом гаснут. Проблема в том, что ролик какое-то время работает гладко, потом замирает (останавливается движение всех надписей), потом все продолжается штатно. Из-за этих задержек все выглядит неаккуратненько. Особенно проявляется в FireFox с десятым плеером от Адобе.

Реализовал я все это на Movieclip tweening prototypes 1.2.0, ссылка на исходник: http://laco.wz.cz/tween

Код скрипта, который обеспечивает ротацию:

Код AS1/AS2:

#include "lmc_tween_as1.as"
 
// Показ одной надписи в движении
function showOneLabel(labelName,positionEndX,positionEndY) {
        // Ставим надпись на начальную позицию
        _root[labelName]._x = positionStartX;
        _root[labelName]._y = positionStartY;
        //перемещаем и проявляем, дойдя до половины, гасим с задержкой в четверть интервала (функция hideLabel)
        _root[labelName].slideTo(positionEndX, positionEndY, movingInterval, "linear");
        _root[labelName].alphaTo(100, movingInterval*0.5, "linear", 0, hideLabel);
        function hideLabel() {
                _root[labelName].alphaTo(00, movingInterval*0.25, "linear", movingInterval*0.25);
        }       
}
 
// Запуск показа оцередной надписи
function startLabelMoving() {
        //Вычисляем новую позицию надписи
        var positionEndX = baseX+random(movinX);
        var positionEndY = baseY+random(movinY);
        //Запускаем надпись
        labelName = "label"+iLevel;
        showOneLabel(labelName,positionEndX,positionEndY);
        //Вычисляем номер следующей надписи
        iLevel++;
        if (iLevel>countLables) iLevel=0;       
}
 
var interv=setInterval(startLabelMoving,rotationInterval);

Предварительно (эту часть кода я опускаю за очевидностью) создаются пустые мувиклипы и к ним аттачатся надписи из библиотеки - в итоге получается заданное количество мувиков _root["label0"],_root["label1"],_root["label2"]... которые по очереди запускаются из центра ролика. Параметры, которые требуются - запуск новой надписи каждые 150 миллисекунд, время жизни одной надписи - 2 сек (т.е., всего одновременно двигаются примерно 15 надписей).

Это, собственно, уже третий вариант. Во втором варианте я не задавал мувики заранее, в создавал непосредственно внутри функции showOneLabel (передавал туда дополнительно id прототипа, который надо аттачить). Тоже подтормаживало.

В первом варианте использовал класс Tween, идущий в поставке, но там нет возможности изменять два параметра сразу, поэтому взял этот класс. Впрочем, Tween тоже подтормаживал.

Нужен совет, как заставить все это двигаться гладко.

Wlspartak 19.05.2009 12:13

Может iLevel постоянно растет и не обнуляется?

ОльгаЮрьевна 19.05.2009 14:04

МихаилК, а что значит - аттачатся надписи из библиотеки?... они в каком виде там лежат?... у меня была подобная проблема с размножение мувиков - я в мувике в последнем кадре прописала - this.removeMovieClip(); может эта информация вам чем-то поможет:)

МихаилК 19.05.2009 16:01

аттачатся - в том смысле, что в начале (до запуска ротации) отрабатывает такой код:

Код AS1/AS2:

//загрузка изображений надписей в количестве countLables (прототипы загружаются по кругу)
for (var i=0;i<countLables;i++) {
        var labelName = "label"+i;
        _root.createEmptyMovieClip(labelName, i);
        _root[labelName]._alpha = 0;
        var labelNamePrototip = "label"+iPrototip;
        iPrototip++;
        if (iPrototip>maxPrototip) iPrototip=0;
        _root[labelName].attachMovie(labelNamePrototip, labelName, labelLevel);       
}

в ролике сейчас countLables равно 20, а maxPrototip равно 5, т.е., у меня перед началом ротации создается 20 мувиков с именами "label0", "label1", ... "label19", в которые положены 5 прототипов из библиотеки. Это я сделал, чтобы больше не лазить в библиотеку, хотя выигрыша в производительности мне это не дало.

Каждый прототип в библиотеке - это шрифтовая надпись, переведенная в кривые (ctrl-D дважды) и сконвертированная в символ.

ОльгаЮрьевна 19.05.2009 16:05

МихаилК если у вас прототипы это мувики - сделайте как я сказала и проблем не будет... просто когда все это богатство грузится setInterval мозги у компьютера реально ломаются...

МихаилК 19.05.2009 16:15

Они грузятся до ротации и по сетИнтервалу они просто гоняются плюс манипуляции с альфой.

У меня есть подозрение, что дело действительно в сетИнтервале. Может поставить 24 кадра в секунду и в каждый четвертый кадр запихать вызов функции, которая запускает очередной мувик?

ОльгаЮрьевна 19.05.2009 16:27

... а почему все-таки не добавить в последний кадр каждого мувика this.removeMovieClip()?... если вам думается что это не корректно - зря! это хороший метод... а про 24 кадра в секунду... ну там-же и не в секунду вовсе... там какая-то мутная история - я к тому, что к ним лучше не сильно привязываться:)

Psycho Tiger 19.05.2009 16:27

Функция в функции? Вообще не в курсе тонкостей работы, но здравый смысл подсказывает, что hideLabel() - локальная функция, короче она умрет после конца родительской функции.
iLevel - не определенно.
slideTo, alphaTo - реализации не видно.

UPD: проглядел ссылку)

МихаилК 19.05.2009 23:06

hideLabel - callback-функция, iLevel - ставится нулем в начале, потом растет

> а почему все-таки не добавить в последний кадр каждого мувика this.removeMovieClip()?.

У меня так было сделано в самом первом варианте.
Каждый раз при вызове showOneLabel() создавался пустой клип, куда аттачился клип из библиотеки, в конце по событию окончания движения отрабатывался removeMovieClip (только не изнутри, а снаружи).

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

На самом деле, глюк с замиранием воспроизведения наблюдается только в ФФоксе (в частности, с десятым плеером от адобе). В ИЕ задержек нет.


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

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