PDA

Просмотр полной версии : вызов функций флешки


Big Ban
12.07.2005, 19:54
В ActiveX компонент WebBrowser загружен HTML, который внедряет флешку.

Можно ли как-нибудь через WebBrowser вызвать функции из скриптов флешки?

Iv
12.07.2005, 20:57
по идее это делается с помощью JavaScript
я просто не знаю, компонент поддерживает JS или нет
не в курсе просто.

Big Ban
13.07.2005, 00:57
по идее это делается с помощью JavaScript
я просто не знаю, компонент поддерживает JS или нет
не в курсе просто.

через компонент можно вызвать JS функцию в HTML документе...

А как из JS вызвать функции флешки?

DizMaster
13.07.2005, 11:07
http://www.flash-here.com/tutorials/flash_from_js1.html

Big Ban
13.07.2005, 15:46
http://www.flash-here.com/tutorials/flash_from_js1.html
не, не то. Там не написано как вызывать функции флешки :(

Там написано как присваивать значения переменным внутри флешки - SetVariable - это и так понятно.

Также написано про функции, которые можно вызвать стандартно - Stop, Play, Rewind и т.л.
Но это внешеее управление флешкой.

А вот допустим в скриптах флешки существует функция GoToPostition. Как ее вызвать?

Big Ban
13.07.2005, 15:48
Да, стоит добавить. Если в SetVariable указать не переменную, а имя функции - то ничего не срабатывает. Зато эта функция становится недоступной даже внутри флешки. Если ее вызывать - ничего не происходит...

Iv
13.07.2005, 16:19
разумеется ничего не происходит, потому, что ты задаешь переменную,
одноименную с методом, которая собственно перезаписывает этот метод.
есть очень простой и хороший путь: создание свойств в руте и присвоение
через жабу свойству твоего значения.

в твоем случае, если у тебя есть метод GoToPostition
и он принимает один аргумент, попросту задай getter и setter:

_root.addProperty("_pozition", _root.getPostition, _root.GoToPostition)
- где getPostition, если нужно, будет возвращать значение.

Big Ban
13.07.2005, 16:54
_root.addProperty("_pozition", _root.getPostition, _root.GoToPostition)
я так понимаю, это надо во флешке выполнить? :(

Дело в том, что флешка не моя. У меня уже есть готовый swf файл, Я только ей управляю из HTML документа :(

Что в этом случае можно сделать?

KUZEN
14.07.2005, 12:26
господа а можно небольшой примерчик

MaxLife
14.07.2005, 18:41
А если сделать другой ролик, который будет грузить указанный swf - исходников, видимо, нет? - и пытаться вызвать методы уже из него?

Вопрос к опытным - такое возможно?

А вот этот ролик-контейнер уже можно оснастить через addProperty.

Big Ban
14.07.2005, 19:10
А если сделать другой ролик, который будет грузить указанный swf - исходников, видимо, нет? - и пытаться вызвать методы уже из него?
а с чего ты взял, что из другой флешки можно вызывать функции этой флешки?

Если уж нельзя это сделать в JS скрипте - с чего ты взял, что функции можно вызывать из другой флешки?

MaxLife
14.07.2005, 19:48
Поясняю. JavaScript в нашем случае реализуется через скриптовую машину Microsoft, а она, вот ведь беда какая, ничего не знает о том, что есть такой зверь flash, ей известно только, что это plugin-объект, поддерживающий нужные ей интерфейсы.

Другое дело сам флэш - один ролик в другой загрузить можно, причём все эти вещи будут выполняться в одной среде. Что управлять, скажем, кадрами загруженного ролика можно, мне что-то такое подсказывает. А если так, то, может, можно и функции загруженного ролика дёргать? Сам я не пробовал, и пробовать лень, но почему бы нет, раз среда одна?

Когда ролик в ролик грузится, это происходит напрямую, без взаимодействия ActiveX и скриптовых машин. Попытайся для примера создать флэшку, которая через loadMovie грузит твой swf, и попытайся подёргать за методы/функции загруженного. Если получится - пиши контейнер, который будет реагировать на команды JavaScript, и встраивай в страницу уже его.

Кроме того, вопрос - обязательно использовать промежуточную страницу, просто Shockwave ActiveX не обойтись?

iNils
14.07.2005, 21:15
загружая в первую флешку вторую, можно получить доступ к функциям второй из первой.

MaxLife
14.07.2005, 21:21
вот, значит, можно сделать контейнер и жить с удовольствием :)

Big Ban
15.07.2005, 01:29
>Попытайся для примера создать флэшку, которая через loadMovie грузит твой swf

а можно поподробнее? Желательно по шагам - как это сделать грамотно??? А то я во Flash MX не особо :(

MaxLife
15.07.2005, 19:04
все мы не особо...


1. контейнер.

создаёшь новый документ. вешаешь на первый кадр скрипт:



// создание клипа, в который будет загружен управляемый ролик
_root.createEmptyMovieClip('handledMovie', _root.getNextHighestDepth());

// загрузка ролика
_root.handledMovie.loadMovie('second.swf');

function get_value1()
{
// заглушка
}

function set_value1(value)
{
// вызов метода управляемого ролика
_root.handledMovie.method1();
}

// создание управляющего свойства
_root.addProperty('method1', get_value1, set_value1);


Делай swf.

2. страница.

Встраивай в страницу полученный swf-контейнер.

Присвай что-нибудь свойству method1.

От себя скажу, что проверил во флэше, и там у меня сработало - при присваивании значения метод проявил себя :).

Big Ban
21.08.2005, 20:18
Народ, я тут вызываю функцию из другой флешки, вот что понаписал:

_root.createEmptyMovieClip('handledMovie', _root.getNextHighestDepth());
_root.handledMovie.loadMovie('lash.swf');
var s = _root.handledMovie.encrypt('ggg', 'dfgdgf');
var s2 = s;

на последней строчке я ставлю брекпоинт. Выполнение останавливается... но как узнать значение переменной s??? Иликак-нибудь вывести ее на экран...

iNils
21.08.2005, 20:28
trace(s); не пробывал?

MaxLife
21.08.2005, 20:34
Попробуй Debugger. Window\Development Panels или где-то рядом

Big Ban
21.08.2005, 20:53
когда сделал trace - после выполнения появляется окно, где написано: undefined :(

Я вроде все правильно делаю? :(
Вот мой код:

_root.createEmptyMovieClip('handledMovie', _root.getNextHighestDepth());
_root.handledMovie.loadMovie('tz.swf');
var s = _root.handledMovie.dct('nhcaakihtdcktajhpevffkiboqjitgyh', 'ggasfsfg');
trace(s);

А вот как описана эта функция dct внутри загружаемого флеша (то, что показывает декомпилер):

function dct(keys, psw) {
return (("p=\"" + encrypt(psw, keys)) + "\"");
}

то есть, функция полюбому что-то должна возвращать... почему же моя S undefined???

iNils
21.08.2005, 21:16
у тебя клип еще загрузиться не успел, а ты пытаешься уже из него данные получить.

Big Ban
21.08.2005, 21:17
а как тогда правильно? чтобы дождаться загрузки и вызвать функцию?

iNils
21.08.2005, 21:24
проверяешь загрузился флеш фалй или нет. как только загрузился, сразу вызываешь функцию

Big Ban
21.08.2005, 21:42
>проверяешь загрузился флеш фалй или нет

я понял! а как это сделать? как проверить - загрузился или нет?

nuran
22.08.2005, 00:29
Big Ban, MovieClipLoader.

mediaman
22.08.2005, 00:37
а я бы не так делал, вернее делал =)
очевидно твоя флешка не предназначена изначально для управления из хтмл, если грузанешь ее в контейнер просто как вложенный мувик, не факт что будет работать, так как меняется руут, и еще разные бяки полезут, например в связи с обновлением хтмл страницы, гораздо проще взять и дописать обработчик во флешке, что технологически не так уж и сложно, как и управление из хтмл

Big Ban
22.08.2005, 01:33
nuran
>MovieClipLoader

что это такое? Как пользоваться, можно пример?

mediaman
>проще взять и дописать обработчик во флешке, что технологически не так уж и
>сложно

например? Как ты предлагаешь это сделать? И о каком обработчике ты говоришь?

mediaman
22.08.2005, 11:21
я имею ввиду обработчик "вызовов из/в хтмл", может кнчно у тебя тяжелый случай и не все так очевидно ... покажи флешку =)

Big Ban
22.08.2005, 14:10
а каким образом ты собираешься что-то добавить во флешку?!?! она и декомпилируется некорректно даже, всякие защиты встроены :(

Big Ban
22.08.2005, 14:43
Народ, не расскажите про MovieClipLoader поподробнее?

Big Ban
22.08.2005, 15:37
Почитал в интернете про MovieClipLoader...

А как обращаться функциям флешки при этом?
Я понял в этой функции надо обращаться:

mcLoader1.onLoadComplete = function( mc ) {
mc.play();
}

но как обращаться к фукциям загруженной флешки?
Вот весь код:

this.createEmptyMovieClip( "loadContainer", 1090 )

mcLoader1 = new MovieClipLoader();

mcLoader1.onLoadStart = function( mc ) {

}

mcLoader1.onLoadProgress = function( mc, bytesLoaded, bytesTotal ) {
debug( mc._name + ": loadProgress=" + bytesLoaded + "/" + bytesTotal );
}

mcLoader1.onLoadComplete = function( mc ) {
mc.play();
}

loadListener = {};
mcLoader1.addListener( loadListener );
loadListener.onLoadStart = function() {
debug ("lisnener: loadStart" );
}

loadListener.onLoadProgress = function( mc, bytesLoaded, bytesTotal ) {
debug ( "from listener :" + Math.floor(bytesLoaded / bytesTotal * 100) + "%" );
}

loadListener.onLoadComplete = function() {
debug ("lisnener: loadComplete" );
debug ("listener removed: " + mcLoader1.removeListener(loadListener) );
}


mcLoader1.loadClip("flash.swf", loadContainer);

Big Ban
22.08.2005, 19:06
Так... флешка загружается нормально, если делать так:

mcLoader = new MovieClipLoader();
mcLoader.loadClip("flash.swf", 0); // то есть, без указания контейнера

теперь интересует - а как вызвать функцию в этой загруженной флешке?

Big Ban
22.08.2005, 23:03
народ?

Iv
23.08.2005, 14:37
- а загруженная флэшка почему этого сама не может сделать?

iNils
23.08.2005, 14:50
Так... флешка загружается нормально, если делать так:

mcLoader = new MovieClipLoader();
mcLoader.loadClip("flash.swf", 0); // то есть, без указания контейнера

теперь интересует - а как вызвать функцию в этой загруженной флешке?
Распакуй в одну папку. Открой во флеше f1.fla и запусти его.

Big Ban
23.08.2005, 15:51
iNils, спасибо! Кажется, что-то стало получатся.
Но есть одна проблема - указанным способом в проекте флешка не грузится!

Флешка грузится если делать так:

mcLoader = new MovieClipLoader();

mcLoader.loadClip("tz.swf", 0);

но когда я сделал так в твоем проекте - ничего не загружается вообще.

Не пойму отчего так :(((

iNils
23.08.2005, 15:58
iNils,Флешка грузится если делать так:

mcLoader = new MovieClipLoader();

mcLoader.loadClip("tz.swf", 0);

но когда я сделал так в твоем проекте - ничего не загружается вообще.

Ты хочешь сказать, что не можешь загрузить флешку с помощью обычным loadMovie?
MovieClipLoader это штука из 7го флеша, а я им не пользуюсь, поэтому не знаю как он работает.

Big Ban
23.08.2005, 16:29
>Ты хочешь сказать, что не можешь загрузить флешку с помощью обычным
>loadMovie?

да! у флешки при этом появляется такой значок, который она выдает при инициализации. Но заставка уже не появляется.

А вот указанным мной способом флеха грузится!

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

А ты не мог рассказать - почему код вывода значение функции на -ом кадре, по какому принципу это все?

iNils
23.08.2005, 17:10
Если вставить данный мной вверху код в пустой проект - то флешка грузится!
Но если вставить этот код в проект который ты дал, в первый фрейм, вместо loadMovie - то почему-то не работает!!! Не пойму почему так...
поменяй версию публикования флеша с 6 на 7

А ты не мог рассказать - почему код вывода значение функции на -ом кадре, по какому принципу это все?
просто мне лень писать проверку на загрузку клипа, поэтому при тестах я сую ее чуть дальше (это помогает при локальном тестировании, при загрузке из сети надо нормальую проверку писать)

Big Ban
23.08.2005, 17:49
>поменяй версию публикования флеша с 6 на 7


а где это делается? :(((

Big Ban
23.08.2005, 17:56
Где это делается - я нашел... Но вопрос то остается открытым - а как в случае с MovieClipLoader вызывать функции флешки? :(((

MaxLife
23.08.2005, 19:01
Этот метод, вообще-то, вторым параметром принимать должен клип, в который и будет загружен ролик. Это если в хелпе посмотреть. Ты же, как я понимаю, туда пустоту нулевую отдаёшь. Отдай клип, созданный через createEmptyMovieClip, например, и тягай его родимаго потом.

MaxLife
23.08.2005, 19:04
Вот пример из хелпа

Example
The following example illustrates the use of many of the MovieClipLoader class methods and listeners:

// first set of listeners
var my_mcl:MovieClipLoader = new MovieClipLoader();
var myListener:Object = new Object();
myListener.onLoadStart = function(target_mc:MovieClip) {
trace("*********First my_mcl instance*********");
trace("Your load has begun on movie clip = "+target_mc);
var loadProgress:Object = my_mcl.getProgress(target_mc);
trace(loadProgress.bytesLoaded+" = bytes loaded at start");
trace(loadProgress.bytesTotal+" = bytes total at start");
};
myListener.onLoadProgress = function(target_mc:MovieClip, loadedBytes:Number, totalBytes:Number) {
trace("*********First my_mcl instance Progress*********");
trace("onLoadProgress() called back on movie clip "+target_mc);
trace(loadedBytes+" = bytes loaded at progress callback");
trace(totalBytes+" = bytes total at progress callback");
};
myListener.onLoadComplete = function(target_mc:MovieClip) {
trace("*********First my_mcl instance*********");
trace("Your load is done on movie clip = "+target_mc);
var loadProgress:Object = my_mcl.getProgress(target_mc);
trace(loadProgress.bytesLoaded+" = bytes loaded at end");
trace(loadProgress.bytesTotal+" = bytes total at end");
};
myListener.onLoadInit = function(target_mc:MovieClip) {
trace("*********First my_mcl instance*********");
trace("Movie clip = "+target_mc+" is now initialized");
// you can now do any setup required, for example:
target_mc._width = 100;
target_mc._height = 100;
};
myListener.onLoadError = function(target_mc:MovieClip, errorCode:String) {
trace("*********First my_mcl instance*********");
trace("ERROR CODE = "+errorCode);
trace("Your load failed on movie clip = "+target_mc+"\n");
};
my_mcl.addListener(myListener);
// Now load the files into their targets.
// loads into movie clips
this.createEmptyMovieClip("clip1_mc", this.getNextHighestDepth());
clip1_mc._x = 400;
this.createEmptyMovieClip("clip2_mc", this.getNextHighestDepth());
my_mcl.loadClip("http://www.macromedia.com/software/drk/images/box_drk5.jpg", clip1_mc);
my_mcl.loadClip("http://www.macromedia.com/devnet/images/160x160/ben_forta.jpg", clip2_mc);
clip2_mc._x = 200;
// loads into _level1
my_mcl.loadClip("http://www.macromedia.com/devnet/images/160x160/mike_chambers.jpg", 1);
//
// Second set of listeners
var another_mcl:MovieClipLoader = new MovieClipLoader();
var myListener2:Object = new Object();
myListener2.onLoadStart = function(target_mc:MovieClip) {
trace("*********Second my_mcl instance*********");
trace("Your load has begun on movie = "+target_mc);
var loadProgress:Object = my_mcl.getProgress(target_mc);
trace(loadProgress.bytesLoaded+" = bytes loaded at start");
trace(loadProgress.bytesTotal+" = bytes total at start");
};
myListener2.onLoadComplete = function(target_mc:MovieClip) {
trace("*********Second my_mcl instance*********");
trace("Your load is done on movie clip = "+target_mc);
var loadProgress:Object = my_mcl.getProgress(target_mc);
trace(loadProgress.bytesLoaded+" = bytes loaded at end");
trace(loadProgress.bytesTotal+" = bytes total at end");
};
myListener2.onLoadError = function(target_mc:MovieClip, errorCode:String) {
trace("*********Second my_mcl instance*********");
trace("ERROR CODE = "+errorCode);
trace("Your load failed on movie clip = "+target_mc+"\n");
};
another_mcl.addListener(myListener2);
/* Now load the files into their targets (using the second instance of MovieClipLoader) */
another_mcl.loadClip("http://www.macromedia.com/devnet/images/160x160/flex_logo.jpg", this.createEmptyMovieClip("clip4_mc", this.getNextHighestDepth()));
clip4_mc._y = 200;
// Issue the following statements after the download is complete,
// and after my_mcl.onLoadInit has been called.
// my_mcl.removeListener(myListener);
// my_mcl.removeListener(myListener2);

Big Ban
23.08.2005, 19:13
>этот метод, вообще-то, вторым параметром принимать должен клип, в который и
>будет загружен ролик

тогда ролик не грузится, если указывать контейнер!!!
только при втором параметре = 0 он грузится.

Big Ban
23.08.2005, 19:17
У меня вопрос:

В своем посте #16 MaxLife писал:

root.addProperty('method1', get_value1, set_value1);

А как вызывать такое свойство извне?

GetVariable('_root.method1')

правильно так?

Но дело в том, что так не вызывается! Зато вызываются переменные загружаемого ролика! То есть, такое ощущение, что эта самая _root становится равна не нашему ролика, а загружаемому ролику.

И чего делать? Как обратиться к свойству именно моего ролика?

MaxLife
23.08.2005, 19:21
Стоп, родной. Пожалей инженера отдела моделирования N2 после рабочего дня :) Во-первых - не get, а set. Во-вторых - чего там у тебя творится с загрузкой. Чего ты так его в несколько слоёв грузишь? Поясни ход мысли, пожалуйста.

mediaman
23.08.2005, 19:25
заинтриговали дальше некуда...дайте флешку посмотреть =)

успхв

Big Ban
23.08.2005, 19:39
>-первых - не get, а set

Ты имеешь в виду SetVariable? Но а если я хочу ВЫТАЩИТЬ ЗНАЧЕНИЕ из флешки?
Ведь при вызове GetVariable('_root.method1') должно возвратиться значение, возвращаемое функцией get_value1.
Разве не так?


>Во-вторых - чего там у тебя творится с загрузкой. Чего ты так его в несколько
>слоёв грузишь?

каких еще слоев?
Мне просто нужно загрузить флешку. Но никакими способами, которые здесь перечислили - она не грузится, кроме такого способа:

mcLoader = new MovieClipLoader();
mcLoader.loadClip("flash.swf", 0); // здесь именно 0, иначе опять же не грузится


Так вот - флешку я загрузил. Но теперь как обратиться к моей ФЛЕШКЕ? Если через GetVariable("_root...") - То такое ощущение, что _root указывает именно на загруженную флешку flash.swf, а не на мою.

А как обратиться к моей?
Вот в чем вопрос.

mediaman
23.08.2005, 19:46
недельные курсы realtime/flash beginning-advance в онлайне .. слушатель есть, лектора нет =)

Big Ban
23.08.2005, 19:49
mediaman. а на вопрос ты не мог бы ответить?
Я, конечно, во Flash никакой, но и спецы, которых я знаю, помочь не смогли.

MaxLife
23.08.2005, 19:52
Так, начинаю понимать.

1. Через Set вызываешь методы или чего там, через Get хочешь забрать своё. Понял и целиком разделяю.

2. Грузишь флэшку как-то боком - не понимаю совсем. В примере, который я приводил, использовался loadMovie - и всё работало, проверено. Почему нельзя использовать его тут - не пойму. Что там дохнет от этого?

Для определённости - у тебя есть контейнер, в котором создано несколько свойств для управления и доступа. В этот контейнер в некий клип необходимо загрузить другую флешку и дёрнуть за её методы. Я верно понял?

mediaman
23.08.2005, 19:55
2 Big Ban дай флешку...флешку дай =)

Big Ban
23.08.2005, 20:19
В примере, который я приводил, использовался loadMovie - и всё работало, проверено. Почему нельзя использовать его тут - не пойму. Что там дохнет от этого?

я то тоже не знаю! Но факт остается фактом - эта флешка через loadMovie не грузится!
Зато грузится через MovieClipLoader

Но при этом возникает вопрос как обратиться к СВОЕЙ флешке

mediaman
это не так просто. Это олнайновая игра TimeZero.
Я тут повырезал что смог, вот что получилось:

http://piter.pechora.org/temp/tz_cut.zip (489 Kbyte)

Там надо запускать tz.swf
Если запускать из проводника - все ок, появится заставка.
А вот попробуйте загрузить из другого флеша. Только через MovieClipLoader получится :(

MaxLife
23.08.2005, 20:25
Ой, мама :) Попробуй компонент Loader. У него есть свойство content. Терять тебе уже нечего :)

mediaman
23.08.2005, 20:37
Cannot open file:it does not appear to be a valid archive

=( и хоть убейся, ломаный говорит файл

Big Ban
23.08.2005, 21:08
MaxLife, да нет, ты подожди, рано паниковать...

Смотри, есть файл. Он нормально грузится через MovieClipLoader. Ок.

Теперь есть код:

_root.addProperty('method1', get_value1, set_value1);

он добавляет свойство в _root, верно?

Но судя по всему проблема в том, что _root при MovieClipLoader меняется, и обращение:

GetVariable('_root... - уже идет к ЗАГРУЖЕННОМУ РОЛИКУ, а не к моему

Можно что-нибудь сделать? Можно как-нибудь не в _root свойство добавить... в общем, что делать-то...

mediaman, действительно, извини - фигня какая-то с загрузкой.
Перезалил сюда: http://www.***********/476229

MaxLife
23.08.2005, 21:36
Ладно, пробуем продать слона по-другому.

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

Предлагаю ход конём - loadMovieNum. Что загрузится - будет доступно через имя _level1 (кажется).

MaxLife
23.08.2005, 21:38
Да, там ещё каким-то боком будет участвовать нечто с гордым именем lockroot. В хелп надо лезть, а я спать хочу. Сам раньше не пробовал.

Ромастый
23.08.2005, 22:21
Если грузить в level0, то подгружаемый ролик автоматом заменяет собой _root. И все что там было прописано до этого, в том числе addProperty, все исчезает.
А вот loadMovieNum("blabla.swf",1); или loadClip("blabla.swf",1) действительно должен помочь.