2014-02-19 4 views
0

Так что это моя проблема, у меня есть два класса:AS3 :: Как значение из функции становится глобальной переменной

Первый класс: MINIATURKA который загружает все IMG по URLRequest

Второй класс: MINIATURKI, который загружает XML файл и создает массив класса MINIATURKA(loaded jpg)

img имеют разную ширину, и я хочу, чтобы поместить их в ряд, рядом друг друга, поэтому код массива в классе MINIATURKI должен выглядеть следующим образом:

Вот весь код MINIATURKI класса:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.utils.setInterval; 
    import flash.events.MouseEvent; 
    import flash.geom.Rectangle; 
    import caurina.transitions.*; 

    public class Miniaturki extends MovieClip 
    { 
     private static var mini:Array; 
     private var minaWidth:Number = 0; 
     private var loader:URLLoader; 
     private var xml1:XML; 
     private var draging:Boolean = false; 
     public var count:Number= -1; 

     public function Miniaturki():void 
     { 
      loader = new URLLoader(); 
      loader.load(new URLRequest("obrazki.xml")); 
      loader.addEventListener(Event.COMPLETE,onLoadXMLComplete); 
     } 

     private function onLoadXMLComplete(event:Event):void 
     { 
      xml1 = new XML(URLLoader(event.target).data); 
      var i:Number; 
      mini = new Array(xml1.obrazek.length()); 
      count = xml1.obrazek.length(); 
      for (i=0;i<count;i++) 
      { 
       mini[i] = new Miniaturka(xml1.obrazek[i].attribute("id"),i); 
       addChild(mini[i]); 
       mini[i].x = i*889; 
       trace(mini[i].width); 
      } 
      MovieClip(parent).nazwa.text = xml1.obrazek[0]; 
      MovieClip(parent).ilosc.text = "1/"+count; 
      MovieClip(parent).scro.buttonMode = true; 
      stage.addEventListener(MouseEvent.MOUSE_DOWN, beginDrag); 
     } 

     private function beginDrag(event:MouseEvent):void 
     { 
      var minScroll:Number = 0; 
      var maxScroll:Number = MovieClip(parent).scrolbar.width - MovieClip(parent).scro.width; 
      var bounds:Rectangle = new Rectangle(minScroll,MovieClip(parent).scro.y,maxScroll,0); 
      MovieClip(parent).scro.startDrag(false,bounds); 
      stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
      MovieClip(parent).scro.addEventListener(Event.ENTER_FRAME,checkingProgress); 
      draging = true; 
     } 

     private function endDrag(event:MouseEvent):void 
     { 
      MovieClip(parent).scro.stopDrag(); 
      draging = false; 
     } 

     function checkingProgress(event:Event):void 
     { 
      var maxScroll:Number = MovieClip(parent).scrolbar.width - MovieClip(parent).scro.width;  
      var procent:Number = MovieClip(parent).scro.x/maxScroll; 
      if (draging) 
      { 
       Tweener.addTween(this,{x:(-procent*(this.width-MovieClip(parent).maska1.width)),time:1}); 
      } 
     } 
    } 
} 

Проблема заключается в том, что, когда я прослежу мини [I] .width значения, которое он прослеживает то же значение, это значения [889] в коде класса MINIATURKA: button.graphics.drawRect(0, 0, 889, 500);

Вот весь код MINIATURKA класса:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.display.Loader; 
    import flash.net.URLRequest; 
    import flash.display.LoaderInfo; 
    import fl.transitions.Tween; 
    import fl.transitions.easing.*; 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 
    import flash.display.DisplayObject; 
    import com.anttikupila.utils.JPGSizeExtractor; 

    public class Miniaturka extends MovieClip 
    { 
     private var je:JPGSizeExtractor = new JPGSizeExtractor(); 
     private var miniWidth:Number = 0; 
     private var id:String; 
     private var tween:Tween; 
     private var tryb:Boolean; 
     private var button:Sprite; 
     private var index:Number; 
     private var aktywna:Boolean = false; 
     public var bLoad:Boolean = false; 

     public function Miniaturka(id:String, index:Number):void 
     { 
      var je:JPGSizeExtractor = new JPGSizeExtractor(); 
      this.id = id; 
      this.index = index; 
      tryb = false; 
      var loader:Loader = new Loader(); 
      loader.load(new URLRequest("images/" + id + "m.jpg")); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, nLoadComplete); 
      je.addEventListener(JPGSizeExtractor.PARSE_COMPLETE, sizeHandler); 
      je.extractSize("images/" + id + "m.jpg"); 

      function sizeHandler(e : Event) : void 
      { 
       trace(je.width); 
      } 

      button = new Sprite(); 
      button.graphics.beginFill(0x000000, 0); 
      button.graphics.drawRect(0, 0, 889, 500); 
      button.graphics.endFill(); 
      button.buttonMode = true; 
      addChild(button); 
      button.addEventListener(MouseEvent.MOUSE_OVER, onOver); 
      button.addEventListener(MouseEvent.MOUSE_OUT, onOut); 
      button.addEventListener(MouseEvent.CLICK, onClick); 
      this.alpha = 1; 
     } 

     private function nLoadComplete(event:Event):void 
     { 
      var loader:Loader = new Loader(); 
      loader = LoaderInfo(event.target).loader; 
      pusty.addChild(loader); 
      tween = new Tween(pusty, "alpha", Regular.easeOut, 0, 0.6, 2, true); 
      bLoad = true; 
      setStan(false); 
      miniWidth = loader.width; 
      pusty.alpha = 0; 
     } 

     private function onOver(event:MouseEvent):void 
     { 
     } 

     private function onOut(event:MouseEvent):void 
     { 
     } 

     private function onClick(event:MouseEvent):void 
     { 
     } 
    } 
} 

Я не могу поставить т он создает кнопочный спрайт в функцию sizeHandler, потому что mini[i].width будет отслеживать как 0:/

Правильное значение отслеживает: trace(je.width); из приведенного выше кода. Как сделать: je.width значение работы в этой строке как: button.graphics.drawRect(0, 0, je.width, 500);

Возможно ли это?

Или есть другой способ отправить значение непосредственно другому классу?

Я wan't к обрешетке с Galery как на этом сайте: http://www.adartis.pl/#portfolio

EDIT 1: Я также попытался с помощью DispatchEVENT puted в любой sizeHandler либо nLoadComplete функции, и я мог бы прочитать значение в класс Miniaturki, но я не использую его эффективно в for loop

ответ

1

Попробуйте добавить обратный вызов в Miniaturka. когда загрузка изображения завершена., будет вызван обратный вызов. А функция обратного вызова добавит Miniaturka в класс MINIATURKI.

Вот пример.

public class MINIATURKI 
{ 

    public function yourFunction():void 
    { 
     xml1 = new XML(URLLoader(event.target).data); 
     var i:Number; 
     var currentX:Number = 0; 
     mini = new Array(xml1.obrazek.length());    
     count = xml1.obrazek.length(); 
     for (i=0; i<count; i++) 
     { 
      mini[i] = new Miniaturka(xml1.obrazek[i].attribute("id"),i, callback); 
     } 
    } 

    //to save how many images have load complete 
    private var loadCompleteCount:int = 0; 

    //save the MINIATURKA instances 
    private var savedImgs:Array = []; 

    //this function will be called when the image load complete in MINIATURKA 
    private function callback(m:MINIATURKA, index:int):void 
    { 

     savedImgs[index] = m; 

     loadCompleteCount++; 

     if (loadCompleteCount == count) 
     { 
       //when all load complete, add them 
       for each (var ins:MINIATURKA in savedImgs) 
       { 
        addChild(ins); 
        ins.x = currentX; 
        currentX += ins.width; 
       } 
     } 
    } 
} 

И о классе MINIATURKA

EDIT

public function Miniaturka(id:String, index:Number, $callback:Function):void { 
    //your code 

    imgIndex = index; 

    callback = $callback; 
} 

private var imgIndex:int; 

private var callback:Function; 

private function nLoadComplete(event:Event):void 
{ 
     var loader:Loader = new Loader(); 
     loader = LoaderInfo(event.target).loader; 
     pusty.addChild(loader); 
     tween = new Tween(pusty, "alpha", Regular.easeOut, 0, 0.6, 2, true); 
     bLoad = true; 
     setStan(false); 
     miniWidth = loader.width; 
     pusty.alpha = 0; 

     createButton(loader.width); 
     callback.apply(null, [this, imgIndex]); 
} 

private function createButton(imgWidth:int):void 
{ 
    button = new Sprite(); 
    button.graphics.beginFill(0x000000, 0); 

    //if you draw 
    button.graphics.drawRect(0, 0, imgWidth, 500); 
    button.graphics.endFill(); 
    button.buttonMode = true; 
    addChild(button); 
    button.addEventListener(MouseEvent.MOUSE_OVER, onOver); 
    button.addEventListener(MouseEvent.MOUSE_OUT, onOut); 
    button.addEventListener(MouseEvent.CLICK, onClick); 
} 
+0

это не работает, я получаю эту ошибку в выводе: «ReferenceError: Error # 1069: содержание собственности не был найден в com.anttikupila.utils.JPGSizeExtractor, и нет значения по умолчанию ' Я должен, вероятно, показать весь код. В каждом классе у меня есть также прослушиватель событий ... Somone может помочь? У меня нет идеи, как это сделать. Можно ли сделать sam только в одном классе? –

+0

Я отредактировал первое сообщение, чтобы показать всю проблему .. –

+0

Я отредактировал ответ, обратный вызов должен быть вызван в nLoadComplete. – Pan

Смежные вопросы