2013-05-03 4 views
0

Так что я пытаюсь загрузить лист спрайта. Я встроил его в .swf, но когда я создаю экземпляр класса и вызываю функцию, которая начинает обрезать с листа спрайта, я получаю ошибку:Ожидание загрузки встроенного изображения?

«Параметр sourceBitmapData должен быть не нулевым».

Я знаю, что происходит то, что код вызывается до того, как изображение спрайта на самом деле загружено, но я не уверен, как решить эту проблему, поскольку я встраиваю, а не используя загрузчик. Я предполагаю, что мне нужно будет использовать прослушиватели событий, но как мне сделать эту работу с вложением? Вот мой код до сих пор:

В главном общественном классе:

private var currentSprite:SpriteSheet; 
[Embed(source='../assets/images/sprite_sheet_1.png')] 
private var sheetClass:Class; 
private var sheet:Bitmap = new sheetClass(); 

Тогда в главной функции:

currentSprite = new SpriteSheet(sheet, 25, 25); 
addChild(currentSprite); 

Функция SpriteSheet устанавливается следующим образом:

public function SpriteSheet(tileSheetBitmap:Bitmap, width:Number = 25, height:Number = 25) { 
    tileSheetBitmapData = tileSheetBitmap.bitmapData; 
    tileWidth = width; 
    tileHeight = height; 

    rowLength = int(tileSheetBitmap.width/width); 

    tileRectangle = new Rectangle(0, 0, tileWidth, tileHeight); 
    tilePoint = new Point(0, 0); 

    canvasBitmapData = new BitmapData(tileWidth, tileHeight, true); 
    var canvasBitmap:Bitmap = new Bitmap(canvasBitmapData); 
    addChild(canvasBitmap); 

    drawTile(0); 

    addEventListener(Event.REMOVED_FROM_STAGE, remove); 
} 

В моем классе SpriteSheet я вызываю функцию drawTile, которая вызывает copyPixels(), где ошибка возникает из:

canvasBitmapData.copyPixels(tileSheetBitmapData, tileRectangle, tilePoint); 

Я знаю, что это много кода, но я чувствую, что есть, вероятно, простое решение. Любая обратная связь будет принята с благодарностью. Благодаря!

Edit: Вот класс SpriteSheet:

package 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.Sprite; 
    import flash.geom.Point; 
    import flash.geom.Rectangle; 
    import flash.events.Event; 

    public class SpriteSheet extends Sprite { 
     public var tileSheetBitmapData:BitmapData; 
     private var canvasBitmapData:BitmapData; 

     private var tileWidth:int; 
     private var tileHeight:int; 
     private var rowLength:int; 

     private var tileRectangle:Rectangle; 
     private var tilePoint:Point; 

     public function SpriteSheet(tileSheetBitmap:Bitmap, width:Number = 25, height:Number = 25) { 
      tileSheetBitmapData = tileSheetBitmap.bitmapData; 
      if(tileSheetBitmap != null) { 
       trace("tileSheetBitmap is not null in SpriteSheet"); 
      } 
      if(tileSheetBitmapData != null){ 
       trace("tileSheetBitmapData is not null in SpriteSheet"); 
      } 
      tileWidth = width; 
      tileHeight = height; 

      rowLength = int(tileSheetBitmap.width/width); 

      tileRectangle = new Rectangle(0, 0, tileWidth, tileHeight); 
      tilePoint = new Point(0, 0); 

      canvasBitmapData = new BitmapData(tileWidth, tileHeight, true); 
      var canvasBitmap:Bitmap = new Bitmap(canvasBitmapData); 
      addChild(canvasBitmap); 

      drawTile(0); 

      addEventListener(Event.REMOVED_FROM_STAGE, remove); 
     } //end of SpriteSheet 

     public function drawTile(tileNumber:int):BitmapData { 
      trace("Reached drawTile"); 
      tileRectangle.x = int((tileNumber % rowLength)) * tileWidth; 
      tileRectangle.y = int((tileNumber/rowLength)) * tileHeight; 
      canvasBitmapData.copyPixels(tileSheetBitmapData, tileRectangle, tilePoint); 
      trace("Reached past copyPixels"); 

      return canvasBitmapData.clone(); 
     } //end of drawTile 

     public function tileBoard(boardIndex:Array):BitmapData { 
      var wide:int = boardIndex[0].length; 
      var tall:int = boardIndex.length; 

      canvasBitmapData = new BitmapData((tileWidth * wide), (tileHeight * tall), true); 
      var boardCanvas:Bitmap = Bitmap(getChildAt(0)); 
      boardCanvas.bitmapData = canvasBitmapData; 

      tileRectangle = new Rectangle(0, 0, (tileWidth * wide), (tileHeight * tall)); 
      for(var i:int = 0; i < wide; i++) { 
       for(var j:int = 0; j < tall; j++) { 
        tilePoint = new Point((tileWidth * i), (tileHeight * j)); 

        drawTile(boardIndex[j][i]); 
       } 
      } 
      return canvasBitmapData.clone(); 
     } //end tileBoard 

     public function remove(e:Event):void { 
      tileSheetBitmapData.dispose(); 
      canvasBitmapData.dispose(); 
     } //end remove 
    } //end class SpriteSheet 
} //end package 
+0

Вы отслеживали или отлаживали ваши битмапДата в этой точке или в конструкторе? – Kodiak

+0

Есть строка в SpriteSheet в основной функции, где я вызываю drawTile (0), и комментируя это, я дал новую ошибку: Не удается получить доступ к объекту или методу нулевой ссылки объекта В моей главной функции. Поэтому теперь я думаю, мне нужно проследить, почему это происходит. Хм. – Lapys

+0

Вы не говорите о drawTile в своем вопросе, пожалуйста, давайте сосредоточимся на этом недостающем bitmapData :) – Kodiak

ответ

0

Это не проблема загрузки, так как вы встраивание файл PNG в ваш SWF, все загрузки изображения делается в то время как SWF загружается ,

это проблема только с флэш IDE компилятор ... С Flex компилятора это не нужно ...

попробовать:

private var sheet:BitmapData = new sheetClass(0,0); 

изменить ваш класс SpriteSheet принять BitmapData непосредственно

+0

'new sheetClass() как Bitmap' более вероятно нет? – Kodiak

+0

Пробовал первое предложение и получил ошибку: Ошибка # 1112: несоответствие счетчика аргументов при принуждении класса. Ожидаемое 1, получено 0. Затем я попытался добавить Kodiak и поставить: private var sheet = new sheetClass как Bitmap; и получил исходную ошибку. – Lapys

+0

извините, мой должен был быть Bitmap (новый Sheetclass()); (нет нового) Путь Кадьяка тоже должен работать. – andygoestohollywood

Смежные вопросы