Просмотр полной версии : вызов функций флешки
В ActiveX компонент WebBrowser загружен HTML, который внедряет флешку.
Можно ли как-нибудь через WebBrowser вызвать функции из скриптов флешки?
по идее это делается с помощью JavaScript
я просто не знаю, компонент поддерживает JS или нет
не в курсе просто.
по идее это делается с помощью JavaScript
я просто не знаю, компонент поддерживает JS или нет
не в курсе просто.
через компонент можно вызвать JS функцию в HTML документе...
А как из JS вызвать функции флешки?
DizMaster
13.07.2005, 11:07
http://www.flash-here.com/tutorials/flash_from_js1.html
http://www.flash-here.com/tutorials/flash_from_js1.html
не, не то. Там не написано как вызывать функции флешки :(
Там написано как присваивать значения переменным внутри флешки - SetVariable - это и так понятно.
Также написано про функции, которые можно вызвать стандартно - Stop, Play, Rewind и т.л.
Но это внешеее управление флешкой.
А вот допустим в скриптах флешки существует функция GoToPostition. Как ее вызвать?
Да, стоит добавить. Если в SetVariable указать не переменную, а имя функции - то ничего не срабатывает. Зато эта функция становится недоступной даже внутри флешки. Если ее вызывать - ничего не происходит...
разумеется ничего не происходит, потому, что ты задаешь переменную,
одноименную с методом, которая собственно перезаписывает этот метод.
есть очень простой и хороший путь: создание свойств в руте и присвоение
через жабу свойству твоего значения.
в твоем случае, если у тебя есть метод GoToPostition
и он принимает один аргумент, попросту задай getter и setter:
_root.addProperty("_pozition", _root.getPostition, _root.GoToPostition)
- где getPostition, если нужно, будет возвращать значение.
_root.addProperty("_pozition", _root.getPostition, _root.GoToPostition)
я так понимаю, это надо во флешке выполнить? :(
Дело в том, что флешка не моя. У меня уже есть готовый swf файл, Я только ей управляю из HTML документа :(
Что в этом случае можно сделать?
господа а можно небольшой примерчик
А если сделать другой ролик, который будет грузить указанный swf - исходников, видимо, нет? - и пытаться вызвать методы уже из него?
Вопрос к опытным - такое возможно?
А вот этот ролик-контейнер уже можно оснастить через addProperty.
А если сделать другой ролик, который будет грузить указанный swf - исходников, видимо, нет? - и пытаться вызвать методы уже из него?
а с чего ты взял, что из другой флешки можно вызывать функции этой флешки?
Если уж нельзя это сделать в JS скрипте - с чего ты взял, что функции можно вызывать из другой флешки?
Поясняю. JavaScript в нашем случае реализуется через скриптовую машину Microsoft, а она, вот ведь беда какая, ничего не знает о том, что есть такой зверь flash, ей известно только, что это plugin-объект, поддерживающий нужные ей интерфейсы.
Другое дело сам флэш - один ролик в другой загрузить можно, причём все эти вещи будут выполняться в одной среде. Что управлять, скажем, кадрами загруженного ролика можно, мне что-то такое подсказывает. А если так, то, может, можно и функции загруженного ролика дёргать? Сам я не пробовал, и пробовать лень, но почему бы нет, раз среда одна?
Когда ролик в ролик грузится, это происходит напрямую, без взаимодействия ActiveX и скриптовых машин. Попытайся для примера создать флэшку, которая через loadMovie грузит твой swf, и попытайся подёргать за методы/функции загруженного. Если получится - пиши контейнер, который будет реагировать на команды JavaScript, и встраивай в страницу уже его.
Кроме того, вопрос - обязательно использовать промежуточную страницу, просто Shockwave ActiveX не обойтись?
загружая в первую флешку вторую, можно получить доступ к функциям второй из первой.
вот, значит, можно сделать контейнер и жить с удовольствием :)
>Попытайся для примера создать флэшку, которая через loadMovie грузит твой swf
а можно поподробнее? Желательно по шагам - как это сделать грамотно??? А то я во Flash MX не особо :(
все мы не особо...
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.
От себя скажу, что проверил во флэше, и там у меня сработало - при присваивании значения метод проявил себя :).
Народ, я тут вызываю функцию из другой флешки, вот что понаписал:
_root.createEmptyMovieClip('handledMovie', _root.getNextHighestDepth());
_root.handledMovie.loadMovie('lash.swf');
var s = _root.handledMovie.encrypt('ggg', 'dfgdgf');
var s2 = s;
на последней строчке я ставлю брекпоинт. Выполнение останавливается... но как узнать значение переменной s??? Иликак-нибудь вывести ее на экран...
Попробуй Debugger. Window\Development Panels или где-то рядом
когда сделал 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???
у тебя клип еще загрузиться не успел, а ты пытаешься уже из него данные получить.
а как тогда правильно? чтобы дождаться загрузки и вызвать функцию?
проверяешь загрузился флеш фалй или нет. как только загрузился, сразу вызываешь функцию
>проверяешь загрузился флеш фалй или нет
я понял! а как это сделать? как проверить - загрузился или нет?
Big Ban, MovieClipLoader.
mediaman
22.08.2005, 00:37
а я бы не так делал, вернее делал =)
очевидно твоя флешка не предназначена изначально для управления из хтмл, если грузанешь ее в контейнер просто как вложенный мувик, не факт что будет работать, так как меняется руут, и еще разные бяки полезут, например в связи с обновлением хтмл страницы, гораздо проще взять и дописать обработчик во флешке, что технологически не так уж и сложно, как и управление из хтмл
nuran
>MovieClipLoader
что это такое? Как пользоваться, можно пример?
mediaman
>проще взять и дописать обработчик во флешке, что технологически не так уж и
>сложно
например? Как ты предлагаешь это сделать? И о каком обработчике ты говоришь?
mediaman
22.08.2005, 11:21
я имею ввиду обработчик "вызовов из/в хтмл", может кнчно у тебя тяжелый случай и не все так очевидно ... покажи флешку =)
а каким образом ты собираешься что-то добавить во флешку?!?! она и декомпилируется некорректно даже, всякие защиты встроены :(
Народ, не расскажите про MovieClipLoader поподробнее?
Почитал в интернете про 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);
Так... флешка загружается нормально, если делать так:
mcLoader = new MovieClipLoader();
mcLoader.loadClip("flash.swf", 0); // то есть, без указания контейнера
теперь интересует - а как вызвать функцию в этой загруженной флешке?
- а загруженная флэшка почему этого сама не может сделать?
Так... флешка загружается нормально, если делать так:
mcLoader = new MovieClipLoader();
mcLoader.loadClip("flash.swf", 0); // то есть, без указания контейнера
теперь интересует - а как вызвать функцию в этой загруженной флешке?
Распакуй в одну папку. Открой во флеше f1.fla и запусти его.
iNils, спасибо! Кажется, что-то стало получатся.
Но есть одна проблема - указанным способом в проекте флешка не грузится!
Флешка грузится если делать так:
mcLoader = new MovieClipLoader();
mcLoader.loadClip("tz.swf", 0);
но когда я сделал так в твоем проекте - ничего не загружается вообще.
Не пойму отчего так :(((
iNils,Флешка грузится если делать так:
mcLoader = new MovieClipLoader();
mcLoader.loadClip("tz.swf", 0);
но когда я сделал так в твоем проекте - ничего не загружается вообще.
Ты хочешь сказать, что не можешь загрузить флешку с помощью обычным loadMovie?
MovieClipLoader это штука из 7го флеша, а я им не пользуюсь, поэтому не знаю как он работает.
>Ты хочешь сказать, что не можешь загрузить флешку с помощью обычным
>loadMovie?
да! у флешки при этом появляется такой значок, который она выдает при инициализации. Но заставка уже не появляется.
А вот указанным мной способом флеха грузится!
Если вставить данный мной вверху код в пустой проект - то флешка грузится!
Но если вставить этот код в проект который ты дал, в первый фрейм, вместо loadMovie - то почему-то не работает!!! Не пойму почему так...
А ты не мог рассказать - почему код вывода значение функции на -ом кадре, по какому принципу это все?
Если вставить данный мной вверху код в пустой проект - то флешка грузится!
Но если вставить этот код в проект который ты дал, в первый фрейм, вместо loadMovie - то почему-то не работает!!! Не пойму почему так...
поменяй версию публикования флеша с 6 на 7
А ты не мог рассказать - почему код вывода значение функции на -ом кадре, по какому принципу это все?
просто мне лень писать проверку на загрузку клипа, поэтому при тестах я сую ее чуть дальше (это помогает при локальном тестировании, при загрузке из сети надо нормальую проверку писать)
>поменяй версию публикования флеша с 6 на 7
а где это делается? :(((
Где это делается - я нашел... Но вопрос то остается открытым - а как в случае с MovieClipLoader вызывать функции флешки? :(((
Этот метод, вообще-то, вторым параметром принимать должен клип, в который и будет загружен ролик. Это если в хелпе посмотреть. Ты же, как я понимаю, туда пустоту нулевую отдаёшь. Отдай клип, созданный через createEmptyMovieClip, например, и тягай его родимаго потом.
Вот пример из хелпа
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);
>этот метод, вообще-то, вторым параметром принимать должен клип, в который и
>будет загружен ролик
тогда ролик не грузится, если указывать контейнер!!!
только при втором параметре = 0 он грузится.
У меня вопрос:
В своем посте #16 MaxLife писал:
root.addProperty('method1', get_value1, set_value1);
А как вызывать такое свойство извне?
GetVariable('_root.method1')
правильно так?
Но дело в том, что так не вызывается! Зато вызываются переменные загружаемого ролика! То есть, такое ощущение, что эта самая _root становится равна не нашему ролика, а загружаемому ролику.
И чего делать? Как обратиться к свойству именно моего ролика?
Стоп, родной. Пожалей инженера отдела моделирования N2 после рабочего дня :) Во-первых - не get, а set. Во-вторых - чего там у тебя творится с загрузкой. Чего ты так его в несколько слоёв грузишь? Поясни ход мысли, пожалуйста.
mediaman
23.08.2005, 19:25
заинтриговали дальше некуда...дайте флешку посмотреть =)
успхв
>-первых - не 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 в онлайне .. слушатель есть, лектора нет =)
mediaman. а на вопрос ты не мог бы ответить?
Я, конечно, во Flash никакой, но и спецы, которых я знаю, помочь не смогли.
Так, начинаю понимать.
1. Через Set вызываешь методы или чего там, через Get хочешь забрать своё. Понял и целиком разделяю.
2. Грузишь флэшку как-то боком - не понимаю совсем. В примере, который я приводил, использовался loadMovie - и всё работало, проверено. Почему нельзя использовать его тут - не пойму. Что там дохнет от этого?
Для определённости - у тебя есть контейнер, в котором создано несколько свойств для управления и доступа. В этот контейнер в некий клип необходимо загрузить другую флешку и дёрнуть за её методы. Я верно понял?
mediaman
23.08.2005, 19:55
2 Big Ban дай флешку...флешку дай =)
В примере, который я приводил, использовался loadMovie - и всё работало, проверено. Почему нельзя использовать его тут - не пойму. Что там дохнет от этого?
я то тоже не знаю! Но факт остается фактом - эта флешка через loadMovie не грузится!
Зато грузится через MovieClipLoader
Но при этом возникает вопрос как обратиться к СВОЕЙ флешке
mediaman
это не так просто. Это олнайновая игра TimeZero.
Я тут повырезал что смог, вот что получилось:
http://piter.pechora.org/temp/tz_cut.zip (489 Kbyte)
Там надо запускать tz.swf
Если запускать из проводника - все ок, появится заставка.
А вот попробуйте загрузить из другого флеша. Только через MovieClipLoader получится :(
Ой, мама :) Попробуй компонент Loader. У него есть свойство content. Терять тебе уже нечего :)
mediaman
23.08.2005, 20:37
Cannot open file:it does not appear to be a valid archive
=( и хоть убейся, ломаный говорит файл
MaxLife, да нет, ты подожди, рано паниковать...
Смотри, есть файл. Он нормально грузится через MovieClipLoader. Ок.
Теперь есть код:
_root.addProperty('method1', get_value1, set_value1);
он добавляет свойство в _root, верно?
Но судя по всему проблема в том, что _root при MovieClipLoader меняется, и обращение:
GetVariable('_root... - уже идет к ЗАГРУЖЕННОМУ РОЛИКУ, а не к моему
Можно что-нибудь сделать? Можно как-нибудь не в _root свойство добавить... в общем, что делать-то...
mediaman, действительно, извини - фигня какая-то с загрузкой.
Перезалил сюда: http://www.***********/476229
Ладно, пробуем продать слона по-другому.
Свойства, я так понимаю, ты можешь приюить куда угодно, да вот только через рут ты их снаружи и увидишь.
Предлагаю ход конём - loadMovieNum. Что загрузится - будет доступно через имя _level1 (кажется).
Да, там ещё каким-то боком будет участвовать нечто с гордым именем lockroot. В хелп надо лезть, а я спать хочу. Сам раньше не пробовал.
Ромастый
23.08.2005, 22:21
Если грузить в level0, то подгружаемый ролик автоматом заменяет собой _root. И все что там было прописано до этого, в том числе addProperty, все исчезает.
А вот loadMovieNum("blabla.swf",1); или loadClip("blabla.swf",1) действительно должен помочь.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.