I’m trying to write a class that its constructor takes as argument a String ( which is an image in my directory ie: jpg ) and load the corresponding image via a loader object in memory. I also provide function getBitmapFromLoader() to get the bitmap of the loader in order to use it from another class.
public class LoadImage extends Loader
{
private var bitmap:Bitmap;
private var ldr:Loader;
public function LoadImage(nameURL:String):void
{
trace("LoadImage constructor");
ldr = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandler);
var request:URLRequest = new URLRequest(nameURL);
ldr.load(request);
}
/* methods */
public function getBitmapFromLoader():Bitmap
{
return bitmap;
}
public function toSprite():Sprite
{
trace("toSprite method");
var sprite:Sprite = new Sprite();
sprite.addChild(bitmap);
return sprite;
}
public function toMovieClip():MovieClip
{
trace("toMovieClip method");
var mvc:MovieClip = new MovieClip();
mvc.addChild(bitmap);
return mvc;
}
private function completeHandler(event:Event):void
{
trace("completeHandler " + event.currentTarget);
bitmap = new Bitmap();
bitmap = Bitmap(event.currentTarget.content);
}
private function ioErrorEventHandler(event:IOErrorEvent):void
{
trace("ioErrorEventHandler " + event.currentTarget);
trace("error on loading image: " + event.currentTarget.url);
bitmap = null;
}
}
}
but it does not work.
This is what flash outputs:
Main constructor
LoadImage constructor
toSprite method
TypeError: Error #2007: Parameter child must be non-null.
at flash.display::DisplayObjectContainer/addChild()
at loader::LoadImage/toSprite()
at Main()
completeHandler [object LoaderInfo]
This is how i use it from a main class:
package
{
import loader.*;
import flash.display.MovieClip;
import flash.display.Sprite;
public class Main extends MovieClip
{
/* properties */
/* constructor */
public function Main():void
{
trace("Main constructor");
var imgLdr:LoadImage = new LoadImage("smile_bg.jpg");
var spr1:Sprite = imgLdr.toSprite();
//this.width = spr1.width;
//this.height = spr1.height;
this.addChild(spr1);
}
/* methods */
}
}
Well, a Loader is itself a DisplayObject – so you could just addChild(event.currentTarget) and it’ll show up just fine. It extends DisplayObjectContainer just like Sprite does.
If you literally need a Bitmap, then you can do something like:
And do it that way. You might have to tweak that a bit I’m going from memory.
If you’re ever having issues with the Display API, this is a very good chart to summarize what lives where and how the various display object children are connected: http://accad.osu.edu/~pgerstma/class/pca/resources/as3API/AS3API-flash.display.png