random函數詳解

來源:互聯網
上載者:User
dom|函數|詳解    關於FLASH的效果,我想大家都想做出那種“不但讓人一看忘不了,而且看了還想看”的效果吧?“一看忘不了”固然是高手作品,“看了還想看”也需要深厚功底和作品豐富的內涵。作為我們菜鳥,自然一時半全達不到那種高度。但是我們至少可以做到讓人“每次看都有新鮮感”,關鍵是什嗎? ActionScrpt!

    當然,如題,我是想講random函數.AS其它方面的就留給高手了.這篇是獻給菜鳥們看的.雖說是給菜鳥看的,但是我也假定菜鳥們還是會一點點AS,至少對於我給的代碼能夠運用到作品中去.

    這幾天,帝國論壇的AS區和新手區可能因為聖誕了,都在問"如何做雪花",我也給了個例子,高手也給了幾個源檔案,其中的一個關鍵語句就是random()函數.雪共本身倒是好做,畫一個白圓就完事了,雪花下降也可以用一個運動漸層(以前看過一個下雨的效果就是這樣做的),主要的還是雪花的出現位置,所以,我們就用了random(550)來隨機播放一個y座標,x座標當然是0.這樣紛紛揚揚的雪花就不再單調地"迴圈播放"了,而是永遠沒有重複.

    好了,上面這麼多廢話算是引子,下面是正題.

    我先說一下提綱,開始是介紹一下random()函數和Math.random()函數,然後介紹一些由此引出的自訂函數.對於如何實戰出一些效果,那需要想象的翅膀和其它AS基礎的支援.而演算法本身並不困難.最後我會介紹一個簡單效果.希望能啟發讀者的思維.

1、random(number)函數介紹
見協助文檔,簡單再提一下,random(number)返回一個0~number-1之間的隨機整數.參數number代表

一個整數.
樣本:

trace(random(5));//複製到主情境第一幀.

2、Math.random()
見協助文檔。返回一個有14位精度的0~1之間的數,注意沒有參數。聽說MM是推薦用這個函數的,而不是上面那個.個人覺得前一個還是好用一點.
樣本:

trace(Math.random());//複製到主情境第一幀.

3、自訂的函數
MM給我們的就這兩個函數了,但是需求與供給總是存在矛盾。我們有時候需要的隨機數可不是這麼簡單。比如我們想返回一個有兩位小數的隨機數,返回兩個數之間的隨機數,返回字母隨機數,返回多個隨機數等等,這些都需要我們自己編寫函數來實現。下面的代碼直接複製到主情境第一幀就可以調用了。注意有的函數需要入口參數。

# 返回一個共有n位元,其中m位是小數的隨機數

function randomXiao(n,m){  var a = Math.pow(10, n+m);  var b = random(a);  return b=b/Math.pow(10, m);}

大家可以用trace(randomXiao(3,2));來實驗一下。這個函數是很簡單的了。Math.pow(n,m)用於返回一個以n為底,m為指數的數。就是乘方啦!

# 返回一個n到m之間的隨機數

function randomNm(n,m){  if(m>=n){    return random(m-n+1)+n;  }  else {    return false;  }}

之所以用random(m-n+1)是因為隨機數的範圍是m-n,加上1使得m也能在裡面。加上n保證隨機數以n為下限。加上判斷使函數更完整。另外,如果要返回一個負數隨機數,也可以用randomNm(n,0);當然,我想更一般的是用-random(n);

# 返回一個字母

function randomAscii(){  var c = String.fromCharCode(random(26)+65);  if(random(2)){    return c.toLowerCase();  }  return c;}

返回一個不區分大小寫隨機字母

如果要返回大寫,把if條件句去掉就行了。如果要返回小寫,可以把條件句改為恒成立,或者去掉條件,最後一句改為:return c.toLowerCase(); String.fromCharCode(number)函數返回number代表數位ASCII碼。toLowerCase()用於將大寫字母轉為小寫。

# 返回一個n到m之間的k個互異隨機數

function randomKdiffer(n,m,k){  arrayK = [];  var i = 0;  while (i < k) {   a = random(m-n+1)+n;   for (var j = 0; j < i; j++) {    if (a == arrayK[j]) {      break;    }   }   if (j == i) {    arrayK[i] = a;    i++;    }  }  return arrayK;}

數組arrayK中的元素即為所得值。注意到我們借用了random(m-n+1)+n來返回一個n~m的隨機數。所以m本身也會被返回。如果要返回m以內的數,可以把n值改為0。如果要隨機返回不確定個數,可以把入口參數的K值賦為k=random(m-n);隨機返回不一定互異的數,把判斷去掉就可以了,注意i++不要漏掉。這裡不再給出。

#指定若干個字元/數字,然後從中隨機返回一個(或多個)字元/數字,可以把原字元賦給一個數組,再根據數組的下標來決定傳回值。這裡不再舉出函數,大家可以自己嘗試。

#另需指出,對於隨機設定一個MC的顏色值,我們較多採用mcColor.setRBG(random(0xFFFFFF));下面的例子中會有說明。如果要指定一個色域,可以採用上面給出的函數。如果對Color對象不太瞭解的可以查協助,這裡不作討論。

以上函數算是由random直接衍生的,下面再舉個例子,可以說是衍生函數的衍生函數,其中會直接用到上面給出的函數,請注意。

#返回一個指定長度的隨機大寫英文字串

function randomString(n){  var arrayA = randomKdiffer(1, 26, n);  var arrayB = "";  for (var i = 0; i < n; i++) {    c=String.fromCharCode(arrayA[i]+64);    /* if(random(2)){         c=c.toLowerCase();       }    */    arrayB = arrayB+c;  }  return arrayB;}

注意到StringCharCode方法,如果要寫成小寫,則把傳回值寫成arrayB.toLowerCase();如果返回一個不區分大小寫字串,則把注釋去掉.如果要返回一個不指定長度的字串,則可以把入口參數賦值為random(n);這樣只指定其上限.此函數也可以用randomAscii函數實現,留給大家自己思考.

#在幾個地區中選出隨機數

比如,在1~20,45~70這兩段數之間選取一個隨機數。因為地區數未定,所以直接用一個確定的函數編寫多有不便,我們要使用的方法就是用switch語句進行定向,具體的我們給出一個函數,返回一個1~20,45~70內的數,其它地區讀者請自行更改。

function randomArea(){  var a=random(2);  switch(a){    case 0:     return randomNm(1,20);break;    case 1:    return randomNm(45,70);break;  }}

注意,我們並沒有寫入口參數,而是直接在函數中就確定了是兩段數,而且範圍也是確定的。如果是三段,則改為a=random(3);同樣增加一個case就可以了。當然,你也可以把第段數的範圍設為入口參數,這裡就不再舉例了。但是這樣做可能會使參數增多,我個人是不太喜歡一個需要很多參數的函數的。類似的,我們也可以隨機返回一個字母段或幾個字母段或者字母加數欄位的一個數。方法也只是前幾個函數的一個結合。這裡僅舉一例,返回指定的大寫字母段的一個隨機字母。提醒一下,小寫字母的ASCII碼a~z分別對應97~122.

function randomAArea(a,b){  if (ord(a) <= ord(b) && 65<=ord(a) && ord(b) <= 90) {    return String.fromCharCode(randomNm(ord(a), ord(b)));  } else {    return false;  }}

其中用到一個函數ord(char),這是一個不推薦的函數.用於返回char字元的ASCII碼。

如果大家想在任何地方調用函數,則需要稍稍變一下,把我們寫的函數改變為全域函數.這樣就可以不用標明路徑而自如地向調用系統函數一樣了.方法如下.例如:函數randomXiao如果要聲明為全域函數,需要把第一行改為:

_global.randomXiao=function(n,m){//statment}

對全域函數的概念不很清楚的朋友不用被這個名詞嚇倒. 這樣改了函數第一行之後,在任何地方,比如在一個MC裡,直接用(對,直接用,不用加_root路徑了)randomXiao(n,m)就可以了.

有興趣的朋友還可以根據這些函數衍生其它函數,比如一個有數字和英文字母的隨機字串.

說了這麼多,為什麼沒有說Math.random()呢?

因為在下認為,這個方法太"專業"了,在普通做效果的過程中還是用random(n)好一點. MM為什麼推薦我不得而知.

如果有朋友不清楚的,可以下載源檔案看看.為了方便,源檔案中的函數我全改成了全域函數.可以直接複製到你的作品中使用,當然,也可以寫在外部檔案.as中調用.

源檔案下載

4.執行個體應用

想來想去,好像覺得執行個體也沒什麼好講的,因為一旦講起來,無外乎都必須是對語句的解說,演算法的說明,沒有什麼閃光點,關鍵還是一個創意,另外就是基本功:對AS的熟悉程度了。但是為了完整性,我還是給出一個例子,裡面的代碼非常簡單,圖畫我是沒有天份,如果您有興趣改造一下,我相信效果還是很不錯的。

先來看看效果:

這個效果來源於一個網站上,而小條的顏色變化是我加的,因為正好說明一下setRGB的用法。

先把小條中的代碼貼出:

onClipEvent (load) {  i = 0;  a = random(10)-5;  if (a == 0) {    a = 1;  }  col = new Color(this);}onClipEvent (enterFrame) {  this._x += a;  i++;  if (i >= 36) {    col.setRGB(random(0xFFFFFF));    a = random(10)-5;    if (a == 0) {      a = 1;    }    trace(a);    i = 0;  }  if ((this._x+this._width) <= 0) {    this._x = 550+this._width;  }  if ((this._x-this._width) > 550) {    this._x = 0-this._width;  }}


可以看到,bar(小條太俗,改稱bar)有兩個事件方法,一個load,一個enterFrame。通常load用來初始化一些變數,事件是在MC被載入時觸發的。而enterFrame則是每播放一幀就執行一次代碼。先解釋一下變數。i是控制幀數的。可以看到,因為每一幀都執行一次enterFrame中的代碼,而其中有i++,所以這是用來記錄已播放幀數的。a是用來設定速度的,因為在enterFrame中有this._x+=a;正如前面所說,enterFrame事件是指的MC每播放一幀都會執行一次其中的代碼,所以每播放一幀bar的橫座標就會改變a個像素。col是一個顏色對象,作用是對MC的顏色進行改變。而col=new Color(this);意為定義這個對象,並把它與當前的MC對象建立關聯。如果不好想象沒有關係,下面我們會再提到。

需要再次指出,load事件是在MC載入時執行,所以只執行一次(你沒有必要對同一個對象不停地載入吧?),而enterFrame是每一幀都會執行的,或者可以這麼說:enterFrame中的代碼會以幀率被執行。比如幀率為12,那麼就每秒執行12次。運用它可以做出物體移動效果,或是更常用的,反彈球效果。不過這超出了我們的討論範圍了。

接下來是enterFrame中的代碼。剛才已經說過,this._x+=a;與i++; ,這兩個是主要的。後面的是條件控制語句。第一個if是判斷已經播放的幀數,當播放了36幀時(這裡正好三秒,注意,主就算MC本身只有一幀,或是主情境中只有一幀,enterFrame事件仍然在以幀率執行,所以上面的後一總解釋更適當),重新確定MC的顏色:col.setRGB(random(0xFFFFFF));前面我們說過,col是一個顏色對象,而且已經與當前的MC關聯,那麼,col所代表的就是當前MC的顏色了。 這樣說不知是不是更好理解。 而該對象有一個setRGB方法,可以設制MC的顏色值。這裡我們使用16進位的隨機數,而FFFFFF是顏色值中的最大值。隨便說一下,FFFFFF是白色。 FF0000是紅色。000000是黑色。

下面一句a=random(10)-5;是設定a的值,也就是MC的速度。當然,您可以使用我們定好的函數randomNm來規定一個範圍,但是這裡我不想再寫一個函數。運算式是得到一個-5~4之間的隨機數,之所以要有負數,是因為我們想出現那種可以左右移動的效果,而不是只向一個方向。

再下面兩句是限定了移動的範圍,如果超出了左右邊界,就讓它從另一端出來。

好了,看來我們寫的那麼多函數都沒有用到。的確,這裡是沒有用到,不過會有地方的。只要你肯讓你的想象騰飛。

等等,還有一個圓輪的效果沒有說呢!對不起,這個代碼是留給您自己察看的,比第一個簡單,因為我幾乎是照搬了第一個的代碼。

很多效果都必須是關於複製影片剪輯的,比如下雪下雨,複製出來後隨機控制出現位置。這裡也最好是用enterFrame來控制運動的路徑。 但是複製不是我們所講的重點,這裡只是提醒您一下。另外,結合滑鼠產生隨機效果也是非常炫的,而製作通常是不複雜的。

用AS的隨機+複製+迴圈炮製出一個星空,或者一群蚊子(只要您願意)都是小菜。只要您懂得如何正確使用這些基本的語句。

源檔案下載



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。