Reputation: 10790
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 ??
Upvotes: 0
Views: 696
Reputation: 59451
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);
}
Upvotes: 2