NoCD
16.07.2010, 16:52
Всем привет!
Решил вынести загрузчик из кадра в класс, для удобного применения в будущем. И столкнулся с проблемами, которые мне на прямую не удалось решить.
Например не удается размещать функции такого типа внутри класса oLoadListener.onLoadInit = function(mcTarget:MovieClip)
Пришлось все подобные функции вложить внутрь другой функции.
Но в таком случае не получается вернуть загружаемый файл из вызывающей функции.
то есть clip = loaders("имя файла",container); не сработает как надо.
Решил обойти возврат прямой функцией. Которая вызывает функцию _root.finish(clip) после загрузки внутри oLoadListener.onLoadInit , но это как то не правильно каждый раз к загрузке дописывать функцию вывода. Подскажите как проще сделать такой загрузчик, без костылей, что бы после загрузки возвращал загруженую картинку вызвавшей ее функции ?
Вот сам код, но он больше эксперементальный чем конечный вариант.
import flash.display.BitmapData;
import mx.utils.Delegate;
class loader_img3{
//===========================================================================================================
//- Name: Загрузчик файлов;
//
// Для работы класса необходимо в первую очередь запустить функцию init(); из рабочей среды
// img(path,container,width,height)
// path - имя файла
// container - место, куда будет грузиться файл
// width и height - не обязательны
//===========================================================================================================
public var name_file:String;
public var empty_mc:MovieClip;
public var mcLoader:MovieClipLoader;
public var oLoadListener:Object;
public var ob:Object;
public var mcload:String;
public var container:MovieClip;
public function init(){
ob = new Object();
ob.ind = 0;
ob.ind2 = 0;
ob.depth = 0;
}
public function img(name_file,container,WIDTH,HEIGHT){
if(WIDTH == undefined){WIDTH = 0;}
if(HEIGHT == undefined){HEIGHT = 0;}
ob[ob.ind] = {name:name_file,container:container,width:WIDTH,height:HEIGHT,index:ob.ind,ins:ob.ind}
var obj = ob[ob.ind];
empty_mc = container.createEmptyMovieClip("mcImage_"+ob.ind, 8000+ob.ind);
ob.ind++;
obj.img = empty_mc;
trace("empty_mc= "+empty_mc)
// создаем экземпляр MovieClipLoader
mcLoader = new MovieClipLoader();
// слушатель загрузки картинок
oLoadListener = new Object();
// вешаем слушатель к MovieClipLoader
mcLoader.addListener(oLoadListener);
//var clip =
loaders2(name_file,empty_mc,ob);
//return obj.img;
//trace("obj.copyBM= "+obj.copyBM)
//trace("cclip= "+clip)
}
//-------------------------------------------------
public function loaders2(name_file,container,ob){
mcLoader.loadClip(name_file,container);
oLoadListener.onLoadProgress = function(mcTarget:MovieClip, nBytesLoaded:Number, nBytesTotal:Number):Void
{
trace(Math.round(nBytesLoaded / nBytesTotal * 100) + " % " + mcTarget + " загружено");
};
// эта выполнится после полной загрузки картинки
oLoadListener.onLoadInit = function(mcTarget:MovieClip)
{
var txt:String = ""+mcTarget;
if(txt.length != 0){
for(var i = 0; i <= txt.length;i++){
var txtt = txt.substring(i,i+1)
if(txtt == "_"){
var number = txt.substring(i+1,txt.length)
}
}
}
var obj:Object = ob[number];
mcTarget._x = 0
mcTarget._y = 0
if(obj.width != 0){
mcTarget._width = obj.width;
}
if(obj.height != 0){
mcTarget._height = obj.height;
}
ob.ind2++;
var clip = copyBitmap(obj,mcTarget, "bitmap0")
trace("cclip= "+clip)
//obj.copyBM = clip;
_root.finish(clip)
//return clip;
};
function copyBitmap(obj,target:MovieClip, mc:String):MovieClip
{
var container = obj.container;
var bmp:BitmapData = new BitmapData(target._width, target._height);
bmp.draw(target);
var clip:MovieClip = container._parent.createEmptyMovieClip(mc, 1000);
clip.attachBitmap(bmp, 0, "none", true);
return clip;
}
};
};
Решил вынести загрузчик из кадра в класс, для удобного применения в будущем. И столкнулся с проблемами, которые мне на прямую не удалось решить.
Например не удается размещать функции такого типа внутри класса oLoadListener.onLoadInit = function(mcTarget:MovieClip)
Пришлось все подобные функции вложить внутрь другой функции.
Но в таком случае не получается вернуть загружаемый файл из вызывающей функции.
то есть clip = loaders("имя файла",container); не сработает как надо.
Решил обойти возврат прямой функцией. Которая вызывает функцию _root.finish(clip) после загрузки внутри oLoadListener.onLoadInit , но это как то не правильно каждый раз к загрузке дописывать функцию вывода. Подскажите как проще сделать такой загрузчик, без костылей, что бы после загрузки возвращал загруженую картинку вызвавшей ее функции ?
Вот сам код, но он больше эксперементальный чем конечный вариант.
import flash.display.BitmapData;
import mx.utils.Delegate;
class loader_img3{
//===========================================================================================================
//- Name: Загрузчик файлов;
//
// Для работы класса необходимо в первую очередь запустить функцию init(); из рабочей среды
// img(path,container,width,height)
// path - имя файла
// container - место, куда будет грузиться файл
// width и height - не обязательны
//===========================================================================================================
public var name_file:String;
public var empty_mc:MovieClip;
public var mcLoader:MovieClipLoader;
public var oLoadListener:Object;
public var ob:Object;
public var mcload:String;
public var container:MovieClip;
public function init(){
ob = new Object();
ob.ind = 0;
ob.ind2 = 0;
ob.depth = 0;
}
public function img(name_file,container,WIDTH,HEIGHT){
if(WIDTH == undefined){WIDTH = 0;}
if(HEIGHT == undefined){HEIGHT = 0;}
ob[ob.ind] = {name:name_file,container:container,width:WIDTH,height:HEIGHT,index:ob.ind,ins:ob.ind}
var obj = ob[ob.ind];
empty_mc = container.createEmptyMovieClip("mcImage_"+ob.ind, 8000+ob.ind);
ob.ind++;
obj.img = empty_mc;
trace("empty_mc= "+empty_mc)
// создаем экземпляр MovieClipLoader
mcLoader = new MovieClipLoader();
// слушатель загрузки картинок
oLoadListener = new Object();
// вешаем слушатель к MovieClipLoader
mcLoader.addListener(oLoadListener);
//var clip =
loaders2(name_file,empty_mc,ob);
//return obj.img;
//trace("obj.copyBM= "+obj.copyBM)
//trace("cclip= "+clip)
}
//-------------------------------------------------
public function loaders2(name_file,container,ob){
mcLoader.loadClip(name_file,container);
oLoadListener.onLoadProgress = function(mcTarget:MovieClip, nBytesLoaded:Number, nBytesTotal:Number):Void
{
trace(Math.round(nBytesLoaded / nBytesTotal * 100) + " % " + mcTarget + " загружено");
};
// эта выполнится после полной загрузки картинки
oLoadListener.onLoadInit = function(mcTarget:MovieClip)
{
var txt:String = ""+mcTarget;
if(txt.length != 0){
for(var i = 0; i <= txt.length;i++){
var txtt = txt.substring(i,i+1)
if(txtt == "_"){
var number = txt.substring(i+1,txt.length)
}
}
}
var obj:Object = ob[number];
mcTarget._x = 0
mcTarget._y = 0
if(obj.width != 0){
mcTarget._width = obj.width;
}
if(obj.height != 0){
mcTarget._height = obj.height;
}
ob.ind2++;
var clip = copyBitmap(obj,mcTarget, "bitmap0")
trace("cclip= "+clip)
//obj.copyBM = clip;
_root.finish(clip)
//return clip;
};
function copyBitmap(obj,target:MovieClip, mc:String):MovieClip
{
var container = obj.container;
var bmp:BitmapData = new BitmapData(target._width, target._height);
bmp.draw(target);
var clip:MovieClip = container._parent.createEmptyMovieClip(mc, 1000);
clip.attachBitmap(bmp, 0, "none", true);
return clip;
}
};
};