だから私はスプライトシートを読み込もうとしています。.swf に埋め込んだのですが、クラスをインスタンス化し、スプライト シートからクリッピングを開始する関数を呼び出すと、次のエラーが発生します。
「パラメータ sourceBitmapData は非 null でなければなりません。」
スプライト シート イメージが実際に読み込まれる前にコードが呼び出されていることはわかっていますが、ローダーを使用するのではなく埋め込みを行っているため、この問題を解決する方法がわかりません。イベントリスナーを使用する必要があると思いますが、埋め込みでそれを機能させるにはどうすればよいですか? これまでの私のコードは次のとおりです。
Main public クラスで:
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 クラスでは、copyPixels() を呼び出す drawTile 関数を呼び出します。エラーの原因は次のとおりです。
canvasBitmapData.copyPixels(tileSheetBitmapData, tileRectangle, tilePoint);
これは大量のコードであることはわかっていますが、おそらく簡単な解決策があると思います。どんなフィードバックでも大歓迎です。ありがとう!
編集: 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