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

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

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

Регистрация: Aug 2007
Сообщений: 28
По умолчанию Как организовать "быстрый просмотр" загруженного "виртуального" мувиклипа.

Была поставлена задача - удерживая нажатой кнопку "быстрого просмотра" пролистывать мувиклип с шагом в 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
Что такое хорошо? вне форума Посмотреть профиль Отправить личное сообщение для Что такое хорошо? Найти все сообщения от Что такое хорошо?
  № 2  
Ответить с цитированием
Что такое хорошо?
 
Аватар для Что такое хорошо?

Регистрация: Nov 2005
Адрес: UA
Сообщений: 326
между "реальным" и "виртуальным" мувиком нет никакой разницы.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Чёто мне так интересно стало, как Вы кадры будете создавать в своем виртуальном мувике. Поделитесь технологией?

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


Последний раз редактировалось Wolsh; 03.09.2007 в 16:10.
Старый 03.09.2007, 16:11
Vitowd вне форума Посмотреть профиль Отправить личное сообщение для Vitowd Найти все сообщения от Vitowd
  № 4  
Ответить с цитированием
Vitowd

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

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

ВСЕМ Спасибо!
Разобрался сам. Особенность случая в том, что проверять покадрово нужно рабочий стол, а переходы на фреймы надо делать в мувиклипе.
Код:
_root.onEnterFrame = function():Void {
	if (_root.frwd == true){
    frame = myMC._currentframe +5;
	_root.myMC.gotoAndStop (frame);
	}


Последний раз редактировалось Vitowd; 03.09.2007 в 16:23.
Старый 03.09.2007, 16:27
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Очень удивлюсь если ЭТО заработает Попробуйте прочесть то что Вам написали. А затем - то, что Вы написали.
__________________
Reality.getBounds(this);

Старый 04.09.2007, 08:45
Vitowd вне форума Посмотреть профиль Отправить личное сообщение для Vitowd Найти все сообщения от Vitowd
  № 6  
Ответить с цитированием
Vitowd

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

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

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

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
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.

Старый 05.09.2007, 09:19
Vitowd вне форума Посмотреть профиль Отправить личное сообщение для Vitowd Найти все сообщения от Vitowd
  № 8  
Ответить с цитированием
Vitowd

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


".. Я ещё не волшебник. Я только учусь, но дружба позволяет делать всякие чудеса!" - из к/ф "Золушка", реплика пажа.
Вложения
Тип файла: rar swfplay.rar (27.8 Кб, 53 просмотров)

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

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
Вы внимательно читаете?
Цитата:
Сообщение от 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}


Последний раз редактировалось Kikasso; 05.09.2007 в 10:11.
Старый 05.09.2007, 14:14
Vitowd вне форума Посмотреть профиль Отправить личное сообщение для Vitowd Найти все сообщения от Vitowd
  № 10  
Ответить с цитированием
Vitowd

Регистрация: Aug 2007
Сообщений: 28
Уважаеммоу г-ну 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.
Благодарю за помощь при вылазании из лужи! Вы напомнили мне, что существует старый добрый процедурный тип данных и "объявление функции внутри функции" не должно рушить эстетику кода. Впереди ждут звёзды.
Вложения
Тип файла: rar swfplay2.rar (65.0 Кб, 61 просмотров)

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

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

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


 


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


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