2011-08-09 6 views
1

ローダーオブジェクトからのビットマップデータがあり、タイルとして使用するために32x32の正方形にスライスしたいと思います。それを行う最も効率的な方法は何ですか?Actionscript 3:ビットマップをタイルにスライスする

+0

それを行うための最善の方法は、* *タイルに分割ではなく、(答えで述べたようにCopyPixelsを使用して)先のキャンバスに、元のソーステクスチャから直接タイルをブリットしないことです。 –

答えて

1

BitmapDataファンクションcopyPixelsを使用できます(linkを参照)。これを使用すると、ソースBitmapDataの1つの領域(Rectangleで指定)から、BitmapDataの特定のPointにピクセルをコピーできます。基本的には、各32x32四角形に対して新しいBitmapDataを作成し、ロードされたオブジェクトをループさせて、copyPixelsで四角形を埋めることができます。

5

私はあなたのために仕事をしました。基本的な考え方は、BitmapData関数copyPixelsを使用することです。アドビリファレンスを参照してください。これを使用すると、ソースBitmapDataの1つの領域(Rectangleで指定)から、転送先BitmapData内の特定のPointにピクセルをコピーできます。私は32x32の正方形ごとに新しいBitmapDataを作成し、ロードされたオブジェクトをループして、copyPixelsで四角形を設定しました。

var imageLoader:Loader; 

function loadImage(url:String):void 
{ 
    // Set properties on my Loader object 
    imageLoader = new Loader(); 
    imageLoader.load(new URLRequest(url)); 
    imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imageLoading); 
    imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded); 
} 
loadImage("Cow Boy.jpg");//--------->Replace this by your image. I hope you know to specify path. 
function imageLoaded(e:Event):void 
{ 
    // Load Image 
    imageArea.addChild(imageLoader); 

    var mainImage:BitmapData = new BitmapData(imageArea.width,imageArea.height); 
    var tileX:Number = 36; 
    var tileY:Number = 36; 
    var bitmapArray:Array; 

    var tilesH:uint = Math.ceil(mainImage.width/tileX); // Number of Columns 
    var tilesV:uint = Math.ceil(mainImage.height/tileY);// Number of Rows 

    mainImage.draw(imageArea); 
    imageArea.x += 500; 

    bitmapArray = new Array(); 

    for (var i:Number = 0; i < tilesH; i++) 
    { 
     bitmapArray[i] = new Array(); 
     for (var n:Number = 0; n < tilesV; n++) 
     { 
      var tempData:BitmapData=new BitmapData(tileX,tileY); 
      var tempRect = new Rectangle((tileX * i),(tileY * n),tileX,tileY); 
      tempData.copyPixels(mainImage,tempRect,new Point(0,0)); 
      bitmapArray[i][n]=tempData; 
     } 
    } 

    for (var j:uint =0; j<bitmapArray.length; j++) 
    { 

     for (var k:uint=0; k<bitmapArray[j].length; k++) 
     { 

      var bitmap:Bitmap=new Bitmap(bitmapArray[j][k]); 
      this.addChild(bitmap); 
      bitmap.x = (j+1)* bitmap.width + j*10; 
      bitmap.y = (k+1)* bitmap.height + k*10; 

     } 
    } 



} 
function imageLoading(e:ProgressEvent):void 
{ 
    // Use it to get current download progress 
    // Hint: You could tie the values to a preloader :) 
} 
関連する問題