Flash AS3.0中如何使从库中加载到舞台上的多个元件,随机坐标显示的时候不相互重叠?

2024-10-28 13:25:47
推荐回答(1个)
回答(1):

我好象回答了这个问题,其实这个问题不是简单的问题哟。
import flash.display.Shape;
var ballN:uint = 20;
//此为最大球的半径
var ballR:Number = 50;
var gAr:Array=new Array();
var ballAr:Array = [];
const stageW:Number = stage.stageWidth;
const stageH:Number = stage.stageHeight;
//格子的数量
var gw:uint = uint(stageW / ballR);
var gh:uint =uint( stageH / ballR);
if (ballN>gw*gh)
{
ballN = gw * gh;
}
//我们创建一个没有任何球的空格子数组,用以将重复的球填充到这些空格子中
var nullAr:Array = [];
var 重复格子:Array = [];
//现在创建一个绘制球的函数
function drawBall(vol:Number):Shape
{
var ball:Shape=new Shape();
with (ball.graphics)
{
beginFill(0x880000,1);
drawCircle(0,0,vol);
endFill();
}
return ball;
}
//现在创建球,并随机分布在舞台上
for (var i:uint=0; i{
var ball:Shape = drawBall(Math.random() * ballR * 0.25 + ballR * 0.25);
ballAr[i] = ball;
ball.x = Math.random() * stageW;
ball.y = Math.random() * stageH;
addChild(ball);
}
//创建格子数组
for (var gm:uint=0; gm{
for (var gn:uint=0; gn {
//我们在这创建二维数组,第个格子看成一个二维数组中的成员
var 格子数组:Array = [];
gAr.push(格子数组);
}
}

//现在我们用另外一个循环来将格子推进这个二维数组
for (var k:uint=0; k{
var m:uint = Math.floor(ballAr[k].x / ballR);
var n:uint = Math.floor(ballAr[k].y / ballR);

//下面我们把坐标重新排列一下,
ballAr[k].x = m * 50;
ballAr[k].y = n * 50;
gAr[gw * n + m].push(ballAr[k]);
}
//下面我们来看一下有哪个格子有重复的;
for (var mm:uint=0; mm{
if (gAr[mm].length == 0)
{
nullAr.push(mm);
}
else if (gAr[mm].length>1)
{
重复格子.push(gAr[mm]);
}
}
var 重复格子数 = 重复格子.length;
var index:uint = 0;
//现在把重复的从新填充到空格子中
for (var _i:uint=0; _i<重复格子数; _i++)
{
//这个的前提是球的总是不能大于gw*gh
for (var _m:uint=0; _m<重复格子[_i].length-1; _m++)
{
index++;
var num:uint = nullAr[index];
重复格子[_i][_m].x = (num % gw) * ballR;
重复格子[_i][_m].y = Math.floor((num / gh)) * ballR;
}
}