Просмотр полной версии : Проблема с duplicateMovieClip
eXplozive
26.02.2008, 19:21
Вот такой вопрос назрел:
Напрмер есть такой код:
_root.myMc.loadMovie("thumb2.jpg");
спустя какое-то время (изображение уже подгружено) пытаюсь сделать следующее:
_root.myMc.duplicateMovieClip("newMc", 100, {_x:100, _y:100});
но не подгруженное изображение не копируется ... в чем проблема ?
Из хелпа
If you used MovieClip.loadMovie() or the MovieClipLoader class to load a movie clip, the contents of the SWF file are not duplicated.
DimasMain
26.02.2008, 19:57
Может "newMc" нужно явно размер задать ... Возможно поможет
eXplozive
26.02.2008, 20:09
iNils - спасибо... а есть ли какой-то выход из данной ситуации ?
DarkLight
26.02.2008, 20:15
Для Flash 8 - BitmapData.draw
chingachgoog
26.02.2008, 20:35
iNils - спасибо... а есть ли какой-то выход из данной ситуации ?
И этот выход зовется кэш.
eXplozive
27.02.2008, 00:15
chingachgoog - в моем случае при медленном соединении с интернетом создается некая пауза (которая не допустима) при вынимания изображения из кеша (
CrazyFlasher
27.02.2008, 00:17
так вам же написали: BitmapData юзать
chingachgoog
27.02.2008, 00:28
chingachgoog - в моем случае при медленном соединении с интернетом создается некая пауза (которая не допустима) при вынимания изображения из кеша (
Странно. Разве скорость вынимания из кэша зависит от скорости соединения интернета?
Впрочем, если речь о дублировании мувика-изображения (не интерактивного), то можно пойти и частным путем - через битмапдату.
Но с общим случаем - через лоад из кэша - тоже не должно быть проблем.
Но с общим случаем - через лоад из кэша - тоже не должно быть проблем.Одна проблема есть. Каждый раз приходится использовать событие о загрузке, поэтому BitmapData предпочтительнее.
chingachgoog
27.02.2008, 01:16
в данном случае битмапдата может и оптимальнее (не считая огромный код по ее созданию и трудности с масштабированием), но как только автор захочет грузить не только картинки, то ничего не останется как грузить из кэша.
Код пишется в течении 5 минут. Трудности с масштабированием возможно у вас и есть, а у других их нет, так как поведение загруженной картинки и приаттаченной, идентично.
Когда автору захочется грузить что-то кроме картинок, он пойдет другим путем.
chingachgoog
27.02.2008, 02:16
Код пишется в течении 5 минут.
Вот это и скверно. Лоад пишется на порядок быстрее.
Трудности с масштабированием возможно у вас и есть, а у других их нет, так как поведение загруженной картинки и приаттаченной, идентично.
Возможно. А возможно я найду старый пример, где поведение кардинально разнится.
Molecula
27.02.2008, 02:28
Автор не может продублировать подгруженные картинки, ему по любому нужно будет юзать Bitmap.draw();
В любом случае, у нас есть функция загрузки изображения и функция отрисовки объекта.
Вот это и скверно. Лоад пишется на порядок быстрее.Я не буду вас переубеждать. :) Раз вы не знаете, что одно из преимуществ классов в том, что написав его один раз и потратив на это 5 минут, вы можете потом его использовать значительно экономя на этом время.
К вопросу о чтении из кеша. Случайно заметил, что HTTPwatch может показывать время ушедшие на чтение файла. На картинки это хорошо видно.
http://www.httpwatch.com/images/ebay.png
Всем привет! Не стал создавать новую ветку, так как первоначальная проблема была та же самая, что и здесь. Но! Попробовал предлагаемое здесь решение - ничего не выходит, почему то рисуется белый клип, т.е. методом draw ничего не копируется!! Народ, need help!
Теперь постараюсь рассказать все немного подробнее. Опишу кратко, но думаю, суть проблемы.
В общем по началу, картинки лежали на винте рядом с флэшкой. На событие OnLoadError слушающего клипа bigbanners (куда все загружалось) вешаю (т.е. выполняется когда ве загрузилось):
_root.bigbanners.onLoadError = function () {
mcBmp = new BitmapData(loadedBanner._width, loadedBanner._height);
mcBmp.draw(loadedBanner, new Matrix());
var mc:MovieClip = _root.createEmptyMovieClip("copy_mc", 0);
mc.attachBitmap(mcBmp, 1);
//через такое временное динамическое текстовое поле повыводил все что было можно, все показания в норме. все слои впорядке, мувиклипы прозваниваются...
_root.tablo.text = mc;
};
предварительно все нужные библиотеки подгрузил:
import flash.display.BitmapData;
import flash.geom.Matrix;
В общем, когда картинки лежмли на винте, все работало. Когда я их закинул в инет, блин изображение не копируется - ничего не видать! (во flashvars все нормально, точно, просто там много еще чего грузится без проблем) Короче картинки во флэшку загружаются, я их вижу, но продублировать не получается... Подправил только загрузку вроде, больше ничего не трогал. Не знаю уже что делать...
Alex_beginner
12.07.2008, 17:44
Здравствуйте kio21!
Теперь постараюсь рассказать все немного подробнее. Опишу кратко, но думаю, суть проблемы.:D:D
Сказано очень оригинально и острумно. Но не будем отвлекаться.
Необходимо уточнить несколько вопросов:
1. В коде что такое loadedBanner?
2. Покажите как инициализируется loadedBanner?
3. Почему код написан в onLoadError?
Хорошо. напишу чуть поподробнее:
import flash.display.BitmapData;
import flash.geom.Matrix;
var mcl:MovieClipLoader = new MovieClipLoader ();
mcl.addListener (_root);
var mc:MovieClip = _root.createEmptyMovieClip ("loadedBanner", _root.getNextHighestDepth());
//в html-ке для переменной bannerpic0 задан путь к картинке
mcl.loadClip (bannerpic0, mc);
//картинку после загрузки вижу!
//если же вместо строчки "mcl.loadClip (bannerpic0, mc);" написать
//mcl.loadClip ("bannerpic0.jpg", mc);
//т.е. начать грузить картинку с винта, рядом с флэшкой
//то все заработает, с помощью того же механизма дублирования!!
//после ее успешной загрузки, пытаюсь продублировать
_root.onLoadInit = function () {
mcBmp = new BitmapData(_root.loadedBanner._width, _root.loadedBanner._height);
mcBmp.draw(_root.loadedBanner, new Matrix());
var mc1:MovieClip = _root.createEmptyMovieClip("copy_mc", _root.getNextHighestDepth());
mc1.attachBitmap(mcBmp, 0);
mc1._x+=100;
mc1._y+=100;
};
//вместо картинки вижу белый прямоугольник тех же размеров, что и загруженная картинка :-(
//в html-ке для переменной bannerpic0 задан путь к картинкеКакой именно путь?
Alex_beginner
13.07.2008, 10:54
Здравствуйте kio21!
Проаналилизовав Ваш код, сразу же возникает ряд вопросов:
1. Переменная bannerpic0 имеет тип String?
2. Эта переменная содержить полный путь к файлу, т.е. с указанием протокола итд
(выдержка из хелпа:Absolute URLs must include the protocol reference, such as http:// or file:///.)
3. Также возможной причиной может быть политика безопасности (см. allowDomain).
4. Белый прямоугольник Вы видите потому, что методом draw ничего небыло скопировано на созданную битмапдату . Отсюда ясно видно, что проблема локализована в загрузке исходного графического изображения.
5. Попробуйте слушателем события выполнения кода первого кадра onLoadInit сделать не _root, а Object, хотя это не приципиально.
kio21 я вот выложил в инет и у меня все отображается,но только почему то в отстойном качестве,вот гляньте:пример для kio21 (http://dimandl.by.ru/%c1%e5%e7%fb%ec%ff%ed%ed%fb%e9-1.swf),а вот ссылка на саму фотку,качество сравните:образец (http://dimandl.by.ru/1.jpg)
Почему так выходит?
Кстати вот сам код:Stage.scaleMode = "noScale";
_root._quality = "Best";
import flash.display.BitmapData;
import flash.geom.Matrix;
var mcl:MovieClipLoader = new MovieClipLoader ();
mcl.addListener (_root);
var mc:MovieClip = _root.createEmptyMovieClip ("loadedBanner", _root.getNextHighestDepth());
//в html-ке для переменной bannerpic0 задан путь к картинке
mcl.loadClip ("1.jpg", mc);
//картинку после загрузки вижу!
//если же вместо строчки "mcl.loadClip (bannerpic0, mc);" написать
//mcl.loadClip ("bannerpic0.jpg", mc);
//т.е. начать грузить картинку с винта, рядом с флэшкой
//то все заработает, с помощью того же механизма дублирования!!
//после ее успешной загрузки, пытаюсь продублировать
_root.onLoadInit = function () {
mcBmp = new BitmapData(_root.loadedBanner._width, _root.loadedBanner._height);
mcBmp.draw(_root.loadedBanner, new Matrix());
var mc1:MovieClip = _root.createEmptyMovieClip("copy_mc", _root.getNextHighestDepth());
mc1.attachBitmap(mcBmp, 0);
mc1._x+=100;
mc1._y+=100;
};
//вместо картинки вижу белый прямоугольник тех же размеров, что и загруженная картинка :-(
но только почему то в отстойном качествеКачество тоже самое, просто swf расползся на весь экран, и картинка вместе с ним.
Ах,ну да,там же "noScale" не стоит.
Ага,теперь порядок.
Так что же у kio21 не получалось???
Alex_beginner
13.07.2008, 11:40
scarbo! Я думаю дело в политике безопасности. А Вы?
Я думаю ,что он не ставит кавычки,когда фотку грузит,у меня стоит:mcl.loadClip ("1.jpg", mc);,а у негоmcl.loadClip (bannerpic0, mc);.Так что не знаю,потому что код,который висит постом выше полностью работоспособный,можете убедиться.Во всяком случае на by.ru это работает
Alex_beginner
13.07.2008, 11:48
А вдруг bannerpic0 пременная типа String и путь он туды прописал!!
Нееее! Тут че то в другом дело наверно.
Давайте предложим ему использовать Ваш код на своем домене - посмотрим что выйдет. Если не пойдет значить политика...
Что bannerpic0-это String,он уже сам написал,он говорит,что //в html-ке для переменной bannerpic0 задан путь к картинке ,вот это и настораживает.Может лучше не париться,а адрес в Swf указывать,ну хотя бы для пробы,пусть у себя на сервере попробует и на отпишет
Alex_beginner
13.07.2008, 11:59
Вот вот это то я и имел ввиду. Вообщем пусть пробует.
Какой именно путь?
В теге object пишу:
<param name="flashvars" value="bannerpic0=http://phpserver/photos/bannerpic0.jpg" />
В теге EMBDED:
flashvars="bannerpic0=http://phpserver/photos/bannerpic0.jpg"
p.s. http://phpserver - адрес моего сервака (у меня тут Denwer стоит), так что не пытайтесь найти эту картинку в сети)
Здравствуйте kio21!
Проаналилизовав Ваш код, сразу же возникает ряд вопросов:
1. Переменная bannerpic0 имеет тип String?
2. Эта переменная содержить полный путь к файлу, т.е. с указанием протокола итд
(выдержка из хелпа:)
3. Также возможной причиной может быть политика безопасности (см. allowDomain).
4. Белый прямоугольник Вы видите потому, что методом draw ничего небыло скопировано на созданную битмапдату . Отсюда ясно видно, что проблема локализована в загрузке исходного графического изображения.
5. Попробуйте слушателем события выполнения кода первого кадра onLoadInit сделать не _root, а Object, хотя это не приципиально.
1, 2 - думаю, предыдущим постом я прояснил ситуацию... Но что удивительно, если во влэшке задать эту строку
var bannerpic0:String ="http://phpserver/photos/bannerpic0.jpg";
(flashvars при этом удалить), то все заработает - картинка будет грузиться и дублироваться %) Простое объевление же (вдруг) var bannerpic0:String; (flashvars поставил обратно) ситуацию не спасает.
3. пока тут ничего сказать не могу, как-то с этим никогда не заморачивался...
4. Первое предложение - ну да, скорее всего, вопрос почему) Второе предложение - Даже если само загруженное изображение я прекрасно вижу? это почему? Тут почему-то флэш различает - гружу ли я картинку с инета, или из локального файла... - в обоих случаях изображение грузится и я его вижу, а вот дублируется только во втором. Хотя с учетом пунктов 1 и 2 добавился еще один вариант, когда путь картинки из инета прописан в самой флэшке - по результату вариант аналогичен второму.
5. Сделал:
import flash.display.BitmapData;
import flash.geom.Matrix;
var mcl:MovieClipLoader = new MovieClipLoader ();
var listener:Object = {};
mcl.addListener (listener);
var mc:MovieClip = _root.createEmptyMovieClip ("loadedBanner", _root.getNextHighestDepth());
mcl.loadClip (bannerpic0, mc);
listener.onLoadInit = function () {
mcBmp = new BitmapData(_root.loadedBanner._width, _root.loadedBanner._height);
mcBmp.draw(_root.loadedBanner, new Matrix());
var mc1:MovieClip = _root.createEmptyMovieClip("copy_mc", _root.getNextHighestDepth());
mc1.attachBitmap(mcBmp, 0);
mc1._x+=100;
mc1._y+=100;
};
без изменений.
kio21 я вот выложил в инет и у меня все отображается,но только почему то в отстойном качестве,вот гляньте:пример для kio21 (http://dimandl.by.ru/%c1%e5%e7%fb%ec%ff%ed%ed%fb%e9-1.swf),а вот ссылка на саму фотку,качество сравните:образец (http://dimandl.by.ru/1.jpg)
Почему так выходит?
Кстати вот сам код:...
Подставил себе во флэшку вашу картинку (чем черт не шутит) - то же самое - дублируется белый прямоугольник.
А вдруг bannerpic0 пременная типа String и путь он туды прописал!!
Нееее! Тут че то в другом дело наверно.
Давайте предложим ему использовать Ваш код на своем домене - посмотрим что выйдет. Если не пойдет значить политика...
В общем попробовал картинку от scarbo и еще одну свою http://kio.gorodok.net/ticket.jpg :-) Везде не дублируется. Политика говорите... надо глянуть.
kio21, надо использовать кнопку http://www.flasher.ru/forum/images/russian/style3/buttons/edit.gif, а не создавать несколько сообщений подряд.
"bannerpic0=http://phpserver/photos/bannerpic0.jpg"
p.s. http://phpserver - адрес моего сервака (у меня тут Denwer стоит), так что не пытайтесь найти эту картинку в сети)А заходите по www.phpserver? Метод draw работате только с изображениями загруженных с того же домена, что и swf. А для флеша www.abc и abc являются разными доменами. Поэтому возникает вопрос, зачем указывать абсолютный адрес для картинок с одного домена с флешкой?
kio21, надо использовать кнопку http://www.flasher.ru/forum/images/russian/style3/buttons/edit.gif, а не создавать несколько сообщений подряд.
Понял.
А заходите по www.phpserver? Метод draw работате только с изображениями загруженных с того же домена, что и swf. А для флеша www.abc и abc являются разными доменами. Поэтому возникает вопрос, зачем указывать абсолютный адрес для картинок с одного домена с флешкой?
Да, вы правы грузился немножко не оттуда (флэшку запускал локально %) ), щас туда все закинул - ура, заработало!!!
И еще вопрос тогда последний)
Метод draw работате только с изображениями загруженных с того же домена, что и swf.
И обойти это никак нельзя? Вдруг когда-нибудь понадобится... Сейчас попробовал System.security.allowDomain(""); - не спасает.
Единственный способ, что приходит в голову, это размещать в своем домене php файл, который будет тянуть указанную картинку с другого домена и передавать ее флешу.
Хотя странно, загрузить картинку мы разрешение получили, а работать с ней - нет.
Единственный способ, что приходит в голову, это размещать в своем домене php файл, который будет тянуть указанную картинку с другого домена и передавать ее флешу.
Хотя странно, загрузить картинку мы разрешение получили, а работать с ней - нет.
Понятно. Не говорите, я тоже раньше считал, что это тривиальная задача %)
chingachgoog
15.07.2008, 14:33
Метод draw работате только с изображениями загруженных с того же домена, что и swf.
А где про это написано?
И к чему это относится: только к методу draw или вообще к работе с BitmapData?
Хотя странно, загрузить картинку мы разрешение получили, а работать с ней - нет.
Да, еще одна подлянка от флеша...
А что, обмануть никак нельзя?
Да, еще одна подлянка от флеша...
А что, обмануть никак нельзя?
Нельзя.
Вообще, странного ничего не вижу, если не ошибаюсь, в семерке внешние картинки с удаленных доменов вообще нельзя было грузить. А так сделали возможность, как в html, показывать удаленные картинки.
Кроссдоменная политика работает и в JavaScript, кстати.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.