PDA

Просмотр полной версии : проблема с BitmapData.draw()


Dr.OH
09.11.2007, 21:46
Есть два абсолютно идентичных сайта kalacheevsky.ru и kmkmeat.basdesign.ru. На этих идентичных сайта есть идентичные флэшки (вверху страницы). В эти флэшки грузится картинка, преобразуется в BitmapData, масштабируется и отображается. Ничего сложного. Но вот только на kmkmeat все и всегда работает, а на kalackeevsky.ru работает ровно половина. Т.е. на половине компов работает, а на половине нет. Причем если на компе все работает правильно, то это работает во всех бразуерах и на всех версиях плэера.
Теперь поконкретнее. Загрузка картинки проходит нормально, создание экземпляра проходит нормально и присоединение его к MovieClip и отображение тоже проходит нормально. Не работает (мне кажется что именно не работает) функция draw.
Теперь немного кода:
Грузим клип:

myListener = new Object();
var mcLoader:MovieClipLoader = new MovieClipLoader();
image_loaded = -1;

myListener.onLoadComplete = function (target_mc) {
//image_loaded = 1;
trace("my movie clip loaded to "+target_mc);
}
myListener.onLoadInit = function (target_mc) {
image_loaded = 1;
}

myListener.onLoadError = function (target_mc, errorCode) {
image_loaded = -1;
removeMovieClip(target_mc);
trace("ERROR CODE = " + errorCode);
trace("Your load failed on movie clip = " + target_mc + "\n");
}
mcLoader.addListener(myListener);

function loadImg(obj:Object) {
image_loaded = 0;
trace(obj.attributes['img']);
this.createEmptyMovieClip("temp_mc", _root.getNextHighestDepth());
temp_mc._alpha = 0;
this["bg"]._alpha = 0;
mcLoader.loadClip(obj.attributes['img'], temp_mc);
}

Потом идет прелоэдер, его код я не буду показывать... далее просто создаем bitmapData:

import flash.display.BitmapData;
mcLoader.removeListener(myListener);
delete mcLoader;
delete myListener;
if (temp_mc!=undefined && image_loaded==1) {
_root.createEmptyMovieClip("bg", bg.getDepth());
var tmpBmp:BitmapData = new BitmapData (temp_mc._width, temp_mc._height, false, 0/*color*/);
var _bmp:MovieClip = bg; //находим MovieClip, куда будет вставлена картинка
temp_mc._alpha = 50;
tmpBmp.draw(temp_mc); //отрисовываем MovieClip, в котором содержиться картинка
_bmp.attachBitmap(tmpBmp, 0, "always", true); //помещаем внутрь MovieClip
_bmp.cacheAsBitmap = true;
_bmp._x = 0;
_bmp._y = 0;
}

На выходе получаем полупрозрачную каринку поверх чёрного фона! В чем проблема???

Mnilionic
09.11.2007, 22:09
вы создаёте клип bg и помещаете его на уовень этово же bg, которого ещё не существует. Может в этом гвоздь?

var _bmp = _root.createEmptyMovieClip("bg", _root.getNextHighestDepth());

Dr.OH
09.11.2007, 22:28
эту строку я добавил в ходе тестирования и она никакой смысловой нагрузки не несёт и, к сожалению, не является причиной ошибки.
раньше на её месте было: _root.createEmptyMovieClip("bg", bg.getDepth());
а ещё раньше этой строки вообще не было. Но ни в одном из этих вариантов ничего не работало.
Да, и ещё раз хочу отметить - флэшки на обоих сайтах абсолютно одинаковые, т.е. это вообще один и тот же файл. Но на одном сайте работает, а на другом - нет :(

Molecula
09.11.2007, 23:23
Возможно тут косяк:
var tmpBmp:BitmapData = new BitmapData (temp_mc._width, temp_mc._height, false, 0/*color*/);

temp_mc._width и temp_mc._height Вы же получаете от MovieClipLoader при onLoadInit, так или нет?

Хотя, если там где-то работает, то в принципе, не тут косяк.
Может сервер отдает криво, от куда Вы получаете УРЛ картинки?
--------------
На kalacheevsky.ru не смог зайти, что бы лицезреть глюк, может не у всех 8-й плеер стоит?
------------------
Парень, лежащий в травке с ноутом и колбасой, однако :D

DarkLight
09.11.2007, 23:29
Проверьте зависимость от наличия www в адресе, draw может не работать из-за этого, т к домен с www и без www по умолчанию разные, и вступают в игру политики междоменной безопасности

Dr.OH
10.11.2007, 01:22
Molecula, вряд ли ошибка в этом. Дело в том, что если бы ошибка была в размерах, то картинка создавалась бы неправильного размера, а у неё размер правильны... да и получаю я картинку после onLoadInit...

myListener.onLoadInit = function (target_mc) {image_loaded = 1;}
...
if (temp_mc!=undefined && image_loaded==1) {...}

а почему не смог зайти на kalacheevsky?
DarkLight, а как связано draw и наличие/отсутствие www? картинка загружается нормально, она просто не обрисовывается почему-то...

Dr.OH
10.11.2007, 01:23
на всякий случай проверил - и там и там нет www. Т.е. грузятся картинки одинаковым образом.

DarkLight
10.11.2007, 01:28
DarkLight, а как связано draw и наличие/отсутствие www? картинка загружается нормально, она просто не обрисовывается почему-то...
У загрузки и draw() разные политики безопасности, у draw() жестче. Сам сталкивался с такой проблемой дважды (грузится, draw не работает), решилась когда прописал allowInsecureDomain и crossdomain.xml кинул.

AL.exe
10.11.2007, 02:38
Но вот только на kmkmeat все и всегда работает, а на kalackeevsky.ru работает ровно половина. Т.е. на половине компов работает, а на половине нет.

У меня и там, и там работает одинаково и, видимо, неправильно: отображается картинка и, слоем выше, такая же, но масштабированная и полупрозрачная.

Если набираю еще и www, то на обоих сайтах между слоями с картинкой отображается черный прямоугольник.

Molecula
10.11.2007, 04:38
Кстати да, но не просто черный прямоугольник, а полупрозрачный черный прямоугольник как бы, поверх картинки. Вторая, которая уменьшенная дожны быть - не появляется. Похоже, на сервере чёт нахимичили.

Dr.OH
10.11.2007, 11:11
дурдом... большое спасибо за подсказку... сейчас попробую сделать allowInsecureDomain и xml'ку положить. Наверное проблема действительно в этом. а картинки - одна поверх другой - это нормально - однка картинка, которая загрузилась, а вторая - это после draw().
Так, если я правильно понял, то выглядить это должно примерно так:

System.security.allowInsecureDomain("www.kalacheevsky.ru");

и так:

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="www.kalacheevsky.ru" />
</cross-domain-policy>


System.security.allowInsecureDomain как и System.security.allowDomain работате только для swf файлов и никакого отношения не имеет к картинкам и draw-функции. Т.е. allowDomain пишется внутри флэшки, которую пытаются загрузить с другого сайта.
В общем я пока ничего не пойму... не работает ни с allowDomain, ни с <allow-access-from domain="*" /> :(

все, разобрался, всем большое спасибо. Итак, чтобы все работало надо в явном виде прописать во флэшке:

System.security.loadPolicyFile("http://some_domain.ru/crossdomain.xml");

где some_domain.ru -то, откуда мы собираемся брать информацию. В хэлпе написано, что флэш это все сам делает - ничего он сам не делает.
А на some_domain.ru должен быть crossdomain.xml сделующего содержания:

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="www.other_domain.ru" />
</cross-domain-policy>

other_domain.ru - тот, кто пытается получить информацию.