Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Реверс
Flash Zone Forum > Macromedia Flash > Общие вопросы
Misogi
Люди.Может это глупый вопрос но все же... У меня есть movieClip который вставлен в кадр основного клипа,можно ли как-нибудь при помощи Action-a проиграть этот movieClip в обратном порядке?? unsure.gif Заранее спасибо rolleyes.gif
tiHo
Код
i = 6;
function gg()
{
    i--;
    clip.gotoAndStop(i);
    if (i <= 1)
    {
        i = 6;
    }
}
onEnterFrame = function ()
{
    gg();
};


тока быстро очень крутит. но зато назад.

а чтобы помедленее можно установить интервал вызова функции gg()

вот так:

Код
i = 6;
function gg()
{
    i--;
    clip.gotoAndStop(i);
    if (i <= 1)
    {
        i = 6;
    }
}
setInterval(gg,500)



подробнее:

i: указывает на количество кадров в клипе clip.
функция setInterval(), устанавливает скока раз в секунду будет выполнятся gg().
в нашем случае каждые полсекунды(500мс)

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

все. пользуйся.
Rohan
Код
MovieClip.prototype.reverse = function() {
    this.gotoAndStop(this._totalframes);
    this.onEnterFrame = function() {
        if(this._currentframe==1)
            this.gotoAndStop(this._totalframes);
        else
            this.prevFrame();
    }
}

Юзать как
[нужный клип].reverse();
MustLive
Интересный пример Саша.

Misogi, я уже неоднократно отвечал на форуме относительно проигрыша назад (а также в рассылке писал), поэтому стоило по форуму поискать smile.gif. Всем кто задаёт "одни и те же" вопросы, стоит по форуму искать в первую очередь. У меня в примерах речь шла как о проигрыше всей флешки назад, так и для отдельных роликов.

Но хорошо, что tiHo оперативно написал пример кода для этого дела. У меня в коде использовался не clip.gotoAndStop(i), а clip.prevFrame(). И код не такой напряжный (нет i, что упрощает использование и делает код универсальным).

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

Пока я писал месадж, и Rohan написал свой пример.

Тоже довольно интересный пример, близкий к тому что я много раз приводил на форуме. Только у меня более AS1-подобный, а у Rohan-а, более AS2-подобный (с заданием прототипа MovieClip.prototype.reverse).

Интересно, а в Флеш 6/МХ это заработает? Т.к. сам никогда не пробовал прототипить. Код интересный, сразу целый метод. Сейчас среди профи это модно smile.gif - сразу методы делать. Подумаю, может в рассылке опишу как-нибудь пример Rohan-а для реверса.
tiHo
вечно я все усложняю biggrin.gif
MustLive
Неа.

Во флеш 6/МХ не работает метод Rohan-а. Не реверсит через метод reverse мувиклип.

Поэтому для 6/МХ можно применять мой реверс:
Код
this.onEnterFrame = function() {
if (getBack){
  if (mc._currentframe <> 1) {
   mc.prevFrame();
  }
  else {
   getBack = false;
  }
}
}
mc.gotoAndStop(mc._totalframes);
getBack = true;

Проигрывает не зациклено - только один раз с конца. mc.gotoAndStop(mc._totalframes) - для установки в конец ролика (т.е. без каких-либо переменных i, всё работает автоматически для любых мувиков).
tiHo
ну что Rohan, довыпендривался biggrin.gif biggrin.gif laugh.gif laugh.gif
Rohan
ЭЭЭ! smile.gif Че это не работает? Мля, пока не написано "class A extends B implements C" в отдельном *.as - файле, все это счастье - AS1. У меня Flash MX2004, поставил в Publish settings публиковать под 6-й плеер, выбрал Action Script 1 (на всякий случай) - и все __работает__. Вы точно правильно это юзали? rolleyes.gif
tiHo
обижаеш biggrin.gif laugh.gif
MustLive
Rohan

Ничего не получилось. Ни во флеше 6, ни в 8.

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

Сейчас вот попробовал сам запрототипить - создать свой метод. И что я не делал, никак этот код не заработал - ни в 6, ни в 8 флеше. И в кадр (а прототипить можно и в кадре, как я знаю по рабочим примерам), и в as-файл, и классами пробовал и применять к протитипу реверс-методу функцию с другого класса, в общем никак метод не заработал. Долго с ним морочился, но рабочим метод сделать не удалось.

Зато если не делать методом, а просто код на объект поместить, то всё хорошо работает (и в 6/8 флеше).

Код
onClipEvent (load) {
    this.gotoAndStop(this._totalframes);
    this.onEnterFrame = function() {
        if(this._currentframe==1)
            this.gotoAndStop(this._totalframes);
        else
            this.prevFrame();
    }
}


Ну и у Саши я вижу тоже код не работает, так что значит мои подозрения насчёт метода (что есть проблемы с реализацией в виде метода) подверждаются wink.gif

Поэтому пока будем юзать или мой метод (в виде функции на кадр), или передаланный вариант Рохана (в виде функции на объект).
Rohan
Таак... Еще раз... Делаем мувиклип - одна штука, кинаем его на стейдж, даем ему имя myclip в первом и единственном фрейме (че усложнять) вставляем код MovieClip.prototype... , затем здесь же пишем myclip.reverse(); В чем вообще может быть проблема? Такое не может не работать - я лично это проверил rolleyes.gif Все просто отлично работает... blink.gif
MustLive
Rohan - не работает smile.gif В том то и дело.

Клип и код проще некуда, один фрейм, а не пашет.

MovieClip.prototype вставлял и в кадр сцены, и в as файл, чего только не пробовал - и в 6/мх и в 8 - не заработало. Нагло не работает. Хотя по идее всё должно работать.

...

Ещё раз зашёл в 8й флеш. Код всё тот же, в кадре всё что и раньше, клип mc.

Опять mc.reverse. Всё так же. На всякий случай повторно назвал клип mc. И заработало! Во блин - наверное там имя содержало кириллическую "с" или ещё какой-то глюк. Вот гадость - столько времени убил и наморочился с прототипом. Мутный глюк с именем (откуда там взяться не той букве в имени клипа).

Ну с проблемой разобрались. Но это всё касательно 8 флеша.

В 6м не пашет этот код (там с прототипами как-то по другому нужно писать). При этом если из 8го экспортить в 6й формат, то пашет, даже если AS1 поставить (редактор сам преобразует код как нужно). А вот в редакторе 6/МХ код не работает.

Поэтому для совместимости со старыми редакторами рекомендую использовать мой код №1 (с getBack) или мой код №2 (ремейк кода Рохана).
Rotwang
Я написал код для прокручивания внутренней анимации мувика plenka вперед и назад:
Код
plenka.stop();
var nnn:int = plenka.currentFrame;
vpered.addEventListener(MouseEvent.MOUSE_DOWN, vperedDownListener);
vpered.addEventListener(MouseEvent.MOUSE_UP, vperedUpListener);

function vperedUpListener(e:MouseEvent):void{
    plenka.stop();
    trace(plenka.currentFrame);
}
    
function vperedDownListener(e:MouseEvent):void{
    plenka.gotoAndStop(plenka.currentFrame);
    //addEventListener(Event.ENTER_FRAME, Play);
    //function Play(e:Event):void{
    trace(plenka.currentFrame);
    plenka.play();
}
////////////////////////////
nazad.addEventListener(MouseEvent.MOUSE_DOWN, nazadDownListener);
nazad.addEventListener(MouseEvent.MOUSE_UP, nazadUpListener);

function nazadUpListener(e:MouseEvent):void{
    plenka.stop();
    trace(plenka.currentFrame);
}
function nazadDownListener(e:MouseEvent):void{
plenka.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

function enterFrameHandler(event :Event):void{
    if (plenka.currentFrame == 1){
        plenka.gotoAndStop(plenka.totalFrames)
    }else{
        plenka.prevFrame();
}
}
}

Для прокручивания вперед все работает, при нажатии и удержании кнопки мувик проигрывается вперед. При отпускании останавливается.
Вот код, отвечающий за проигрывание назад
Код
nazad.addEventListener(MouseEvent.MOUSE_DOWN, nazadDownListener);
nazad.addEventListener(MouseEvent.MOUSE_UP, nazadUpListener);

function nazadUpListener(e:MouseEvent):void{
    plenka.stop();
    trace(plenka.currentFrame);
}
function nazadDownListener(e:MouseEvent):void{
plenka.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

function enterFrameHandler(event :Event):void{
    if (plenka.currentFrame == 1){
        plenka.gotoAndStop(plenka.totalFrames)
    }else{
        plenka.prevFrame();
}
}
}

При его выполнении начинается прокрутка назад, но когда отпускаешь кнопку, мувик не останавливается. И крутится с все возрастающей скоростью. Может быть при отпускании надо как-то избавляться от Event.ENTER_FRAME?
Rotwang
Где же chingachgoog? wink.gif
chingachgoog
А что вы хотите? Вы при нажатии на кнопку назад подписываетесь на nazadDownListener, который в свою очередь подписывает пленку на enterFrameHandler.
Было бы логично предположить обратную последовательность при отпускании кнопки назад, но вместо этого в nazadUpListener зачем-то прописывается stop()...
Rotwang
Цитата
Было бы логично предположить обратную последовательность при отпускании кнопки назад

Вот, дошло до меня наконец-то!
Код
function pravoDownListener(e:MouseEvent):void{
    plenka.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
function enterFrameHandler(event :Event):void{
    if (plenka.currentFrame == 1){
        plenka.gotoAndStop(plenka.totalFrames)
}else{
        plenka.prevFrame();
        pravo.addEventListener(MouseEvent.MOUSE_UP, pravoUpListener);
function pravoUpListener(e:MouseEvent):void{
    plenka.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
    trace(plenka.currentFrame);
}
        }
}
}

Я просто прячу в pravoDownListener pravo.addEventListener(MouseEvent.MOUSE_UP, pravoUpListener); и функцию pravoUpListener, в которой прописываю удаление Event.ENTER_FRAME. И тогда работает!
chingachgoog
Цитата(Rotwang @ 19.05.2009 - 18:36) *
То есть вы хотите сказать, что надо как-то удалить enterFrameHandler?


"Как-то" не надо. smile.gif
Если есть addEventListener, то есть и removeEventListener
Rotwang
chingachgoog, пока я редактировал свое сообщение, вы уже новое успели написать laugh.gif.
Русская версия IP.Board © 2001-2009 IPS, Inc.