2010-01-09 68 views
0

我想复制位图数据的像素。但我不断收到以下错误参数sourceBitmapData必须为非空

Parameter sourceBitmapData must be non-null. 

它发生在方法drawImage中。确切地说,我的跟踪说“获得画布数据”。

canvasData.copyPixels(image,tileRect,tilePoint); 

下面是我的代码

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); 
     } 
    } 
} 

以下是我用来调用类

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

任何有线索?

回答

2

发生错误的原因是image变量(copyPixels的第一个参数)为空。

变量GameObject填充在imageComplete方法中,该方法仅在加载完成时调用。 loader.load()是异步的,并在图像完全加载之前返回。您在loadImage返回时立即致电drawImage(),因此此时image将为空。从imageComplete方法中调用complete事件并在您致电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); 
} 
相关问题