Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Проблема с duplicateMovieClip (http://www.flasher.ru/forum/showthread.php?t=108680)

eXplozive 26.02.2008 19:21

Проблема с duplicateMovieClip
 
Вот такой вопрос назрел:

Напрмер есть такой код:

Код:

_root.myMc.loadMovie("thumb2.jpg");
спустя какое-то время (изображение уже подгружено) пытаюсь сделать следующее:

Код:

_root.myMc.duplicateMovieClip("newMc", 100, {_x:100, _y:100});
но не подгруженное изображение не копируется ... в чем проблема ?

iNils 26.02.2008 19:56

Из хелпа
Цитата:

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

Цитата:

Сообщение от eXplozive
iNils - спасибо... а есть ли какой-то выход из данной ситуации ?

И этот выход зовется кэш.

eXplozive 27.02.2008 00:15

chingachgoog - в моем случае при медленном соединении с интернетом создается некая пауза (которая не допустима) при вынимания изображения из кеша (

CrazyFlasher 27.02.2008 00:17

так вам же написали: BitmapData юзать

chingachgoog 27.02.2008 00:28

Цитата:

Сообщение от eXplozive
chingachgoog - в моем случае при медленном соединении с интернетом создается некая пауза (которая не допустима) при вынимания изображения из кеша (

Странно. Разве скорость вынимания из кэша зависит от скорости соединения интернета?

Впрочем, если речь о дублировании мувика-изображения (не интерактивного), то можно пойти и частным путем - через битмапдату.
Но с общим случаем - через лоад из кэша - тоже не должно быть проблем.

iNils 27.02.2008 00:41

Цитата:

Сообщение от chingachgoog
Но с общим случаем - через лоад из кэша - тоже не должно быть проблем.

Одна проблема есть. Каждый раз приходится использовать событие о загрузке, поэтому BitmapData предпочтительнее.

chingachgoog 27.02.2008 01:16

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

iNils 27.02.2008 01:34

Код пишется в течении 5 минут. Трудности с масштабированием возможно у вас и есть, а у других их нет, так как поведение загруженной картинки и приаттаченной, идентично.
Когда автору захочется грузить что-то кроме картинок, он пойдет другим путем.

chingachgoog 27.02.2008 02:16

Цитата:

Сообщение от iNils
Код пишется в течении 5 минут.

Вот это и скверно. Лоад пишется на порядок быстрее.

Цитата:

Сообщение от iNils
Трудности с масштабированием возможно у вас и есть, а у других их нет, так как поведение загруженной картинки и приаттаченной, идентично.

Возможно. А возможно я найду старый пример, где поведение кардинально разнится.

Molecula 27.02.2008 02:28

Автор не может продублировать подгруженные картинки, ему по любому нужно будет юзать Bitmap.draw();
В любом случае, у нас есть функция загрузки изображения и функция отрисовки объекта.

iNils 27.02.2008 02:49

Цитата:

Сообщение от chingachgoog
Вот это и скверно. Лоад пишется на порядок быстрее.

Я не буду вас переубеждать. :) Раз вы не знаете, что одно из преимуществ классов в том, что написав его один раз и потратив на это 5 минут, вы можете потом его использовать значительно экономя на этом время.

iNils 27.02.2008 11:07

К вопросу о чтении из кеша. Случайно заметил, что HTTPwatch может показывать время ушедшие на чтение файла. На картинки это хорошо видно.
http://www.httpwatch.com/images/ebay.png

Olegg 27.02.2008 11:29

опа,круто!

kio21 11.07.2008 23:50

Всем привет! Не стал создавать новую ветку, так как первоначальная проблема была та же самая, что и здесь. Но! Попробовал предлагаемое здесь решение - ничего не выходит, почему то рисуется белый клип, т.е. методом 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?

kio21 13.07.2008 00:19

Хорошо. напишу чуть поподробнее:
Код:

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;
};
//вместо картинки вижу белый прямоугольник тех же размеров, что и загруженная картинка :-(


iNils 13.07.2008 10:24

Цитата:

//в 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, хотя это не приципиально.

scarbo 13.07.2008 11:06

kio21 я вот выложил в инет и у меня все отображается,но только почему то в отстойном качестве,вот гляньте:пример для kio21,а вот ссылка на саму фотку,качество сравните:образец
Почему так выходит?
Кстати вот сам код:
Код:

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;
};
//вместо картинки вижу белый прямоугольник тех же размеров, что и загруженная картинка :-(


iNils 13.07.2008 11:10

Цитата:

Сообщение от scarbo (Сообщение 751762)
но только почему то в отстойном качестве

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

scarbo 13.07.2008 11:28

Ах,ну да,там же "noScale" не стоит.
Ага,теперь порядок.
Так что же у kio21 не получалось???

Alex_beginner 13.07.2008 11:40

scarbo! Я думаю дело в политике безопасности. А Вы?

scarbo 13.07.2008 11:44

Я думаю ,что он не ставит кавычки,когда фотку грузит,у меня стоит:
Код:

mcl.loadClip ("1.jpg", mc);
,а у него
Код:

mcl.loadClip (bannerpic0, mc);
.Так что не знаю,потому что код,который висит постом выше полностью работоспособный,можете убедиться.Во всяком случае на by.ru это работает

Alex_beginner 13.07.2008 11:48

А вдруг bannerpic0 пременная типа String и путь он туды прописал!!
Нееее! Тут че то в другом дело наверно.
Давайте предложим ему использовать Ваш код на своем домене - посмотрим что выйдет. Если не пойдет значить политика...

scarbo 13.07.2008 11:54

Что bannerpic0-это String,он уже сам написал,он говорит,что
Цитата:

//в html-ке для переменной bannerpic0 задан путь к картинке
,вот это и настораживает.Может лучше не париться,а адрес в Swf указывать,ну хотя бы для пробы,пусть у себя на сервере попробует и на отпишет

Alex_beginner 13.07.2008 11:59

Вот вот это то я и имел ввиду. Вообщем пусть пробует.

kio21 13.07.2008 22:30

Цитата:

Сообщение от iNils (Сообщение 751758)
Какой именно путь?

В теге object пишу:
Код:

<param name="flashvars" value="bannerpic0=http://phpserver/photos/bannerpic0.jpg" />
В теге EMBDED:
Код:

flashvars="bannerpic0=http://phpserver/photos/bannerpic0.jpg"
p.s. http://phpserver - адрес моего сервака (у меня тут Denwer стоит), так что не пытайтесь найти эту картинку в сети)

Цитата:

Сообщение от Alex_beginner (Сообщение 751760)
Здравствуйте 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;
};

без изменений.

Цитата:

Сообщение от scarbo (Сообщение 751762)
kio21 я вот выложил в инет и у меня все отображается,но только почему то в отстойном качестве,вот гляньте:пример для kio21,а вот ссылка на саму фотку,качество сравните:образец
Почему так выходит?
Кстати вот сам код:
Код:

...

Подставил себе во флэшку вашу картинку (чем черт не шутит) - то же самое - дублируется белый прямоугольник.

Цитата:

Сообщение от Alex_beginner (Сообщение 751769)
А вдруг bannerpic0 пременная типа String и путь он туды прописал!!
Нееее! Тут че то в другом дело наверно.
Давайте предложим ему использовать Ваш код на своем домене - посмотрим что выйдет. Если не пойдет значить политика...

В общем попробовал картинку от scarbo и еще одну свою http://kio.gorodok.net/ticket.jpg :-) Везде не дублируется. Политика говорите... надо глянуть.

iNils 14.07.2008 00:01

kio21, надо использовать кнопку http://www.flasher.ru/forum/images/r...ttons/edit.gif, а не создавать несколько сообщений подряд.


Цитата:

Сообщение от kio21 (Сообщение 751883)
Код:

"bannerpic0=http://phpserver/photos/bannerpic0.jpg"
p.s. http://phpserver - адрес моего сервака (у меня тут Denwer стоит), так что не пытайтесь найти эту картинку в сети)

А заходите по www.phpserver? Метод draw работате только с изображениями загруженных с того же домена, что и swf. А для флеша www.abc и abc являются разными доменами. Поэтому возникает вопрос, зачем указывать абсолютный адрес для картинок с одного домена с флешкой?

kio21 14.07.2008 00:58

Цитата:

Сообщение от iNils (Сообщение 751894)
kio21, надо использовать кнопку http://www.flasher.ru/forum/images/r...ttons/edit.gif, а не создавать несколько сообщений подряд.

Понял.
Цитата:

Сообщение от iNils (Сообщение 751894)
А заходите по www.phpserver? Метод draw работате только с изображениями загруженных с того же домена, что и swf. А для флеша www.abc и abc являются разными доменами. Поэтому возникает вопрос, зачем указывать абсолютный адрес для картинок с одного домена с флешкой?

Да, вы правы грузился немножко не оттуда (флэшку запускал локально %) ), щас туда все закинул - ура, заработало!!!
И еще вопрос тогда последний)
Цитата:

Сообщение от iNils (Сообщение 751894)
Метод draw работате только с изображениями загруженных с того же домена, что и swf.

И обойти это никак нельзя? Вдруг когда-нибудь понадобится... Сейчас попробовал System.security.allowDomain(""); - не спасает.

iNils 14.07.2008 01:03

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

kio21 14.07.2008 20:37

Цитата:

Сообщение от iNils (Сообщение 751899)
Единственный способ, что приходит в голову, это размещать в своем домене php файл, который будет тянуть указанную картинку с другого домена и передавать ее флешу.
Хотя странно, загрузить картинку мы разрешение получили, а работать с ней - нет.

Понятно. Не говорите, я тоже раньше считал, что это тривиальная задача %)

chingachgoog 15.07.2008 14:33

Цитата:

Сообщение от iNils (Сообщение 751894)
Метод draw работате только с изображениями загруженных с того же домена, что и swf.

А где про это написано?
И к чему это относится: только к методу draw или вообще к работе с BitmapData?

Цитата:

Сообщение от iNils
Хотя странно, загрузить картинку мы разрешение получили, а работать с ней - нет.

Да, еще одна подлянка от флеша...
А что, обмануть никак нельзя?

etc 15.07.2008 14:56

Цитата:

Сообщение от chingachgoog (Сообщение 752133)
Да, еще одна подлянка от флеша...
А что, обмануть никак нельзя?

Нельзя.

Вообще, странного ничего не вижу, если не ошибаюсь, в семерке внешние картинки с удаленных доменов вообще нельзя было грузить. А так сделали возможность, как в html, показывать удаленные картинки.

Кроссдоменная политика работает и в JavaScript, кстати.


Часовой пояс GMT +4, время: 10:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.