пользовательский класс загрузчика AS3, который использует пользовательский класс LoaderInfo? - PullRequest
3 голосов
/ 18 апреля 2009

Это вопрос конкретно о создании пользовательского класса Loader в качестве продолжения Как изменить существующие события AS3, чтобы я мог передавать данные? . Если это не правильный путь, дайте мне знать.

У меня есть собственный класс Loader и собственный класс LoaderInfo. Я не могу понять, как заставить класс Loader использовать собственный класс LoaderInfo в качестве его свойства contentLoaderInfo.

package com.display {
    import flash.display.Loader;

    import com.display.CustomLoaderInfo;

    public class CustomLoader extends Loader {
        public var customData:*;

        public function CustomLoader(passedData: *= null) {
            customData = passedData;
        }
    }
}

^ Нужно что-то сделать, чтобы у него был новый CustomLoaderInfo

package com.display {
    import flash.display.LoaderInfo;    
    import flash.events.Event;

    import com.events.CustomEvent;

    public class CustomLoaderInfo extends LoaderInfo {
        public var customData:*;

        public function CustomLoaderInfo(passedData: *= null) {
            customData = passedData;
        }       

        override public function dispatchEvent(event:Event):Boolean {
            var customEvent:CustomEvent = new CustomEvent(event.type, customData, event.bubbles, event.cancelable);
            return super.dispatchEvent(customEvent);
        }
    }
}

^ Это может сработать, но, поскольку я не могу заставить CustomLoader использовать его, я пока не знаю.

Ответы [ 5 ]

4 голосов
/ 19 апреля 2009

Я не знаю, как это вписывается в то, что вы делаете, но вы вообще не могли бы сделать расширенную LoaderInfo. Loader.contentLoaderInfo имеет свойство loader, которое будет возвращать использованный Loader (или в данном случае CustomLoader). Теоретически вы можете сделать это с помощью имеющегося у вас класса CustomLoader:


var loader: CustomLoader = new CustomLoader("Extra Data");
loader.load(new URLRequest("file.swf"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderComplete);

function loaderComplete(event: Event) : void
{
    var customData:* = (event.target.loader as CustomLoader).customData;
    trace(customData); // Extra Data
}
0 голосов
/ 25 июля 2010

или вы можете лучше передать данные в класс Loader:


package com.display
{
    import flash.display.Loader;

    public class Loader extends flash.display.Loader
    {
        private var _obj:Object;

        public function Loader():void
        {
            super();
        }

        public function get obj():Object
        {
            return _obj;
        }

        public function set obj(o:Object):void
        {
            _obj = o;
        }
    }

}
0 голосов
/ 09 марта 2010

Потенциальная проблема с помеченным ответом: если contentLoaderInfo выплевывает IOError, вы не можете получить доступ к свойству .loader для доступа к вашему пользовательскому классу загрузчика.

Я сделал следующее: * в моем пользовательском классе загрузчика создайте следующий метод:

    public function requestError(event:Event):void {
        dispatchEvent(event);           
    }

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

_loaderCls.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _loaderCls.requestError);

Затем добавьте того же слушателя в ваш класс загрузчика и заставьте его вызывать любой метод, который вам нужен. На этом этапе event.target будет тем из вашего пользовательского класса загрузчика, и вы можете добавить любую дополнительную информацию, необходимую вам для этого класса:

_loaderCls.addEventListener(IOErrorEvent.IO_ERROR, requestError);
0 голосов
/ 05 мая 2009

Мне нужно было что-то подобное, потому что я хотел иметь индекс с информацией ... т.е. иметь что-то вроде event.target.index, доступное после запуска события ... в любом случае я разработал класс, содержащий загрузчик и информация о грузчике ... вот класс

открытый класс LoaderBox расширяет Sprite {

   public static var PROGRESS:String = "progress"
   public static var COMPLETE:String = "complete"

   public var id:int
   public var index:int
   public var loader:Loader
   public var info:LoaderInfo
   public var isOpen:Boolean
   //
   public var percent:Number = -1

   public function load(path:String,idx:int=-1,nm:String=null){
       loader  = new Loader()
       if (nm != null){
           name = nm
       }
       index = idx
       var req:URLRequest = new URLRequest(path)
       info = loader.contentLoaderInfo
       info.addEventListener(Event.COMPLETE,complete)
       info.addEventListener(ProgressEvent.PROGRESS,progress)
       isOpen = true
       loader.load(req) 
    }
    private function complete(e:Event):void{
       isOpen = false
       dispatchEvent(new Event(LoaderBox.COMPLETE))
    }
    private function progress(e:ProgressEvent):void{
       if (e.target.bytesTotal>0){  
          percent = Math.floor(e.target.bytesLoaded/e.target.bytesTotal * 100)
       }
       dispatchEvent(new Event(LoaderBox.PROGRESS))
    }

}

0 голосов
/ 18 апреля 2009

Вам придется переопределить функцию, в которой создается экземпляр loaderinfo, и это может быть частная функция. В новой функции вы можете вместо этого создать свой пользовательский класс loaderInfo, но вам также придется делать все остальное, что делает перезаписанный метод. Вы также можете столкнуться с некоторыми проблемами в изолированной программной среде безопасности с loadinfo. Перезапись такой функции обычно возможна только тогда, когда функция написана с учетом этого.

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

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

Я бы сказал, что вам следует искать другое решение. В вопросе, на который вы ссылаетесь, говорите об отправке мувиклипа с вашим событием. Вы думали о том, чтобы достичь другого пути? Когда вы получаете событие, вы получаете ссылку на объект, который отправил его (Event.target). Разве вы не можете использовать эту ссылку, чтобы получить мувиклип?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...