0

だから私はスプライトシートを読み込もうとしています。.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
4

1 に答える 1