仅在一个纹理中绘制多个位图

时间:2013-09-30 14:26:59

标签: algorithm actionscript-3 flash

我有一系列图片,每张都是128 * 128。图片数量为36。 我想将它们分组在一张图片中,以便它们被绘制成:

public static const SIZE : int 1024;
public var img1 : Bitmap;
public var img2 : Bitmap;

var bmp:BitmapData=new BitmapData(SIZE,SIZE,false,0);

//Draw img1 at 0,0
bmp.draw(img1); 

//Draw img2 at 512,0
bmp.draw(img2, new Matrix(1,0,0,1, SIZE/2, 0)); 

//Draw img1 at 512,512
bmp.draw(img1, new Matrix(1,0,0,1, SIZE/2, SIZE/2)); 

//Draw img1 at 0,512
bmp.draw(img2, new Matrix(1,0,0,1, 0, SIZE/2));  

我的问题是我想提出一种算法来放置图像而不管数字,这样我就不会通过静态代码创建图像..如果你不能使用伪代码它会有所帮助AS3。

2 个答案:

答案 0 :(得分:2)

var images:Vector.<Bitmap> = new Vector.<Bitmap>();
images[0] = bmp1;
images[1] = bmp2;
// etc...

var i:int = 0;
var l:int = images.length;
var maxWidth :int = 0;
var totalHeight:int = 0;
var matrix:Matrix = new Matrix();
var render:Bitmap; // your final render


// find how tall will be the picture:
for ( i = 0; i < l; i++ ) {
    maxWidth = Math.max(maxWidth , images[i].width); // find the widest image
    totalHeight += images[i].height; // find the total height of your image
}

// create the render container based on the data we just found out:
render = new Bitmap( new BitmapData( maxWidth , totalHeight, true, 0xff00ff ) );

// draw!
for ( i = 0; i < l; i++ ) {
    render.bitmapData.daw(images[i], mat);
    matrix.translate(0, images[i].height);
}

我无法测试它,但它应该可以工作,或者至少让你朝着正确的方向前进。让我知道!

答案 1 :(得分:1)

一般的想法是将较小的图像复制到较大的图像,从顶部开始向右移动,并在顶行已满时向下移动到下一行。

因此,假设您要填充BigImage,并且要放入一个SmallImages数组,算法看起来像:

xpos = 0
ypos = 0
for i = 0 to number_of_small_images-1
    draw SmallImages[i] on BigImage at position (xpos, ypos)
    xpos += small_image_width
    if (xpos >= big_image_width)
        xpos = 0
        ypos = ypos + small_image_height

这是基本的想法。你必须使用你正在使用的任何编程语言来充实代码。