PDA

Просмотр полной версии : Загрузка картинки *.jpg не всегда срабатывает((


Andrew_J
24.06.2007, 20:13
Делаю дублированием 7 мувиков и внутрь их загружаю по одной картинки, картинки разные. Так вот случаются моменты, что из 7 загружаются только 6, причем все события отрабатывают, флеш говрит что всё загружено, а картинки нету((

Уже пробовал грузить и через LoadClip и LoadMovie, всё равно результат один.
Подскажите как обнаружить то что картинка не загрузилась или как всё же правильно загрузить её, если я что не так делаю.

Приведу код:
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
trace("goodload");
};
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener(mclListener);
mcLoader.loadClip(FotoPath[i-1],eval(bn).foto);

BigDan
24.06.2007, 20:21
my_mcl.onLoadError = function....

Andrew_J
24.06.2007, 20:31
Только что проверил, примерно с 10 попытки сработал этот глюк, но как ни странно событие my_mcl.onLoadError не сработало((
Что это может быть ещё?

Ещё бывает после проигрывания звука не срабатывает событие _root.my_sound.onSoundComplete = function(){}
Что вообще с этим флешем такое, хочет работает хочет нет...
Думал CS3 будет меньше глючить, а разницы нет как оказалось

etc
24.06.2007, 20:45
Думал CS3 будет меньше глючить, а разницы нет как оказалось
Ну да, только если писать под AS3.

Andrew_J
24.06.2007, 21:14
А как быть тогда, я только смог в onClipEvent (load) отследить widh = 0 и heigh = 0, а дальше что, непонятно... попробывать загрузить снова?

BigDan
24.06.2007, 21:22
чтоб узнать width, height надо юзать не onLoadComplete,а onLoadInit(после этого события мы можем свободно работать со свойствами объекта).

Andrew_J
24.06.2007, 21:58
BigDan, если вы посмотрите выше, то там и написано как раз
mclListener.onLoadInit = function(target_mc:MovieClip) {
trace("- w="+eval(bn).foto._width+" h="+eval(bn).foto._height);
};
Однако этот трейс выводит размер мувика вместо которого грузится картинка, а размер картинки не известен в это время ещё.
А событие onClipEvent (load) на этом мувике уже показывает размер загруженной картинки.

Kikasso
24.06.2007, 22:18
mclListener.onLoadInit = function(target_mc:MovieClip) {
trace("w="+target_mc._width+" h="+target_mc._height);
};
Откуда вы этот eval берете? Что, по-нормальному не обратиться? И этот onClipEvent..

Andrew_J
24.06.2007, 22:27
eval нужен для обращения к мувику, bn = "fotos"+i; т.е. получается eval(bn).foto._height = fotos1.foto._height и т.д. для других значений i.

Приведу код поподробней, если есть сомения какието
for (var i = 1; i<=7; i++) {
bn = "fotos"+i;
duplicateMovieClip("fotos", bn, i);
setProperty(bn, _x, sxx+Math.random()*sdx);
setProperty(bn, _y, syy+Math.random()*sdy);
setProperty(bn, _rotation, ygol-Math.random()*ygol*2);
}

for (var i = 1; i<=7; i++) {
bn = "fotos"+i;
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
trace("- w="+eval(bn).foto._width+" h="+eval(bn).foto._height+" i="+i);
};
mclListener.onLoadError = function(target_mc:MovieClip) {
trace("________ERROR_________");
};
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener(mclListener);
mcLoader.loadClip(FotoPath[i-1],eval(bn).foto);//FotoPath[i-1] массив с путями до картинок
}

Kikasso
24.06.2007, 22:44
У вас bn не меняется. И как вы думаете, для чего в листенере target_mc?

mclListener.onLoadInit = function(target_mc:MovieClip) {
trace('-----------');
trace('bn=' + bn + '\n');

trace('target_mc=' + target_mc + '\n');
trace("w="+target_mc._width+" h="+target_mc._height);
};

DuplicateMovieClip - это источник неприятных глюков. setProperty это вообще без комментариев.

Andrew_J
25.06.2007, 00:36
О, извиняюсь, про bn я не догадался что он там не меняется. Я вообщето таким способом подгрузки картинок никогда не пользовался, поэтому не знаю ещё всех тонкостей. Обычно грузил через LoadMovie и следил за событием OnLoad, что впринципе тоже самое.
А за подсказку про target_mc спасибо, очень полезно.

> DuplicateMovieClip - это источник неприятных глюков. setProperty это вообще без комментариев.
А что посоветуете нормальное вместо этого? Просто давно этим пользуюсь, всегда устраивало.

iNils
25.06.2007, 01:25
Вместо
setProperty(bn, _x, sxx+Math.random()*sdx);
сейчас пишут
bn._x = sxx+Math.random () * sdx
Дубликатом никогда не пользовался, удобнее attachMovie.

Kikasso
25.06.2007, 02:01
Ну а вместо eval('btn123') стоит писать
this['btn12'+3], _parent['btn1'+23], mc1.mc2['btn'+123].bg._x
Примерно в таком духе.

Andrew_J
25.06.2007, 22:33
Вместо
setProperty(bn, _x, sxx+Math.random()*sdx);
сейчас пишут
bn._x = sxx+Math.random () * sdx
Ок, буду так писать, если это грамотней.
Дубликатом никогда не пользовался, удобнее attachMovie.
Дупликат хорош тем, что позволяет дублировать объект вместе с экшн скриптом на него назначенным, в то время как аттач кидает клип из библиотеки совершенно голый, только то что внутри клипа есть, то и остаётся :(

Ну а вместо eval('btn123') стоит писать
this['btn12'+3], _parent['btn1'+23], mc1.mc2['btn'+123].bg._x
Примерно в таком духе.
Эту конструкцию позаимствовал из флешевых исходников, вроде бы удобно.

Andrew_J
25.06.2007, 23:29
Всё переделал как вы просили, получилось так:
for (var i = 1; i<=numfot; i++) {
bn = "fotos"+i;
this.attachMovie("fotos",bn,this.getNextHighestDepth(),{_x:(sxx+Math.random()*sdx), _y:(syy+Math.random()*sdy), _rotation:(ygol-Math.random()*ygol*2)});
}

for (var i = 1; i<=numfot; i++) {
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
trace("-----------------");
trace("- w="+target_mc._width+" h="+target_mc._height+" target_mc="+target_mc);
if (target_mc._width == 0) {
trace("-->________ERROR_________");
}
_parent.target_mc.but_fot._x = target_mc._x;
_parent.target_mc.but_fot._y = target_mc._y;
_parent.target_mc.but_fot._width = target_mc._width;
_parent.target_mc.but_fot._height = target_mc._height;
};
mclListener.onLoadError = function(target_mc:MovieClip) {
trace("________ERROR_________");
};
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener(mclListener);
mcLoader.loadClip(FotoPath[i-1],_root['fotos'+i].foto);
}

В итоге я уже подумал всё работает, как вдруг после 5 минутного тестирования снова не загрузилась одна картинка, вот лог
-----------------
- w=191.65 h=222 target_mc=_level0.fotos7.foto
-----------------
- w=190.3 h=222 target_mc=_level0.fotos6.foto
-----------------
- w=0 h=0 target_mc=_level0.fotos5.foto
-->________ERROR_________
-----------------
- w=192 h=221.65 target_mc=_level0.fotos4.foto
-----------------
- w=190.7 h=222 target_mc=_level0.fotos3.foto
-----------------
- w=190.85 h=222 target_mc=_level0.fotos2.foto
-----------------
- w=190 h=222 target_mc=_level0.fotos1.foto

Всё делалось в руте, поэтому this=_root, эхх :( а как вызвать повтор загрузки этой картинки в этот мувик если target_mc._width = 0, ведь индекс же нам неизвестен..?

iNils
26.06.2007, 02:05
Дупликат хорош тем, что позволяет дублировать объект вместе с экшн скриптом на него назначенным, в то время как аттач кидает клип из библиотеки совершенно голый, только то что внутри клипа есть, то и остаётся :(

Эту конструкцию позаимствовал из флешевых исходников, вроде бы удобно.
1. Это лишь говорит о вашем стиле программирования. И говорит ничего хорошего.
2. Этим исходикам уже не одна тысяча лет, они не актуальны и сбивают с толку тех кто в них верит. И если вы хотите получать помощь быстрее и лучше, то вам стоит прислушываться к советам которые тут дают. Я вот уже почти игнорирую вопросы с синтаксисом до 6 плера.

Andrew_J
27.06.2007, 23:52
Спасибо за советы, стараюсь прислушиваться к дельным из них. А стиль программирования действительно не лучший, потихоньку меняю его.
Спасибо за понимание.