调用函数改变向量后绘制的位图消失

时间:2011-05-13 23:48:55

标签: flash actionscript-3 adobe

我想在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或测试圈。这让我相信这是图形属性本身的问题。这让我完全难过。关于它可能是什么的任何想法?

1 个答案:

答案 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}}