views:

90

answers:

1

I am trying to copy the pixels of a bitmap data. but I keep getting the following error

Parameter sourceBitmapData must be non-null.

it happens in the method drawImage. exact after my trace that says "got canvas data".

 canvasData.copyPixels(image,tileRect,tilePoint);

Below is my code

package com.objects {

    import flash.display.Sprite;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.net.*;
    import flash.events.*;
    import flash.display.LoaderInfo;

    public class gameObject extends Sprite {

        protected var goWidth:Number;
        protected var goHeight:Number;
        protected var image:BitmapData;
        protected var canvas:Bitmap;

        public function gameObject():void
        {
            init();
        }

        private function init():void
        {

        }

        public function loadImage(imageDir:String):void
        {
            trace("loadimage");
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,imageComplete);
            loader.load(new URLRequest(imageDir));
        }

         private function imageComplete(e:Event):void {
            var loader:LoaderInfo = LoaderInfo(e.target);
            image = Bitmap(loader.content).bitmapData;
            trace("imagecomplete");
         }

         public function drawImage(xPoint:Number = 0, yPoint:Number = 0, tWidth:Number = 0, tHeight:Number = 0):void
         {
            var tilePoint:Point = new Point(0,0);
            var tileRect = new Rectangle(xPoint,yPoint,tWidth,tHeight);

            var canvasData:BitmapData = new BitmapData(tWidth,tHeight);
            trace("got canvas data");
            canvasData.copyPixels(image,tileRect,tilePoint);
            trace("copied pixels");
            canvas = new Bitmap(canvasData);
         }
    }
}

and below is what I use to call the class

balls = new Array();
            balls[0] = new gameObject();
            balls[0].loadImage("com/images/ball.gif");
            balls[0].drawImage(0,0,15,15);

Anyone have a clue ??

+2  A: 

Error occurs because the image variable (the first parameter to copyPixels) is null.

The image variable of GameObject is populated in the imageComplete method that is called only when the loading is completed. loader.load() is asynchronous and returns before the image is fully loaded. You are calling drawImage () as soon as loadImage returns and hence image would be null at this time. Dispatch a complete event from the imageComplete method and wait for it before you call drawImage.

private function imageComplete(e:Event):void 
{
  var loader:LoaderInfo = LoaderInfo(e.target);
  image = Bitmap(loader.content).bitmapData;
  trace("imagecomplete");
  //dispatch a complete event.
  dispatchEvent(e);
}

game = new GameObject();
//listen for the complete event
game.addEventListener(Event.COMPLETE, handleComplete);
game.loadImage("com/images/ball.gif");

private function handleComplete(e:Event):void
{
  //load complete and image populated : draw the image.
  var game:GameObject = GameObject(e.target);
  game.drawImage(0,0,15,15);
}
Amarghosh