2011-05-13 19 views
0

我想隨機化矢量中的動畫片段位置。添加到主舞臺的顯示列表中。我有這個功能,與它們的特性生成的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函數,Bitmaps繪製得很好。但是,如果我在我的Vector上調用shuffle函數。在我將它們添加到顯示列表(我已經測試並知道正在發生)後,某些影片剪輯不會顯示在屏幕上。一些隨機出現,一些則沒有。每次運行我的應用程序時顯示哪些顯示,哪些顯示爲隨機(可能與我的initMovieClips函數有關,後者使用僞隨機代碼?)。

我已經試過在我的代碼中的不同點執行洗牌功能,在已經繪製位圖的地方,以及我甚至沒有調用函數開始加載位圖的地方(所以我不用不認爲這是一個線程問題)。我甚至嘗試插入代碼在每個MovieClip的圖形屬性上繪製一個簡單的測試圈。只是爲了看看它是否是Bitmap的問題,但是沒有繪製的那個沒有顯示位圖或測試圈。這導致我相信這是圖形屬性本身的問題。這讓我完全陷入了沉思。任何想法可能是什麼?

+0

無論如何,這不會是一個線程問題,因爲flash在單線程上運行。 – 2011-05-14 02:26:52

+0

我認爲除了網絡相關的東西(加載等)之外,一切都在一個線程上運行。 – whitneyz 2011-05-16 16:55:21

回答

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。長度很大請試試http://en.wikipedia.org/wiki/Shuffling#Shuffling_algorithms

+0

如果delete將vector的值保留爲null,而不是整體調整vector的大小,那麼情況就是這樣。我會研究它。 – whitneyz 2011-05-16 16:56:48