2009年12月23日 星期三

[AS2] 按下按鈕,隨機載入不同影片,每一輪不重覆

因應知識+之提問,而試作的 Flash8 _ AS2
http://tw.knowledge.yahoo.com/question/question?qid=1509111900802
這問題乍看簡單,仔細想想,其實還有點小難度(至少對我來說啦!!!)
比如說有6個影片要依亂數產生的順序載入, 但每一輪的6次按下按鈕,都不能重覆載入相同的影片
該怎麼做到呢?
技巧上大概類似做大樂透之方式,用操作陣列元素的slice()方法.
我的做法是~
每一輪第一次按下按鈕時,先產生6個亂數,並依序存入index陣列, 且將第一個影片附加進來
而後,按第2~第6次按鈕, 則分別附加第2~第6個影片元件進來,替代前一個
元件庫中先建置6個影片片段元件,並設好[連結]識別名稱,分別為,mc1~mc6


第一影格AS2~~~
//num: 附加影片之數量,元件庫中要有相對數量的影片元件,並設好連結識別名稱
//若只要展示3個影片元件,就設成 var num:Number = 3; 即可
var num:Number = 6;
//用來被取出和移除元素之陣列
var mcNumArr:Array = new Array();
for (var i:Number = 1; i<=num; i++) {
 mcNumArr[i] = i;
}
//亂數取出後存放之陣列
var index:Array = new Array();
//clickCount : 點擊次數之累加變數
var clickCount:Number = 0;
//呼叫getRandom(),取得一輪的亂數排序
getRandom();
//按鈕事件函式,累加點擊次數;
//滿一輪時clickCount設回1,呼叫resetArr()重設mcNumArr陣列元素;呼叫getRandom()再次取得新的一輪的亂數排序
play_mc.onRelease = function() {
 if (clickCount
  clickCount++;
 } else {
  clickCount = 1;
  resetArr();
  getRandom();
 }
 //依index陣列之元素順序,附加元件庫中的影片元件,到container實體中
 this._parent.container.attachMovie("mc"+index[clickCount], "mc"+index[clickCount], this._parent.container.getNextHighestDepth());
};
//亂數產生,取出mcNumArr陣列元素,存入index陣列,刪除已取出之mcNumArr陣列元素---> 取得一輪的亂數排序,存入index陣列
function getRandom() {
 for (var i = 1; i<=num; i++) {
  var rad:Number = Math.floor(Math.random()*(mcNumArr.length-1))+1;
  trace("rad: "+rad);
  trace("mcNumArr.length-1: "+(mcNumArr.length-1));
  index[i] = mcNumArr[rad];
  trace("index[i]: "+index[i]);
  mcNumArr.splice(rad, 1);
 }
}
//每一輪點擊後,重設mcNumArr陣列之元素
function resetArr(){
 for (var i:Number = 1; i<=num; i++) {
  mcNumArr[i] = i;
 }
}


SWF預覽

FLA下載
http://sites.google.com/site/terfict3/home/981119_as2_random.fla

沒有留言: