Так что я пытаюсь загрузить лист спрайта. Я встроил его в .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
Вы отслеживали или отлаживали ваши битмапДата в этой точке или в конструкторе? – Kodiak
Есть строка в SpriteSheet в основной функции, где я вызываю drawTile (0), и комментируя это, я дал новую ошибку: Не удается получить доступ к объекту или методу нулевой ссылки объекта В моей главной функции. Поэтому теперь я думаю, мне нужно проследить, почему это происходит. Хм. – Lapys
Вы не говорите о drawTile в своем вопросе, пожалуйста, давайте сосредоточимся на этом недостающем bitmapData :) – Kodiak