我想在Vector中随机化MovieClips的位置。要添加到主舞台的显示列表中。我有这个函数生成MovieClip及其属性:
private function initMovieClips():Vector.<MovieClip>
{
var initVec:Vector.<MovieClip> = new Vector.<MovieClip>();
for (var i:int = 0; i < Math.ceil(this.numBlocks / 2); i++)
{
var typeVarianceChance:Number = Math.random();
var colorVarianceChance:Number = Math.random();
var ranType:Number = Math.floor(this.numTypes * Math.random());
var coRanType:Number;
if (typeVarianceChance < .2)
{
coRanType = Math.floor(this.numTypes * Math.random());
} else {
coRanType = this.typeHash[ranType];
}
var ranColor:Number = Math.floor(this.imageURLs.length * Math.random());
var coRanColor:Number;
if (colorVarianceChance > .1)
{
coRanColor = Math.floor(this.imageURLs.length * Math.random());
} else {
coRanColor = ranColor;
}
var mc:MovieClip = new MovieClip();
var comc:MovieClip = new MovieClip();
mc.type = ranType;
comc.type = coRanType;
mc.color = ranColor;
comc.color = coRanColor;
initVec.push(mc,comc);
}
return initVec;
}
然后加载位图并将其绘制到每个图像上。然后,我调用此函数随机“洗牌”Vector。
private function shuffle(vec:Vector.<MovieClip>):Vector.<MovieClip>
{
var shuffled:Vector.<MovieClip> = new Vector.<MovieClip>();
var origLength:uint = vec.length;
for (var i:int = 0; i < origLength; i++){
var ranPos:uint = Math.floor(Math.random() * vec.length);
shuffled.push(vec[ranPos]);
delete vec[ranPos];
}
return shuffled;
}
如果我不调用shuffle函数,则可以很好地绘制位图。但是,如果我在我的Vector上调用shuffle函数。在我将它们添加到显示列表(我已经测试并知道正在发生)之后,一些MovieClip不会显示在屏幕上。有些随机出现,有些则没有。每次运行我的应用程序时哪些显示以及哪些显示不是随机的(可能它与我的initMovieClips
函数有关,它使用伪随机代码?)。
我已经尝试在我的代码中的不同点实现shuffle函数,在已经绘制了位图的地方,以及在我甚至没有调用函数来开始加载位图的地方(所以我不喜欢)认为这是一个线程问题)。我甚至尝试插入代码在每个MovieClip的图形属性上绘制一个简单的测试圆。只是为了看看它是否是Bitmaps的一个问题,但没有被绘制的那个没有显示Bitmap或测试圈。这让我相信这是图形属性本身的问题。这让我完全难过。关于它可能是什么的任何想法?
答案 0 :(得分:0)
我认为可能是在for循环中。你正在循环你的vec的长度(在这种情况下,我将假设是initVec)。但是为了获得vec的索引,你可以随机化
var ranPos:uint = Math.floor(Math.random() * vec.length);
shuffled.push(vec[ranPos]);
所以现在发生的事情是,虽然你可能得到从0到vec长度的值,但你可能会重复两次相同的值。因此,如果vec.length = 5,你可能得到1,2,3,2,4,在这种情况下你缺少5并得到2两次,这个顺序基本上是“随机的”所以在大规模你可能不会去你的vec []值
这样做的另一种方法是使用while循环,如果随机带来一个已经使用过的索引重试,直到所有索引值都被使用(暴力),如果你是vec.length是大量的尝试{{ 3}}