2015-09-21 72 views
1

嘿大家我已經看到一些關於這個論壇,但似乎無法弄清楚仍然。如何獲得隨機生成的數字沒有重複

所以我有一個名爲aClockArray的數組,這是一個自定義數組,裏面有4個影片剪輯。嵌套的影片剪輯對每個幀都有不同的顏色。我已在陣列設置像這樣在我的構造函數:

aClockArray = [playScreen.wire_5, playScreen.wire_6, playScreen.wire_7, playScreen.wire_8]; 
在另一個函數

然後,我有一個for循環建立通過所有對象的數組進行迭代,並讓他們gotoAndStop在他們的嵌套影片一個隨機幀它夾

private function randomColorGenerator():void 
    { 
     //Loop through wires and make them randomn generate color 
     for (var i:int = 0; i < aClockArray.length; i++) 
     { 
      var currentWires = aClockArray[i]; 

      nWire = randomNumber(2, 7); 

      currentWires.gotoAndStop(nWire); 


     } 
    } 

現在這個完美的作品,我也得到隨機顏色我每次重啓時間:2-7我有它隨機像這樣去。但我想要完成的是顏色不要重複,所以不要重複2至7個數字。我會如何去做這些事情,讓這些數字隨機生成而不是重複?

而且這裏是我的randomNumber功能:

//Generates a truly "random" number 
    function randomNumber(low:Number=0, high:Number=1):Number 
    { 
     return Math.floor(Math.random() * (1+high-low)) + low; 
    } 

感謝您的幫助,將不勝感激!

嘗試過這樣的事情,但仍然有重複:(

//Loop through wires and make them randomn generate color 
     for (var i:int = 0; i < aClockArray.length; i++) 
     { 
      var currentWires = aClockArray[i]; 
      var frames:Array = [2, 3, 4, 5, 6, 7, 8]; 
      var randomFrame:uint = frames.splice(Math.floor(Math.random() * frames.length), 1); 


      currentWires.gotoAndStop(randomFrame); 


     } 

回答

3

創建唯一可能的結果的數組:

var frames:Array = [2, 3, 4, 5, 6, 7]; 

然後從該數組在隨機指數與splice刪除:

var randomFrame:uint = frames.splice(Math.floor(Math.random() * frames.length), 1); 
+0

感謝您對本病的讓你知道如何去後的今天,當我嘗試一下! – Nathan

+1

它可能會略有* *更快第一隨機排列,然後用'POP()'或'移()'(什麼@Flashist是*試圖*完成),不過這也是一個很好的解決方案和最緊湊。除非你每幀都在運行代碼,否則不應該有任何性能差異。 – BadFeelingAboutThis

+0

仍然困惑我將如何實現這一點。我仍然會用我目前的Loop嗎?添加這樣的東西,並從那裏拼接? – Nathan

-3

我不會給你確切的代碼,因爲我不寫在一個ctionscript。但是,你只需要保存你使用的最後一種顏色,並避免它:

{next_color = randomNumber(2,7)} until next_color != last_color; 
currentWires.gotoAndStop(next_color); 
last_color = next_color; 

中提琴!僞隨機顏色。

+0

有趣謝謝你的建議,我一定會嘗試今天! – Nathan

+0

確保第一個和第三個號碼不同嗎? – null

+0

這不是一個正確的解決方案。 – BotMaster

3

我建議是這樣的:

  1. 創造價值的預定義列表
  2. 隨機化列表
  3. 移列表的第一個值在每個迭代

例如:

import flash.display.MovieClip; 

    function randomizeSort(obj1:Boolean, obj2:Object):int 
    { 
     var randNum:int = -1 + Math.floor((Math.random() * 3)); 
     return randNum; 
    } 

    var framesList:Vector.<int> = Vector.<int>([2, 3, 4, 5, 6, 7]) 
    framesList.sort(randomizeSort); 
    trace(framesList); 

    var tempColor:int; 
    var clipsList:Vector.<MovieClip> = Vector.<MovieClip>([playScreen.wire_5, playScreen.wire_6, playScreen.wire_7, playScreen.wire_8]); 
    var clipsCount:int = clipsList.length; 
    for (var clipIndex:int = 0; clipIndex < clipsCount; clipIndex++) 
    { 
     tempColor = framesList.shift(); 
     trace(tempColor); 
    } 
+0

@BadFeeling關於這不是構造函數,而是[頂層函數Vector。 (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package.html#Vector%28%29)另一個速記'VECTOR'符號是['新 [1,2,3 ]'](http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee5.html#WSB1F41227-C612-4f33-A00E-CE84C1913E1C) – null

+0

@null - 我站在糾正。猜猜我需要更頻繁地使用速記。並不是說我在一年的較好時間裏甚至已經完成了一個AS3項目。 – BadFeelingAboutThis

1

這是原型設計的理想人選:

MovieClip.prototype.gotoRandomFrame = function():void 
{ 
    if(!this.frameReferences) 
    { 
     this.frameReferences = []; 
     for(var i:int = 0; i < this.totalFrames; i++) 
     { 
      this.frameReferences.push(i + 1); 
     }  
    } 
    var index:int = this.frameReferences.splice(Math.floor(Math.random() * this.frameReferences.length), 1); 
    if(!this.frameReferences.length) 
    { 
     this.frameReferences = null;   
    } 
    this.gotoAndStop(index); 
} 

THX這個原型,你現在可以調用任何mocieclip這種方法,讓他們展示自己的時間表獨特的幀,直到他們已經顯示他們所有,他們重新開始。

mymovie.gotoRandomFrame(); 

其他答案是正確的,但它們沒有考慮到多個動畫片段的情況。必須創建與影片剪輯一樣多的代碼和數組,這將是很糟糕的。

+1

如果您編輯原型,您將爲每個實例創建一個數組(無論您是否需要該功能)。最好創建一個類定義,並將其擴展到其他Class或將其設置爲MovieClip符號的Class。 –

+0

@AmyBlankenship我不喜歡或者使用原型,但說句公道話,'frameReferences'陣列僅被連接,如果你調用'gotoRandomFrame()'方法。 – Aaron

+0

如何實現這一點仍然有點混亂。仍然沒有運氣去它。試過Nulls方法但沒有運氣 – Nathan