2010-01-09 89 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); 
} 
相關問題