入門級技巧:FLASH 編程心得

來源:互聯網
上載者:User
編程|技巧|心得

  其實我本人水平也不怎麼樣,今天之所以搞出個編程心得(主要是自己的一點點經驗總結)的介紹,主要是想協助有興趣往深處研究AS的朋友,由於個人的水平有限,其中難免有謬誤,歡迎大家討論糾正。一來,協助我進步;二者也是更重要的是,防止初學者養成不好的編程習慣! 廢話說多了,下面開始:

  一.FLASH有三個地方可以加代碼,主要畫面格,MC(影片剪輯),按鈕。

  1.主要畫面格上加代碼的靈活性很大,建議初學者:能寫在MC或者按鈕上的代碼,就盡量不要寫在主要畫面格上,主要畫面格上添加代碼後,會出現一個a,如圖一:


2.按鈕上加代碼的一般格式為:
on(mouseEvent){
statements;
} mouseEvent:觸發事件關鍵字,表示要撲獲得事件。
statements:任意行數的可以執行程式代碼。 滑鼠可撲獲的事件如下:
press:當按鈕被按下時觸發該事件
release:當按鈕被釋放時觸發該事件
releaseOutside:當按鈕被按住後滑鼠移動到按鈕以外並釋放時觸發該事件
rollOut:當滑鼠滑出按鈕範圍時觸發該事件
rollOver:當滑鼠滑入按鈕範圍時觸發該事件
dragOut:當按鈕被滑鼠按下並拖拽出按鈕範圍時觸發該事件
dragOver:當按鈕被滑鼠按下並拖拽入按鈕範圍時觸發該事件
keyPress("key"):當參數(key)指定的鍵盤按鍵被按下時觸發該事件 舉個例子:
on(press){
_root.text="學習FLASH!"
}//當按下按鈕時,主情境中的文字框顯示文字:學習FLASH!


3.MC上加代碼的一般格式:
onClipEvent(movieEvent){
statements;
}
movieEvent:觸發事件關鍵字,表示要撲獲得事件。
statements:任意行數的可以執行程式代碼,表示隸屬於該事件的程式碼塊。
可撲獲的事件如下:
load:當前 MovieClip 被裝入並準備顯示之前觸發該事件
unload:當前 MovieClip 被卸載準備消失之前觸發該事件
enterFrame:當前 MovieClip 每次計算幀上的內容時觸發該事件
mouseMove:當滑鼠移動時觸發該事件
mouseDown:當滑鼠左鍵按下時觸發該事件
mouseUp:當滑鼠左鍵抬起時觸發該事件
keyDown:當鍵盤按鍵被按下時觸發該事件
keyUp:當鍵盤按鍵被抬起時觸發該事件
data:當前 MovieClip 接收到新資料時觸發該事件 關於這個問題,可參看我的這個教程(其中都有詳細的例子):

  onClipEvent()  是影片剪輯事件管理動作。按照FLASH的編程規範,影片剪輯動作必須靠影片剪輯事件來觸發,具體的觸發條件條件可以在其參數區添加。其參數欄中的選項包括:Load   Unload   EnterFrame  Mousemove    Mousedown  Mouseup   Keydown   Keyup  Data (共9項)。下面依次介紹:

1.Load------影片剪輯元件在時間軸中出現時觸發事件(不管影片剪輯是否完全載入,都觸發),而且只觸發一次!

2.Unload-------影片剪輯元件在時間軸中卸載時觸發事件;

3.EnterFrame--------在播放影片剪輯元件中內容時,每播放一幀執行一次觸發;

4.mouseMove--------每當滑鼠移動時觸發.滑鼠位置的改變就會觸發該事件.可以用_xmouse  _ymouse屬性確定當前滑鼠的座標;

5.mouseDown--------單擊滑鼠左鍵時觸發;

6.mouseUp--------釋放滑鼠左鍵時觸發;

7.keyDown--------按下鍵盤上某一鍵時觸發;

8.keyUp--------釋放鍵盤上某一鍵時觸發;

9.Data------當接收到loadVariables或者loadMovie動作載入新的資料時觸發;

具體應用舉例參看下面的SWF:


  這裡再舉一個簡單的例子:

onClipEvent(load){
a=100;
b=0;
}//當MC被載入時給a b兩個變數賦初值;


  二.文法相關:

  1.首當其衝的還是點文法,他是在編程時用來指明與某個對象的相關的屬性和方法,還可用於標識對象的路徑。

  比如,要擷取主情境中的Myball這個影片剪輯的x座標值文法為_root.Myball._x。這其中還有一個必須引起注意,初學者常常以為這裡的Myball是指給庫裡的對象命名,如圖二:


  其實這是不對的,在程式中出現的名字,我們習慣上稱為執行個體名,其正確的命名方法是在情境中選定需要命名的對象,然後在其屬性面板對其命名,如圖三:


  當然還有在載入外部的圖片,SWF或者直接調用庫裡的聲音,MC,那還可以通過程式本身直接給對象添加執行個體名,這些技巧以後遇到的時候再給予解釋! 點文法的對象名稱中有兩個特殊的名稱:_root和_parent; 其中_root表示主情境,而_parent可以實現讀取和設定包容當前物件的父物件的任何屬性。我自己不知道是怎麼養成的習慣,很少使用_parent,我比較喜歡採用一律從主情境來定位對象的方法。可能有時候這樣定位並不如兩種定位方法結合來的方便,但是我覺得這樣做的最突出的優點是便於差錯,因為你的路徑一律是從上到下的(從主情境到某個內層的MC或按鈕)哪一個層級出了問題很容易看出來,不用在MC和情境間來回切換,查誰是誰的父,誰是誰的子!另外我還有一個習慣,就是即使對象是在主情境中,我也喜歡在控制他的時候加上一個_root 。比如說主情境中的Myball這個MC是個運動的球,要用按鈕控制讓他停止,下面的語句可以實現:

on(release){
Myball.stop();
}

但是我一般寫成:

on(release){
_root.Myball.stop();
}


  當然,這隻是我的個人習慣,也許大家看了覺得我在自找麻煩。但是,我之所以講出來,是因為我覺得這是一個習慣,就是保有一種路徑的觀念在心裡。這個應該蠻重要的。

  2.關於斜杠文法:

  據我所知,斜杠文法是在FLASH 4.0中廣泛使用的,也用於指示對象的路徑,被用於代替點的作用,當他要指出一個變數是需要在變數前面加上冒號,以表示對變數的引用。由於軟體都有一種向下相容性,所以在MX中仍然可以使用(我沒怎麼用過2004,估計2004也支援的),但是一般說不推薦使用,一方面,既然被取代了,肯定是因為有缺點,有好的方法了幹嗎還要抱者舊的不放(你要是怕被人說喜新厭舊,那你就繼續用!我是不怕的,挖哈哈......)另一方面,為了和其他人保持一致,大家都用點文法,你一個人用斜杠,總覺得不大好!

  3.分號: 編程時,我有在每句話結尾加分號的習慣,其實這個分號是可以省略的,那我為什麼要加呢,嘿嘿........那是因為我一開始學慣用FLASH編程時,沒人告訴我可以不加,我就一直辛辛苦苦的加啊!!!現在改不過來了!挖哈哈..............

  4.大小寫 FLASH編程時,只有關鍵字區分大寫和小寫,何謂關鍵字,基本上就是你寫對了,會變成蘭色的那部分程式碼,也就是為本語言專用的一些單詞!!比如:setProperty clearInterval getRGB 這些! 5.注釋; 添加註釋一般是為了方便別人閱讀你的程式,添加註釋符號//後,其後的內容為灰色;其實他還有一個最大的優點就是,方便你偵錯工具,比如,編譯時間發現程式有錯,可是程式很長,你不能完全準確的確定錯誤發生的位置,那麼你可以使用// 逐段的屏蔽掉程式段,進而協助確定錯誤的位置。

  三.關於查錯:

  往往從有思路到編程實現效果不可能一次完成,也就是說,難免會出現錯誤,不能通過編譯系統(不知道FLASH裡怎麼稱呼,說成編譯系統對不對咧,還請各位指教)。那這時候就需要我們查錯。 1.充分利用輸出視窗給出的提示: 例如:在按鈕上加如下代碼:

duplicateMovieClip("MC","MC"+j,10+j);
c=random(40);
setProperty("MC"+j,_y,(c+30));
setProperty"MC"+j,_x,random(600));
setProperty("MC"+j,_alpha,(2*c+20));
j++;
if(j>700){
j=1;
}

  ctrl+enter測試影片,輸出視窗提示:

  情境=情境 1, 圖層=AS, 幀=2: 第 4 行: Unknown error ID #1033 setProperty"MC"+j,_x,random(600)); 就是說第四行有錯誤,回到編輯狀態,一看,原來少了半邊括弧,就是說輸出視窗會給我們提供很多必要的協助,一定要好好利用!讓AS編輯區顯示行號的方法,如圖四:


  點一下紅色圈中的按鈕,選中顯示行號即可!其他按鈕還可以實現很多協助工具功能,自己去看一看就知道了!

  2.上述方法只能排除文法上的錯誤,也就是說,你程式本身演算法或者程式中參數的傳遞,出現了問題,編譯系統是不可能幫你檢查出來的,這個只能靠你自己去檢查。我這裡介紹一點自己的方法,供大家參考:首先,你得自己心裡想明白按照自己的這個演算法思想能不能實現想要的結果,就是說先在心裡把整個演算法重新再理一遍,有時候想的不成熟,或者一開始的思路有疏漏,這時候應該可以更正或者修改過來!當你確定自己的程式設計思路沒有問題但是依然出不了效果時,你就該考慮是程式實現時出了錯誤,比如參數傳遞有問題,路徑指示不明確甚至錯誤等等都是比較常見的(至少我就常常犯這樣的錯誤); 舉個例子: 在主情境中有一個輸入文本,其執行個體名為text 變數名為xx,
然後主情境的幀上加:

_root.text.onChanged = function() {
n=Number(xx);
}

  當文字框內容改變時就把文字框的值賦給n這個變數; 然後在主情境中一個風車狀的MC上加:

onClipEvent(enterFrame){
this._rotation=this._rotation+n;
}

  意思是讓風車旋轉,速度為n; 但是測試影片,就是沒有效果,為什麼呢,想想看,先把風車上的代碼改為:

onClipEvent(enterFrame){
this._rotation=this._rotation+3;
}

  指定一個數值作為旋轉的速度,測試發現,旋轉正常; 這就提醒我們,是不是參數傳遞出了問題呢,哦!!!對,因為在幀上加的代碼,所產生的變數n實際是主情境中的變數,把他傳遞到MC中時,應該確定起準確的位置。再次修改原始碼,MC上的代碼改為:

onClipEvent(enterFrame){
this._rotation=this._rotation+_root.n;
}

  再次測試,一切正常,旋轉速度隨著輸入數位變化而變化 效果:

http://www.flash8.net/bbs/UploadFile/2004131491788994.swf

點擊這裡下載源檔案

  3.學會使用trace語句,檢測錯誤! 上面的例子中變數比較少,所以很容易發現問題,如果一個程式中有多個變數,而且比較複雜,那就需要分別對他們進行跟蹤查看,方法就是利用trace語句,在某個變數每次發生變化後都用trace將其輸出,以便查看其運算結果是否和預期的一致! 同樣舉個例子:隨機抽籤效果! 十個MC,透明度均為30; 主情境中的主要畫面格上加:

a =new Array(0,1,2,3,4,5,6,7,8,9);//定義數組;
mm=0;//點擊次數統計;
nn=10;//數組元素個數; 選擇按鈕上加: on(press){
i = random(nn);
j = a[i];
a1=a.slice(0,i);
trace(a1);//輸出抽取的部分數所組成的新的數組a1;
a2=a.slice(i+1,nn);
trace(a2);//輸出抽取的另外一部分數所組成的新的數組a2;
a=a1.concat(a2);
trace(a);//輸出組合後的數組,也就是新的數組a;
setProperty("mc"+j,_alpha,getProperty("mc"+j,_alpha)+30);
mm++;
nn--;
if(mm==10){
text="抽籤結束!"
mm="10";
_root.but._visible=false;

}
}

  採用以上方法後,每點擊一次按鈕,視窗都輸出三排數字,最後一排中比上一次輸出少掉的那個數字就是被抽取的數字;這樣一來,每運行一次代碼,程式人員都可以方便的查看各個變數的運算情況! 效果:(注意,trace語句其實可以說是專門用於查錯的,因為在swf檔案中他無效,所以在以下效果中不能顯示trace視窗,大家可以下載下面的源檔案在本機測試):

http://www.flash8.net/bbs/UploadFile/20041314105332216.swf

 點擊這裡下載源檔案



相關文章

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。