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

Vitowd 03.09.2007 14:20

Как организовать "быстрый просмотр" загруженного "виртуального" мувиклипа.
 
Была поставлена задача - удерживая нажатой кнопку "быстрого просмотра" пролистывать мувиклип с шагом в 5 кадров т.е. проигрывать только кадры кратные 5-ти.

При отпускании кнопки продолжать нормальное покадровое проигрывание.
  • Имеется виртуальный мувиклип "myMC" с загруженным в него SWF.
  • Имеется кнопка с именем "btn_forwd"
    Код:

    var frwd:Boolean
    _root.btn_forwd.onPress = function() {_root.frwd = true}
    _root.btn_forwd.onRelease = function() {_root.frwd = false}

  • Теперь, если бы мувиклип был реальным, то можно было бы на него назначить:
    Код:

    onClipEvent (enterFrame) {
      if (_root.frwd == true){
        frame = this._currentframe +5;
        this.gotoAndStop (frame);
        }

    и каждый кадр мувиклипа проверял бы значение переменной "frwd", перескакивая через каждые 5 кадров при нажатой кнопке.
  • Но поскольку мувиклип виртуальный (созданный с помощью createEmptyMovieClip()), то напрашивается процедура:
    Код:

    _root.myMC.onEnterFrame = function() {
            if (_root.frwd == true){
            frame = myMC._currentframe +5;
              _root.myMC.gotoAndStop (frame);
            }

    Но как или где пристроить эту функцию я не могу сообразить. Да и нужна ли именно она - я не уверен.
  • Как вариант, можно с стороны кнопки вызывать функцию, например:
    Код:

    function fastPlay(){
      if (_root.frwd == true){
        frame = myMC._currentframe +5;
        _root.myMC.gotoAndStop (frame);
      }
    }

    Но тогда придётся всё время неистово кликать по кнопке (как со stop'ом, так и с play'ем). А задача ведь стоит удерживать кнопку бытрого просмотра.

Подскажите пожалуйста, как организовать быстрый просмотр виртуального мувиклипа с удерживанием кнопки? Хотя бы алгоритм.

Что такое хорошо? 03.09.2007 15:35

между "реальным" и "виртуальным" мувиком нет никакой разницы.

Wolsh 03.09.2007 15:35

Чёто мне так интересно стало, как Вы кадры будете создавать в своем виртуальном мувике. Поделитесь технологией?

Обращаться-то надо к ЗАГРУЖЕННОМУ мувику, это у него есть каррентфрейм и прочие вкусности, это его Вы хотите гонять через пять кадров (представляю этот хаос; впрочем, если это типа масяня то - вперед!). А имя его Вы сами своими руками задаете при загрузке, отчего же не пользуетесь?

Vitowd 03.09.2007 16:11

Уважаемому последователю В.Маяковского:
Реальнай клип создаётся в документе *.FLA. Виртуальный же, как я уже сказал вначале (если внимательно читать), создаётся программно методом createEmptyMovieClip().

Уважаемому Wolsh:
В моём первом запросе сказано: - "Имеется виртуальный мувиклип "myMC" с загруженным в него SWF"

ВСЕМ Спасибо!
Разобрался сам. Особенность случая в том, что проверять покадрово нужно рабочий стол, а переходы на фреймы надо делать в мувиклипе.
Код:

_root.onEnterFrame = function():Void {
        if (_root.frwd == true){
    frame = myMC._currentframe +5;
        _root.myMC.gotoAndStop (frame);
        }


Wolsh 03.09.2007 16:27

Очень удивлюсь если ЭТО заработает :) Попробуйте прочесть то что Вам написали. А затем - то, что Вы написали.

Vitowd 04.09.2007 08:45

В том то и дело, что именно ЭТО как раз и РАБОТАЕТ. Иначе не сообщал бы. Сначала проверил на работоспособность, а потом опубликовал.

В самом первом сообщении, я как раз и приводил НЕ РАБОТАЮЩИЙ код с _root.myMC.onEnterFrame со всеми его "вкусностями", как об этом позже писали.

Kikasso 04.09.2007 10:02

1) надо правильно обращаться
Код:

_root.myMC.onEnterFrame = function() {
if((_root.frwd ){
 var frame = this._currentframe +5;
 if(frame > this._totalframes ) frameToGo  = 1;
 this.gotoAndStop (frame);
}
}

2) если вы грузите в myMC что-либо, это что-либо вытряхнет из него все переменные и функции. Сажать код на мувик можно по onLoadInit, грузить с помощью MovieClipLoader.

Vitowd 05.09.2007 09:19

Вложений: 1
Уважаеммоу г-ну Kikasso:
Премного благодарен за внимательное участие и прятное общение!
Я вставил, любезно предоставленный вами код, в свой FLA-документ. К моему огорчению, кнопка быстрой перемотки вперёд перестала работать. Естественно, мне, как махровому чайнику, пока великие пути флеша неисповедимы.
Предоставляю исходник RARхивом Вложение 1, в котором код (swfplay01.fla) с моим вариантом работает, а код с вашим (swfplay02[bad].fla) к сожалению не изволит. В чем-то я, несомненно, принципиально не прав.
Пожалуйста, не сочтите за труд, гляньте одним глазком на исходнички, подскажите несведущему, где же я оплошал.


".. Я ещё не волшебник. Я только учусь, но дружба позволяет делать всякие чудеса!" - из к/ф "Золушка", реплика пажа.

Kikasso 05.09.2007 09:57

Вы внимательно читаете?
Цитата:

Сообщение от Kikasso
2) если вы грузите в myMC что-либо, это что-либо вытряхнет из него все переменные и функции. Сажать код на мувик можно по onLoadInit

Собственно, ваш вариант работает и нормально. Вы же в корень ничего не грузите, вот код и остается.

Вот так уже работает:
Код:

myMC_List.onLoadInit = function(target_MC:MovieClip):Void {
  target_MC._x = (Stage.width - target_MC._width) / 2;
  target_MC._y = 5;
  target_MC.stop();
 
 target_MC.onEnterFrame = function() {
  if(_root.frwd ){
 var frame = this._currentframe +5;
 if(frame > this._totalframes) frame  = 1;
 this.gotoAndStop (frame);
 }
 if (_root.rwnd){
  var frame = this._currentframe -5;
  if(frame < 1) frame = this._totalframes;
  this.gotoAndStop (frame);
 }
}
// Эта секция кода не нужна:
//_root.myMC.onEnterFrame = function() {...}

Но это некрасиво - объявлять функции внутри функций.
Так уже лучше:
Код:

var mcUrl:String = "swfile.swf";
this.createEmptyMovieClip("myMC", 10);

function onLoadInit(target_MC:MovieClip):Void {
  target_MC._x = (Stage.width - target_MC._width) / 2;
  target_MC._y = 5;
  target_MC.stop();
        target_MC.onEnterFrame = loadedClipDoEnterFrame; // без скобок!
}
function loadedClipDoEnterFrame():Void {
        if(_root.frwd ){
        var frame = this._currentframe +5;
        if(frame > this._totalframes) frame  = 1;
        this.gotoAndStop (frame);
 }else if (_root.rwnd){
  var frame = this._currentframe -5;
  if(frame < 1) frame = this._totalframes;
  this.gotoAndStop (frame);
 }
}
       
function onLoadError(target_MC:MovieClip):Void {
  target_MC.createTextField("error_txt", 1, 0, 0, 100, 20);
  target_MC.error_txt.autoSize = "left";
  target_MC.error_txt.text = "Ошибка загрузки клипа с адреса:\n\t" + target_MC._url;
}
var myMC_Load:MovieClipLoader = new MovieClipLoader();
myMC_Load.addListener(this);
myMC_Load.loadClip(mcUrl, myMC);

//Кнопка быстрой перемотки вперёд
var frwd,rwnd:Boolean=false;
_root.btn_forwd.onPress = function() {_root.frwd = true}
_root.btn_forwd.onRelease = function() {_root.frwd = false}


Vitowd 05.09.2007 14:14

Вложений: 1
Уважаеммоу г-ну Kikasso:
  1. Спасибо за ваше долготерпение! Не обижайтесь пожалуйста, но я действительно внимательно прочитал ваше сообщение. И педантично выполнил ваши рекомендации. Мой код выглядел буквально также, как приведенный вами. Однако объявление функции внутри функции показалось мне (чайнику) настолько несуразным, что я даже побоялся выставлять его на всеобщее обозрение. Тем более, что он НЕ РАБОТАЛ!
  2. В действительности, Ваш код работает, но не всегда. Как я для себя выяснил, всё зависит от подгружаемого SWF-мувика. Для меня это было неожиданностью, поскольку верил в незыблемость и приоритет AS.
  3. Выкладываю исходник и три простейшие SWF для подгрузки (первая строка в коде: var mcUrl:String = "tez.swf"):
    • swfile.swf - файл первого примера, с которвм ВСЁ работает
    • konti.swf - файл с которым я экспериментировал. Работает исключительно только моя прокрутка. Ваш код - классика AS, но он, УВЫ, НЕработает!
    • tez.swf - файл, с которым НИЧЕГО не работает. Мувмклип не останавливается при инициализации, не работает пауза, плей и, естественно, прокрутка.
  4. Вероятно, я не знаю чего то важного, что знают все и поэтому нигде не упоминают.
    Подскажите ещё раз, пожалуйста, в чем причина такой неадекватной реакции AS на различные подгружаемые файлы. Где соломку стелить, что бы не пенять на AS? Ведь если подгружать различные файлы для просмотра, то надо быть уверенным в успешной работе AS.

Спасибо громадное!

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


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

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