Форум 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)
-   -   проигрыватель swf (http://www.flasher.ru/forum/showthread.php?t=179429)

Ylik 15.05.2012 00:47

проигрыватель swf
 
Здравствуйте, люди!
Тема не новая, но я всё перерыла, так и не нашла ничего. Поэтому решила задать вам вопрос.
Скажите, пожалуйста, вот как всё-таки связать полосу воспроизведения в одной swf и кадры в другой (подгружающейся) swf, так, чтобы можно было ею управлять: перематывать на любое место (как в плеере).
Пауза и плей - это понятно. А как вот так сделать, чтоб при воспроизведении swf перемещался бегунок на полосе? Или, при его перемещении, swf перематывался на соответствующее место?
Помогите советом, пожалуйста. Это для меня прям загадка. :rolleyes:

AzagThoth 15.05.2012 02:09

Код AS1/AS2:

Class public dynamic class MovieClip 
_currentframe:Number  [read-only]
_totalframes:Number  [read-only]

Остальное в хелпе.

Ylik 15.05.2012 14:06

Спасибо, но я ничего не поняла :o

Hauts 15.05.2012 14:53

Вложений: 1
Вложение 27971

Смотрите пример. Если будет непонятно — пишите :)

Ylik 15.05.2012 16:11

Тааак, уже что-то похожее на то, что я спрашивала! :)
Пока пытаюсь разобраться!!!
Там не хватает ваших комментариев. :D

Добавлено через 10 минут
Начались вопросы: :)
что такое this.pressed, this.pressStartX - ?

Hauts 15.05.2012 17:00

Цитата:

что такое this.pressed, this.pressStartX - ?
pressed - логическая переменная, обозначающая, что кнопка зажата.

pressStartX - численная переменная, хранящая локальное положение мышки на момент нажатия на кнопку. Это для того, чтобы бегунок (кнопка) двигалась "зацепившись" при нажатии тем местом, на которое нажали мышкой.

AzagThoth 15.05.2012 18:09

Цитата:

Сообщение от Ylik (Сообщение 1079621)
Спасибо, но я ничего не поняла :o

Всё достаточно просто. Рисуете скроллер. Программируете его как вам нравится. Затем смотрите общее количество кадров _totalframes подгруженной флешки и при скроллинге высчитываете пропорционально какой точке скроллера соответствует какой кадр от общего количества кадров. Таким образом становится ясно на какой кадр нужно перемотать. Перематываете просто через gotoAndStop(цифраКадра) или gotoAndStop(цифраКадра)

Ylik 15.05.2012 19:28

Цитата:

Сообщение от AzagThoth (Сообщение 1079663)
Всё достаточно просто. Рисуете скроллер. Программируете его как вам нравится. Затем смотрите общее количество кадров _totalframes подгруженной флешки и при скроллинге высчитываете пропорционально какой точке скроллера соответствует какой кадр от общего количества кадров. Таким образом становится ясно на какой кадр нужно перемотать. Перематываете просто через gotoAndStop(цифраКадра) или gotoAndStop(цифраКадра)

Вот этот принцип я и поняла, но я не поняла, каким образом пропорционально высчитывать отношение длины скролла и общего количества кадров флешки. :wacko:

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

AzagThoth 16.05.2012 03:48

Псевдокод
Код:

//определяем отношение в для одного процента кадров и длины
отношениеКадров=флешка.количествоКадров/100;
отношениеДлины=скролл.длинаСкролла/100;
нужныйКадр=округлить(скролл.координатаМыши/отношениеДлины*отношениеКадров);//но прежде убеждаемся, что координата мыши попадает под область скролла например хитТестом
флешка.мотать(нужныйКадр);

Кроме того, чтобы скроллер адекватно реагировал на проигрывание флешки понадобится завести функцию вызываемую по интервалу (интервал наверное будет лучше определить по фреймрейту)
В данной функции читаем текущийФрейм флешки и позиционируем скроллер по считанному значению. Также можно добавить в данной функции сравнение текущегоФрейма и количестваФреймов, так будет просто определить что флешка подошла к концу.
Разумеется это только один из способов. На ум пришло ещё как минимум 4.

И ещё один маленький момент. Разбирать готовый код, для того чтобы решить задачу не самая лучшая практика. Хотя, конечно, у каждого свои методы в решении задач. Но как то вот пришёл к такому умозаключению. Проблема в том, что с готовым кодом проще повторить решение - нежели научиться его генерировать.

Главное не отступайте. Не в этой задаче, не в какой либо другой. И всё обязательно получится. Какой-то щелчок в голове, и решение - вот оно. Проблема в том, что оперируя с готовыми решениями можно так и не придти к этому состоянию.

Удачи вам. Если будут какие вопросы - пишите.

Ylik 16.05.2012 14:55

Я вот как раз пыталась сделать плеер самостоятельно, но почему-то у меня постоянно что-нибудь не работало (ну и самая большая сложность, что я не смогла сделать - зависимость положения ползунка от кого, на каком кадре проигрывается флешка).
Делала что-то типа того, что вы написали, но немного примитивнее (потому и не работало, видимо).

В том примере, который мне дали здесь, я пыталась задать условие, чтобы при нахождении на последнем кадре, подгружаемая флешка останавливалась. Но оно как-то странно работало (но не так как надо).
Поэтому я не пойму, как ещё определить, что флешка находится на последнем или на 1 кадре.
(То есть при первом запуске первый кадр определяется, а при повторном воспроизведении - нет). :o

Hauts 16.05.2012 14:58

Код AS1/AS2:

trace(someLoadedMovie._currentframe);
trace(someLoadedMovie._currentframe == someLoadedMovie._totalframes)

_currentframe и _totalframes помогут!

Ylik 16.05.2012 15:23

Цитата:

Сообщение от Hauts (Сообщение 1079824)
Код AS1/AS2:

trace(someLoadedMovie._currentframe);
trace(someLoadedMovie._currentframe == someLoadedMovie._totalframes)

_currentframe и _totalframes помогут!

Вот с этим, вроде, разобралсь. :)
Спасибо огромное, что помогаете!!! :victory:

Знаете, что ещё не очень понятно.
Это мы создаем переменные, если я правильно понимаю:
Код AS1/AS2:

this.pressed = true;
this.pressStartX = this._xmouse;
initReleasePlay = true;

А как это так можно связывать переменную с мувиклипом (просто первый раз встречаю такое, вроде как)?
Код AS1/AS2:

mc.pressed

:rolleyes:

Hauts 16.05.2012 15:29

this указывает на текущий контекст. То есть в коде

Код AS1/AS2:

someButton.onPress = function(){
    trace(this)
}

this будет указывать на someButton.

Если немного усложнить, то получится вот такой пример:

Код AS1/AS2:

someButton_1.onPress = someButton_2.onPress = buttonsOnPress;
function buttonsOnPress(){
    trace(this)
}

— здесь this будет указывать на именно тот клип, на который нажали.

Я правильно понял вопрос?

Добавлено через 4 минуты
Вижу, неправильно.

Да, мувиклипу можно создавать свои свойства:

Код AS1/AS2:

 
someMovieClip.a = 1;
someMovieClip.b = 2;
someMovieClip.c = "text";
someMovieClip.d = function(){
    trace(this.a + "  " + this.b + " " + this.c);
}
someMovieClip.d();


Ylik 16.05.2012 15:35

Хм, вашу мысль я поняла.
А я правильно понимаю:
то есть если this заменить именем мувиклипа, то эта функция
Код AS1/AS2:

someButton.onPress = function(){

применится к этому мувиклипу что-ли?

Hauts 16.05.2012 15:36

Вот теперь я не понимаю вопроса :)

Ylik 16.05.2012 15:41

Ну вот было
Код AS1/AS2:

this.pressed = true;

Потом стало
Код AS1/AS2:

mc.pressed

Что должно произойти с mc и как это понимает Flash?

Hauts 16.05.2012 15:47

"this.pressed = true;" написано внутри функции, принадлежащей (присвоеной) мувиклипу mc. Поэтому this в данном случае указывает на mc. Можно написать mc вместо this и ничего в логике программы не поменяется.

А в контексте другой функции или вообще вне чего-либо, что связано с mc — чтобы узнать значение pressed у клипа mc — мы должны обращаться mc.pressed.

Так понятнее? :)

Ylik 16.05.2012 16:08

Кажись, поняла! :)
Спасибо огромнейшее за помощь! :yahoo:


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

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