PDA

Просмотр полной версии : loadClip внутри class - а


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;
}
};
};

in4core
16.07.2010, 17:15
class com.streamLoader extends MovieClip {

var _obj:Object;
var _clipLoader:MovieClipLoader;
var _loader;
public function streamLoader() {
}

private function _loadContent(_content, _location, _func, _ld) {

_loader = _ld;
if (_content != "undefined.swf") {
_obj = new Object();
_clipLoader = new MovieClipLoader();
_clipLoader.addListener(_obj);
_obj.onLoadProgress = mx.utils.Delegate.create(this, _loadProgress);
_obj.onLoadInit = _func;
_obj.onLoadStart = _start;
_clipLoader.loadClip(_content,_location);
}
}
private function _loadProgress(target_mc:MovieClip, loaded:Number, total:Number):Void {
var percent:Number = Math.floor(loaded/total*100);
if (typeof _loader == "movieclip") {
_loader.gotoAndStop(percent);
} else {
_loader.text = percent;
}
if (loaded/total == 1) {
_loader.text = "";

}
}
function _start(target_mc:MovieClip) {
target_mc._visible = false;
}

NoCD
16.07.2010, 17:23
ух ты как все просто, спасибо in4core.

in4core
16.07.2010, 17:23
пользуйся ) писал давно уже

NoCD
16.07.2010, 17:27
пригляделся поближе к коду, а почему _func вынесена за пределы класса? разве через делегат она не может быть использована или хотя бы внутри класса?

in4core
16.07.2010, 17:51
))) Для коллбека я делаю всегда

var с = new com.streamLoader();
c._loadContent("URL",_root, callBack);

function callBack() { trace("LOADED ALL") }

NoCD
16.07.2010, 20:58
значит все таки от загрузчика не получишь сразу ответ! Как вариант прийдется такое же делать.