PDA

Просмотр полной версии : Flash MX: myMovieClip.onData


Entropy
28.03.2002, 20:46
В первом кадре главной timeline лежит мувик myMovieClip, в этом же кадре следующий код:

myMovieClip.onData = function() {
trace("onData");
};
myMovieClip.loadMovie("Foo.swf");

Так вот я не понял юмор: события onData не происходит, да и как оно вообще может происходить, если старый мувик заменяется на новый и, сооответствственно, удаляются все обработчики событий, связанные с ним? Например, если в предыдущем примере написать

myMovieClip.onRelease = function() {
trace("onRelease");
};

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

Может, кто-нибудь мне объяснит, как правильно использовать событие onData?

Спасибо.

УильямБрэдберри
28.03.2002, 21:00
onData - вешается на событие загрузки переменных
loadVariables

и на
XML

но не на loadMovie

УильямБрэдберри
28.03.2002, 21:02
http://www.flasher.ru/src/stats_1146/

загрузка movie - отлавливается др. условием [функция getBytesLoaded();]

Entropy
28.03.2002, 21:12
Хм-м, а это тогда что? Смотрим справку, раздел MovieClip.onData:

Description

Event handler; invoked when a movie clip receives data from a loadVariables or loadMovie call.

You must define a function that executes when the event is invoked.

Nox Noctis
28.03.2002, 21:24
2УильямБрэдберри
дооообрый веееечер.....


упс... ну вот, товарисч Энтропий меня опередил пока я в хэлп за цитатой лез :D

Nox Noctis
28.03.2002, 21:52
2Entropy
все проще :)
если сделать клип в сцене, и на него повесить
онКлипЕвент (дата)
то все работает :D

а если присваивать хэндлер как функцию, то (ты сам же сказал !) - хэндлер убъется, когда ты на место клипа новый подгрузишь...


зы: а по сути - УильямБрэдберри прав... это в хэлпе глюк

Entropy
28.03.2002, 22:22
М-дя, уши им надо поотворачивать за такие глюки :mad:.

Насчет onClipEvent: я так и знал, что кто-нибудь предложит этот способ, да не то все это. :( Я привык к классическому объекно-ориентированному программированию и строю задачу так чтобы можно было создать все с чистого листа (ну почти), т.е. через createEmptyMovieClip. Это не всегда надо, но если Вы заниметесь чем-либо более сложным, чем изготовление часиков, то ООП - единственный способ вытянуть крупный проект. А как интересно я прикручу onClipEvent к динамически созданному мувику? Палёво все это, придется опять все через задний проход делать.

Лвдно, спасибо всем, кто откликнулся.

А может, все-таки не ошибка это?

Aib
29.03.2002, 00:06
Слушай, Entropy, Тебе ведь показали, как это работает. Зачем Тебе ещё варианты, сомнительные варианты...
Ты, к примеру, видя автобус на остановке, который куда надо идёт, садишься в него или ждёшь, не поедит ли туда ещё один, а ??? :D :D :D
По поводу onClipEvent - если Ты мувик извне подкачиваешь, то в нём и ставь все эти события, проверку на закаченность - см. getBytesLoaded() и getBytesTotal(). А если Ты пустой мув создаешь, так на кой Тебе вообще проверка на загруженность.
По поводу крупных проектов - Flash MX только что вышел, а до этого народ как-то делал проекты, и дааалееекооо не часики.

Entropy
29.03.2002, 00:28
Здесь дело не в автобусах, а в том, что MovieClip.onData это красиво, а getBytesLoaded() это Камасутра. Безусловно можно вытянуть мувик из библиотеки, в него еще вложить инстанс мувика на который повесить онКлипЭвент и т.д., но... ну вы поняли? А вопрос о том как сделать так чтобы вот это работало

this.createEmptyMovieClip(myMovieClip, 0);
myMovieClip.onData = function() {
trace("onData");
};
myMovieClip.loadMovie("Foo.swf");

так и остался открытым. Но ведь именно так это и должно работать в теории.

Aib
29.03.2002, 00:52
Тебе нужно, чтоб рога работала, или чтоб Твой код заработал. Если код - то добро пожаловать к крупнозвонким.
А если прога, то

this.createEmptyMovieClip(myMovieClip, 0);
myMovieClip.loadMovie("Foo.swf");
while (myMovieClip.getBytesTotal() > myMovieClip.getBytesTotal()){
// ждём
}
if (myMovieClip.getBytesTotal() <= myMovieClip.getBytesTotal()){
trace("Loaded");
}


Или что-то в этом роде. Короче, обычный внутренний прелоадер.

john
29.03.2002, 01:11
Проблема в том что мувик с подгруженым содержанием уже "другой swf" и тут не registerClass не onData не onLoad не помогают,

единственный выход это вызвать действие из подгружаемого SWF.

либо делать устаревшими методами....

john
29.03.2002, 01:23
Смешное решение, но что то в этом есть :)





a = new Sound();
a.onLoad = function()
{
trace(this.getBytesLoaded());
myMovie_mc.loadMovie("load.jpg");
delete this;
};
a.loadSound("load.jpg");



сейчас смувиками попробую

john
29.03.2002, 02:35
немного оформилась идея, вот что могу предложить,

создаем некий объект который загружает данные (SWF, JPG или MP3), кеширует данные, которы после загрузки можно уже использовать.

работа основывется на использовании объекта Sound.
ему как показала практика что загрузать, стрим он и есть стрим.

название Image взял из JS как бы понятно. Удобнее чем пользовать Preloader например


//-------------------------------------------------------------------------
// создание класса image
//-------------------------------------------------------------------------
_global.Image = function(src)
{
this.data = new Sound();
this.data.root = this;
if (src != undefined) {
this.tmp_interval = setInterval(this,"load",20,src)// это чтобы успеть создать эвент onLoad
}
};
Image.prototype.load = function(src)
{
clearInterval(this.tmp_interval);

this.data.onLoad = function()
{
this.root.onLoad();
};
this.data.loadSound(src);
};
Image.prototype.getBytesLoaded = function()
{
return this.data.getBytesLoaded();
};
Image.prototype.getBytesTotal = function()
{
return this.data.getBytesTotal();
};
ASSetPropFlags(_global, "Image", 7);
//-------------------------------------------------------------------------
// использование 1
//-------------------------------------------------------------------------
img = new Image("load.jpg");
img.onLoad = function()
{
myMovie_mc.loadMovie("load.jpg");
};
//-------------------------------------------------------------------------
// использование 2
//-------------------------------------------------------------------------
img = new Image();
img.onLoad = function()
{
myMovie_mc.loadMovie("load.jpg");
};
img.load("load.jpg")



вот такие дела :)

john
29.03.2002, 04:29
Вот это я думаю это уже окончательный релиз :D




//*************************************************************************
//-------------------------------------------------------------------------
// class image
//-------------------------------------------------------------------------
_global.Image = function(src,mc)
{
this._targetMovie = mc;
this.data = new Sound();
this.data.root = this;
if (src != undefined)
{
this.tmp_interval = setInterval(this,"load",20,src)// for onLoad creat
}
}
Image.prototype.load = function(src,mc)
{
clearInterval(this.tmp_interval);

this._targetMovie = mc||this._targetMovie;
this._src = src;

this.data.onLoad = function()
{
this.root.onLoad();
}
this.data.loadSound(src);
}
Image.prototype.getBytesLoaded = function()
{
return this.data.getBytesLoaded();
}
Image.prototype.getBytesTotal = function()
{
return this.data.getBytesTotal();
}
Image.prototype.onLoad = function()
{
if(this._targetMovie != undefined )this._targetMovie.loadMovie(this._src);
}

Image.prototype.addProperty("src",function()
{
return this._src;
},Image.prototype.load)

ASSetPropFlags(_global, "Image", 7);

//*************************************************************************
//-------------------------------------------------------------------------
// usage 1
//-------------------------------------------------------------------------
img = new Image("load.jpg");
img.onLoad = function()
{
myMovie_mc.loadMovie("load.jpg");
}
//-------------------------------------------------------------------------
// usage 2
//-------------------------------------------------------------------------
img = new Image();
img.onLoad = function()
{
myMovie_mc.loadMovie("load.jpg");
}
img.load("load.jpg")
//-------------------------------------------------------------------------
// usage 3
//-------------------------------------------------------------------------
img = new Image();
img.onLoad = function()
{
myMovie_mc.loadMovie("load.jpg");
}
img.src = "load.jpg";
//-------------------------------------------------------------------------
// usage 4
//-------------------------------------------------------------------------
img = new Image();
img.load("load.jpg",myMovie_mc);
//-------------------------------------------------------------------------
// usage 5
//-------------------------------------------------------------------------
img = new Image("load.jpg",myMovie_mc);

john
29.03.2002, 05:52
вот пример загрузки картинки (JPG),

http://www.3wgraphics.net/tmp/load/test_load.html

SWF то же самое, лень выкладывать пример.

john
29.03.2002, 16:06
ну как?

Baltika
29.03.2002, 19:06
мудрено
%)