Параметр sourceBitmapData должен быть ненулевым - PullRequest
0 голосов
/ 09 января 2010

Я пытаюсь скопировать пиксели растровых данных. но я продолжаю получать следующую ошибку

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

У кого-нибудь есть подсказка ??

1 Ответ

2 голосов
/ 09 января 2010

Ошибка возникает из-за того, что переменная image (первый параметр copyPixels) имеет значение null.

Переменная image GameObject заполняется в методе imageComplete, который вызывается только после завершения загрузки. loader.load() является асинхронным и возвращается до полной загрузки изображения. Вы звоните drawImage (), как только loadImage вернется, и, следовательно, image будет нулевым в это время. Отправьте событие complete из метода imageComplete и дождитесь его, прежде чем вызывать 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);
}
...