久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

ActionScript菜鸟教程

發(fā)布時間:2023/12/4 综合教程 40 生活家
生活随笔 收集整理的這篇文章主要介紹了 ActionScript菜鸟教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第1章 揭開ActionScript的神秘面紗

ActionScript是Flash內置的編程語言,用它為動畫編程,可以實現(xiàn)各種動畫特效、對影片的良好控制、強大的人機交互以及與網(wǎng)絡服務器的交互功能。
ActionScript是一門吸收了C++、Java以及JavaScript等編程語言部分特點的新的語言。ActionScrip使用英文單詞和元件提供了一種為Flash影片設置指令的方法。它的存在確保了Flash影片較之普通的按照線性模式播放的動畫具備強大得多的人機交互能力。
可以為時間軸中的關鍵幀、按鈕和影片剪輯添加ActionScript。選中這些關鍵幀、按鈕和影片剪輯,打開其動作面板,你就可以看到它們都添加了哪些腳本。

1.1 Flash中的程序
交給計算機執(zhí)行的指令集稱為程序。程序的另一個名稱叫做腳本。從現(xiàn)在開始,我們將這些指令集統(tǒng)稱為腳本。
腳本都必須有它的運行環(huán)境,就ActionScript來說,它的運行環(huán)境就是Flash影片。ActionScript可以指揮Flash影片該做什么。在某些情況下,ActionScript還可以指揮其他的東西,如用戶的操作系統(tǒng)、瀏覽器等。但是ActionScript最主要的用途還在于控制Flash影片內部的東西。
短的腳本可以只有一行,長的腳本可以長達幾千行。它們可以作用于Flash影片的一個部分,也可以貫穿影片始終。有人把使用了腳本的整個Flash影片看作一個程序,也有人把影片中單獨出現(xiàn)的腳本看作一個程序。這兩種看法都正確,因為一個單獨的程序也可以被定義成若干小程序。
你可能對某些編程語言已經(jīng)相當熟悉或者有所了解。例如廣大網(wǎng)頁設計者所熟知的JavaScript,以及另一種相似的語言VBScript,它們能用來編輯動態(tài)網(wǎng)頁。HTML(Hypertext Markup Language 超文本置標語言)是另一種特殊的語言,瀏覽器將按照它所包括的指令正確地顯示文本和圖片。
在學校里面,你可能接觸過一些編程方面的課程,如BASIC、Pascal、C、Java等。
除HTML以外,以上提到的所有的語言都包含很相似的程序結構:循環(huán)、條件、變量等等。只要你知道了ActionScript的特殊用法,你就可以將以前所學的編程知識利用起來。就算你以前從來沒有接觸過編程方面的知識,不用擔心,我會將所有需要的知識都告訴你。
1.2 ActionScript是從哪里來的
ActionScript是從哪里來的呢?事實上它的確是從好幾種程序語言中深化而來的。下面我們先花一點時間了解一下計算機語言的起源和發(fā)展。
當?shù)谝慌_數(shù)字計算機誕生的時候,唯一的編程語言是計算機的專用語言——二進制代碼,即由數(shù)字1和0組成的編碼。當由1和0組成的不同序列被輸入到計算機中,計算機就會執(zhí)行完全不同的操作。使用這種語言編寫程序是相當費勁的,就算寫一個簡單的兩數(shù)相加的程序,程序的長度也是相當驚人的。
為了避免每次都為兩數(shù)相加的操作書寫長長的二進制程序,有人書寫了一種專門用于兩數(shù)相加的代碼,你可以方便地使用相同的代碼實現(xiàn)任意兩數(shù)的相加操作。接著,一些類似的函數(shù)誕生了,用它們可以處理所有的基本任務,如加、減、乘、除、比較、循環(huán)等等。從此以后,你可以使用這些事先編寫好的函數(shù)執(zhí)行幾乎所有的操作了。
現(xiàn)代的計算機語言理解和使用起來較之二進制編碼都已經(jīng)容易了無數(shù)倍,其一,現(xiàn)代計算機語言與英語語法很相似,如“go”、“for”、“begin”、“if”以及+、-、=等,它們的含義和用法與現(xiàn)實中都相差不大。
BASIC、Pascal等編程語言,幾乎可以像英語句子一樣閱讀,所以學習和理解起來都非常容易。其他語言,如C、Fortran,它們的功能更強一些,經(jīng)驗豐富的程序員可以用它們完成更復雜的任務。更多的語言居于以上兩種語言之間,如C++、Java和JavaScript,它們既有一定的可讀性,也有較強的功能。ActionScript與這些語言有更多的相似之處。
Flash遵從ECMA(European Computer Manufacturers Association歐洲計算機工業(yè)協(xié)會)制定的標準,因此ActionScript與ECMAScript(ECMA開發(fā)的一種語言)極其相似。所以與其說ActionScript建立在JavaScript的基礎上,不如說ActionScript和JavaScript都建立在共同的基礎之上。
Flash具備交互功能,它的早期版本已能夠利用簡單的腳本實現(xiàn)不太復雜的導航和按鈕。同時,Flash還是一種矢量動畫工具,它的發(fā)展是與對它的應用需求分不開的,比如說網(wǎng)頁設計者需要一種工具來制作體積更小的圖像,由于矢量圖是由線條和填充色構成的,而不是像位圖一樣由像素構成,所以它能夠大大縮減文件大小,正順應了網(wǎng)頁設計者的需求,使許多系統(tǒng)配置低的用戶也能夠訪問和瀏覽他們的網(wǎng)頁。
雖然說Flash是一個圖形動畫工具,但也不是沒有使用程序的需要,比如說設計者需要制作一個按鈕,讓別的用戶能通過單擊按鈕瀏覽到別的頁面。
Flash早期版本中的腳本非常簡單,直到Flash 4,才具有了標準的程序結構,如條件結構、循環(huán)結構等。但是Flash腳本仍然需要使用下拉菜單和空白文本框添加,幾乎還不能叫做一種編程語言。
真正的ActionScript到了Flash 5才出現(xiàn),程序員可以直接鍵入程序并將程序添加給需要作用的元素。Flash MX更大地擴展了ActionScript,現(xiàn)在的ActionScript提供了多達300余種命令、函數(shù)、運算符和結構,這才真正成為一種成熟的程序語言。
1.3 初識ActionScript
腳本是由英語單詞、數(shù)學符號和函數(shù)構成的,下面是一個ActionScript的例子:
on (press) {
gotoAndPlay ("my frame");
}
你可以通過其中的關鍵單詞推測這段程序的作用。單詞press表示按,即用鼠標在某種對象上面單擊,這里的對象就是按鈕。第二行中的長單詞可以分開讀成“go to and play”,可以將其理解為命令Flash到達影片中的一個特定位置并從這一特定位置開始播放影片。
從以上可以看出,ActionScript可以控制Flash影片的播放。在著手學習ActionScript之前,我們將對ActionScript在Flash影片中的功能作更多的了解。
Flash影片可以包含若干場景,每個場景都有時間軸,每條時間軸從第1幀開始。如果不添加ActionScript,Flash影片會自動從場景1的第1幀開始播放,直到場景1的最后一幀,然后接著播放場景2,以此類推。
ActionScript的主要目的就是用來改變這種自動而死板的線性播放行為,一段腳本可以使影片在一個特定的幀上停止,循環(huán)播放前面的部分,甚至于讓用戶控制要播放哪一幀。ActionScript能夠使影片完全脫離被動的線性播放模式。
這還不是ActionScript的所有功能,它還可以將Flash影片從簡單的動畫改變?yōu)榫哂薪换ツ芰Φ碾娔X程序。下面讓我們見識一下ActionScript能實現(xiàn)的一些基本功能。
= 控制播放順序
你可以通過選擇某個菜單將影片暫停在某個位置,然后由用戶來決定下一步干什么,這就避免讓影片徑直朝前播放。
= 創(chuàng)建復雜動畫
直接使用Flash中的繪圖工具和基本命令來創(chuàng)建足夠復雜的動畫是相當困難的,但是腳本可以幫助你創(chuàng)建復雜的動畫。例如可以用ActionScript控制一個球在屏幕中無休止的跳動,并且可以使它的動作遵從物理學中的重力定律。如果你不用ActionScript來實現(xiàn)這樣的動畫,你將需要幾千幀來模仿相似的動作,而用ActionScript,你將只需要一幀。
= 響應用戶輸入
你可以通過影片向用戶提出問題并接收答案,然后將答案信息用于影片中或將其傳送到服務器。加入了相應ActionScript的Flash影片更適合做網(wǎng)頁中的表單。
= 從服務器獲取數(shù)據(jù)
與向服務器傳送數(shù)據(jù)相反,使用ActionScript也可以從服務器中獲取數(shù)據(jù),你可以獲取即時的信息并將它提供給用戶。
= 計算
ActionScript也可以對數(shù)值進行計算,用它可以模擬出各種復雜的計算器。
= 調整圖像
ActionScript可以在影片播放時改變圖像的大小、角度、旋轉方向以及影片剪輯元件的顏色等。你還可以從屏幕中復制或刪除對象。
= 測試環(huán)境
你可以用ActionScript測試Flash影片的播放環(huán)境,如獲取系統(tǒng)時間,獲取Flash Player的版本信息等。
= 控制聲音
ActionScript可以方便地控制聲音的播放,甚至控制聲音的聲道平衡和音量等。
1.4 ActionScript放在哪里
初學ActionScript的Flash愛好者最想問的問題恐怕是“ActionScript應該放在哪里?”
Flash是一種復雜的多媒體編輯環(huán)境,如果你曾經(jīng)使用過Flash,或者看過Flash MX附帶的教程,你就應該知道Flash中的一些基本術語或元素。在Flash的元素中有3個地方可以放置腳本。
1.4.1 時間軸
Flash影片中的每個場景都有時間軸,時間軸上的每個關鍵幀都可以放置腳本。并且,你還可以在每一個關鍵幀的不同層上放置不同的腳本。
在主時間軸中放置腳本之前,需要先選擇一個關鍵幀。啟動Flash時,時間軸中有一個空白關鍵幀
當選中一個關鍵幀后,你就可以打開動作面板,查看里面的腳本或者開始編寫你自己的腳本了。
有幾種方法可以打開動作面板。你可以選擇“窗口”→“動作”命令,或者按快捷鍵F9。
如果你對Flash復雜的影片瀏覽器比較熟悉,你也可以在影片瀏覽器中查看整個Flash影片所用到的腳本。打開影片瀏覽器的快捷鍵是Alt+F3。
如圖1-2所示即為Flash MX的動作面板。該動作面板被命令為“動作-幀”,這是因為其中的腳本將作用在幀上。如果是新建的一個影片,動作面板將是空的。后面我們將在動作面板中添加各種各樣的腳本。第2章我們將看到如何使用動作面板。
時間軸中的腳本將在Flash影片播放到腳本所在的關鍵幀位置時自動執(zhí)行。例如,如果你為某一關鍵幀添加了stop()命令,當影片播放到那一幀位置時就會自動停止。要讓影片繼續(xù)播放,只有在其他的腳本中添加相應的命令。
在時間軸中添加腳本還有一個好處就是方便你在ActionScript中使用函數(shù)。函數(shù)是可以重復使用的腳本代碼,要想使整個影片都可以調用腳本中的函數(shù),就必須將函數(shù)放置在主時間軸中。
1.4.2 按鈕
Flash中的元素又稱作元件(symbol)。元件主要有3種:圖形(graphic)、影片剪輯(movie clip)和按鈕(button)。圖形元件不能承載腳本,它們只能是簡單的靜態(tài)或動態(tài)圖像。影片剪輯與圖形元件類似,但是它可以承載腳本。
第3種元件就是按鈕,按鈕可以承載腳本。事實上,如果沒有腳本,按鈕幾乎不會發(fā)揮什么作用。
要為按鈕添加腳本,首先要在舞臺中選中按鈕,然后選擇“窗口”→“動作”命令或按快捷鍵F9打開動作面板。
與幀動作面板相對應,選中按鈕時動作面板的標題是“動作-按鈕”。
你可能會認為,為按鈕添加的腳本應該是在單擊按鈕時執(zhí)行。其實,也可以為其他鼠標動作添加相應的腳本,如鼠標進入和移出按鈕區(qū)域。按鈕也可以響應按鍵動作,這使得我們可以方便地為按鈕設置快捷鍵。
1.4.3 影片剪輯
影片剪輯不同于圖形元件,可以為影片剪輯命名,為影片剪輯添加腳本。為影片剪輯添加腳本的方法與按鈕類似。
為影片剪輯添加的腳本可以用來控制影片剪輯自身或控制時間軸中的其他影片剪輯。使用腳本可以判斷影片剪輯出現(xiàn)在屏幕中的什么位置,你也可以用腳本來控制影片剪輯的重復播放等,進而控制整個動畫。
除了可以為影片剪輯添加腳本,你也可以在影片剪輯內部添加腳本。影片剪輯其實也是一個單獨的Flash影片,在影片剪輯中有一條單獨的時間軸,你可以像在主時間軸中添加腳本一樣在影片剪輯內部的時間軸中添加幀動作腳本。同樣地,你也可以將按鈕放置到影片剪輯內部并為按鈕添加腳本。也就是說主時間軸中的影片剪輯里面有子影片剪輯,子影片剪輯里面又有按鈕,按鈕中也可以有影片剪輯,如果需要,你都可以為它們添加腳本。
1.5 練習:你的第一段ActionScript
下面來編寫你的第一段ActionScript,讓你對ActionScript有更深的了解。操作步驟如下:
(1)創(chuàng)建一個新的Flash文檔。
(2)選中時間軸中的第1幀,按F7鍵兩次插入兩個空白關鍵幀,這時時間軸中應有3個空白關鍵幀。
(3)在每一幀中繪制不同的圖形。
(4)選擇“控制”→“測試影片”命令或按Ctrl+Enter鍵測試影片,你會看到影片在這3個幀之間循環(huán)播放。
(5)回到主時間軸,選中第2個關鍵幀,按F9鍵打開動作面板。
(6)動作面板左邊顯示了可擴展的ActionScript關鍵字目錄。在“動作”/“影片控制”目錄下面找到關鍵字stop并雙擊,腳本窗口將添加如下所示的一行語句:
stop();
(7)關閉動作面板,按Ctrl+Enter鍵測試影片,播放第1、2幀后影片會停止,你將看不到第3幀。
ActionScript發(fā)揮了作用,它成功地阻止了影片無休止地循環(huán)播放這3幀。

?

第2章 Flash MX的動作面板

動作面板是Flash MX面板系統(tǒng)的一部分,ActionScript程序員經(jīng)常會用到它。為了成長為一名嫻熟的Flash編程高手,你有必要對Flash的動作面板和在線幫助系統(tǒng)相當?shù)氖煜ぁ?
動作面板的標準模式允許你從腳本目錄中選擇關鍵字并設置相應的選項,而專家模式為程序員提供了直接輸入代碼的自由。

2.1 了解動作面板
Flash MX的面板系統(tǒng)向你提供了查看和設置Flash中各種元素信息和屬性的捷徑。第一次啟動Flash MX的時候,系統(tǒng)將會詢問你要使用Flash做哪些方面的工作,然后為你設置默認的面板界面。你可以選擇“窗口”→“面板設置”命令在不同的面板界面之間切換。與此同時,也決定了動作面板的大小,但是你可以將它改變成任何適合你需要的大小。
你可以通過鍵盤上的F9鍵隨意顯示或隱藏動作面板。顯示動作面板后,你可以單擊它的標題欄將它展開或折疊起來。你還可以拖動動作面板的左上角將它從Flash的工作界面中分離出來。
動作面板有兩種不同的工作模式。默認的模式是標準模式。在標準模式下,你必須從窗口左邊的菜單中選擇需要的關鍵字,而不能直接使用鍵盤輸入腳本,因此可以有效避免即使是很細小的錯誤。
2.2 動作面板的標準模式
面板上部的下拉菜單顯示了你當前所編輯的腳本的準確位置。圖2-1中顯示的是“幀動作腳本1 圖層名稱 圖層1”,也就是說當前所編輯的腳本是作用于圖層1的第1幀的。
面板左邊顯示了ActionScript命令的分類目錄,單擊展開一個目錄,你將看到它里面的子目錄或命令。
面板的右邊是一個空白文本區(qū),它將顯示你所選擇的命令和函數(shù)。圖2-2顯示了你從左邊的目錄里面選擇插入“動作”→“影片控制”中的goto命令后的動作面板。goto命令是通過雙擊鼠標添加到腳本中的。
面板右上部顯示了goto命令的簡單定義,下面顯示了與goto命令相關的各種選項,包括“場景”、“類型”和“幀”等,就像是所選命令的參數(shù)設置區(qū)。參數(shù)設置區(qū)的狀態(tài)會依據(jù)所選擇ActionScript命令的不同而發(fā)生變化。
第一個需要設置的選項是選擇gotoAndPlay命令還是選擇gotoAndStop命令。圖2-2中選中的是“轉到并播放”單選項,也就是gotoAndPlay。這兩種命令是相似的,都是跳轉到特定的幀,但是gotoAndPlay命令使影片從特定幀開始播放,gotoAndStop命令使影片在特定幀上停止。
這個命令還需要附加一些信息才能正常工作。如,你想要使影片跳轉到哪一幀,這一幀位于哪個場景,圖2-2指定的是當前場景。在“類型”下拉菜單中可以選擇指定特定幀的方式,你可以使用幀號、幀標簽和表達式中的一種。圖2-2選中的是幀號類型,這就要求你精確地指定幀的編號,如1。
在以上內容的下面顯示了 和 兩個按鈕。它們使你可以快速地在腳本中插入和刪除命令。但是這種方法很少使用,你可以通過左邊的分類目錄添加腳本,使用鍵盤上的Delete或Back Space鍵刪除不需要的命令。
和 按鈕的右邊還有幾個功能不一的按鈕。 按鈕使你可以從腳本中查找文本, 按鈕使你可以替換文本,使用 按鈕可以插入目標路徑, 按鈕可以為你調試腳本設置斷點, 和 按鈕使你可以選擇腳本的前一行或后一行。
在動作面板的底部你可以看到這樣的一行:“第1行:gotoAndPlay(1);”,這是動作面板的狀態(tài)行,它顯示了當前選中的行號和該行的內容。
2.3 分類目錄
動作面板左邊的目錄將ActionScript的關鍵字有組織地分成幾組,以使你更容易查找到需要的關鍵字的位置。以后我們會對每個組中的命令和符號作詳細的講解,下面先對其進行一下簡要的介紹。
= 動作
在動作類中包含了最簡單的ActionScript命令。動作類提供了測試條件、循環(huán)、創(chuàng)建函數(shù)、復制和創(chuàng)建影片剪輯以及從服務器中獲取數(shù)據(jù)等功能的命令。動作類中的命令是ActionScript最重要的組成部分。動作類又分為影片控制、瀏覽器/網(wǎng)絡、影片剪輯控制、變量、條件/循環(huán)、打印、用戶定義的函數(shù)以及其他動作等子類。
= 運算符
它包括了各種數(shù)學和比較運算符,如+號,用于兩數(shù)相加;==號,用于判斷兩數(shù)是否相等。運算符類下面又分為按位、比較、賦值、邏輯、算術和其他運算符等子類。
= 函數(shù)
使用函數(shù)可以轉換數(shù)據(jù)或獲取需要的信息,如獲取Flash的版本信息。你可以使用函數(shù)將字符串123轉換成數(shù)字123。你還可以自定義需要重復使用的函數(shù)。在函數(shù)類下面主要有兩個子類:數(shù)學函數(shù)和轉換函數(shù)。
= 常量
常量類中包含了一些具有特定值的特殊關鍵字,如true、false、null和newline等。
= 屬性
屬性類中的關鍵字反映了Flash中元素的相關信息。例如_x屬性代表影片剪輯在屏幕中的水平位置。
= 對象
對象類是最復雜的一類,它包含了ActionScript中的眾多概念。所有的對象關鍵字被分成4個子類:核心、影片、客戶端/服務器、創(chuàng)作。影片剪輯是影片類下面的一種,它包含了與控制影片剪輯相關的關鍵字。Math是核心下面的一種,它包含了求平方根、正弦值等數(shù)學函數(shù)。
= 否決的
這一類中的關鍵字是已經(jīng)作廢但Flash MX仍然支持的,在Flash MX中請盡量避免使用,因為在以后的Flash版本中將不再支持這些關鍵字。
= Flash UI組件
這一類中的關鍵字包含了特殊功能的組件,如單選按鈕、滾動條等。
= 索引
索引類將ActionScript中的所有關鍵字按字母順序排列。以上各類中的關鍵字都可以在索引類中找到。
動作面板中提供的關鍵字分類有時可以幫你方便地找到需要的關鍵字,但也有可能給你帶來麻煩。如你可能認為表示影片剪輯水平坐標屬性的_x應該在對象類的“影片”/“影片剪輯”/“屬性”里面,但它卻在屬性類里面。你可能認為sqrt(開平方)應該在函數(shù)類中,但它卻在“對象”/“核心”/“Math”/“方法”下面。
2.4 使用Flash的幫助系統(tǒng)
最好的程序員往往也要查閱一下工具書,Flash中的幫助系統(tǒng)就是一本功能強大的工具書,所以在學習更多內容之前,先了解一下Flash的幫助系統(tǒng),將對我們的學習不無陴益。
Flash使用工具提示和基于擴展HTML的幫助系統(tǒng)。為了對ActionScript的使用更加嫻熟,你就需要知道如何使用它們。
2.4.1 簡單定義
如果你習慣使用動作面板中的關鍵字分類目錄,你應該會注意到當你在左邊的目錄中選中某個關鍵字時,面板右邊的上面部分會給出與所選關鍵字相應的簡單定義。你會看見這樣的句子:“要添加某項,可雙擊該項或將其拖動到腳本窗口。
例如選中goto命令時,你會看到這樣的提示:“轉到影片的指定幀。”它顯示了該腳本的基本功能。
單擊別的命令查看一下它們的定義,在學習下面的知識之前,你可以花些時間多看一下動作面板中的命令。
2.4.2 腳本參考面板
Flash使用腳本參考面板幫助你記住ActionScript的語法。可以選擇“窗口”→“腳本參考”命令或按快捷鍵Shift+F1打開腳本參考面板。
腳本參考面板的左邊與動作面板左邊的腳本目錄很相似。你也可以通過動作面板進入腳本參考面板,單擊動作面板中的 按鈕可以打開腳本參考面板,打開的腳本參考面板會自動顯示你在動作面板中選中的命令。
2.4.3 HTML幫助文檔
如果要獲得ActionScript命令更詳細的說明,可以選擇“幫助”→“動作腳本詞典”命令,這將啟動你的瀏覽器并打開如圖2-4所示的頁面。

圖2-4 動作腳本詞典
瀏覽器窗口的左邊是所有ActionScript命令和函數(shù)的總目錄,在左邊的條目上單擊,窗口的右邊部分會顯示其詳細的內容。
選中每個條目時,右邊窗口中通常會包括與該條目的說明以及它的使用范例。
在你以后使用Flash的時候可能經(jīng)常會用到幫助文檔,所以請花一些時間了解它吧。
2.5 動作面板的專家模式
現(xiàn)在你已經(jīng)了解了動作面板的標準模式,下面要向你推薦多數(shù)ActionScript程序員使用的專家模式。
在專家模式下,你可以直接通過鍵盤輸入腳本,而不需要從左邊的目錄中選擇命令。這種模式下你可以在動作面板中輸入任何東西,但也很容易導致錯誤。
在專家模式下,你仍然可以從左邊的目錄中選擇并插入標準的ActionScript命令、函數(shù)和運算符。當你記不確切一條命令的時候就可以使用這種方法。
2.5.1 切換模式
要從標準模式切換到專家模式,可以單擊動作面板中的 按鈕,或者單擊動作面板右上角的 按鈕,在打開的下拉菜單中選擇“專家模式”命令。在動作面板獲得焦點的情況下,快捷鍵Ctrl+Shift+N可以切換到標準模式,快捷鍵Ctrl+Shift+E可以切換到專家模式。
如圖2-5所示為專家模式下的動作面板。在專家模式下,參數(shù)設置區(qū)、命令提示信息都沒有了,腳本編輯窗口占據(jù)了動作面板右邊的大部分。
從標準模式切換到專家模式是非常容易的,但是要從專家模式切換到標準模式則要求腳本中沒有語法錯誤。比如說你不明白如何設置一些命令的參數(shù),需要從專家模式切換到標準模式以使用標準模式下的提示,但是Flash卻不允許你進行切換,提示你“此腳本中有語法錯誤,必須在‘專家模式'下編輯它”;而當你知道如何設置參數(shù)并將腳本書寫正確了,又不再需要切換到標準模式了。
2.5.2 動作面板的下拉菜單
動作面板的下拉菜單中有一些特別是在專家模式下編輯腳本時很有用的命令。
你可以使用查找和替換命令在代碼中執(zhí)行查找和替換操作。按快捷鍵Ctrl+F可以打開“查看”對話框,按快捷鍵Ctrl+H可以打開“替換”對話框。
“轉到行…”命令可以快速轉到并選中指定的行。
“語法檢查”命令或按鈕 可以對窗口中的腳本進行語法檢查,如果沒有語法錯誤,將提示你“此腳本中沒有錯誤。”
通常,語法檢查只能檢查出代碼中的明顯語法錯誤,它并不能檢查腳本是否能正確運行。經(jīng)常會發(fā)生這樣的事情,就是每一行的代碼都是正確的,但所有的代碼加在一起卻導致了錯誤。
語法檢查功能很實用,特別是對初學者來說,它能方便地檢查出誤用運算符或缺失括號等情況。
“自動套用格式”命令可以按預先設置的樣式和縮進等設置腳本的格式。你可以選擇“自動套用格式選項”命令,在“自動格式選項”對話框中重新設置要應用的格式,
另外,選擇“首選項…”命令可以設置動作面板中腳本代碼的顏色、制表符寬度、字體等。你也可以在Flash MX的菜單欄中選擇“編輯”→“首選參數(shù)”命令,在打開的“首選參數(shù)”對話框中選中“動作腳本編輯器”選項卡,打開相同的對話框,如圖2-7所示。

圖2-7 “首選參數(shù)”對話框
為腳本上色有利于編寫程序。使用這項功能時,你將看到ActionScript中的關鍵字以一種顏色顯示,而另外一些變量和常數(shù)以另外的顏色顯示。這對初學者是很有幫助的。如正確輸入關鍵字gotoAndPlay后,它馬上會以藍色顯示。如果它的顏色沒有發(fā)生變化,有可能就是你的輸入有誤。
動作面板下拉菜單中還有導入導出文件以及打印等命令,可以將使用外部的文本編輯器編輯好的腳本導入到動作面板中,或將動作面板中的腳本導出或打印出來。
從外部導入腳本的方法并不值得推薦,因為動作面板雖然不是最快捷的文本編輯器,但是在其中編輯ActionScript是最好的,你可以在需要的時候參照腳本分類目錄,可以即時的查看Flash中的影片剪輯的名稱,查看幀編號或幀標簽。另外,你還可以快捷地切換到Flash影片中要插入腳本的任何位置。
2.5.3 在專家模式下輸入腳本
使用動作面板的專家模式要比標準模式容易得多,因為在專家模式下你只需要敲擊鍵盤,而不需要在窗口中填寫表格。專家模式下的動作面板就像一個簡單的文本編輯器。
使用專家模式的缺點就是很容易出錯。標準模式為你添加了很多限制,而在專家模式下你有可能鍵入不正確的命令或者將參數(shù)放錯位置。
在專家模式下,你可以方便地將光標定位在合適的位置。但是Flash也不能完全任你隨心所欲,它會在你鍵入的同時自動調整腳本格式,將不同的關鍵字設置成不同的顏色。
你可以單擊 按鈕以檢查腳本中的語法錯誤,單擊 按鈕以格式化整個腳本,如在需要的位置換行、設置空格和縮進等。
動作面板還有代碼提示的功能。當你鍵入腳本的時候有時會出現(xiàn)一個提示菜單,你可以忽略它繼續(xù)鍵入,或者從中選擇需要的項目。單擊 按鈕可以顯示代碼提示。
2.6 練習:在專家模式下輸入腳本
下面我們練習在專家模式下輸入腳本。其操作步驟如下:
(1)新建一個文檔。
(2)選擇默認的場景1圖層1中的第一個空白關鍵幀。
(3)按F9鍵打開動作面板。
(4)使用菜單將動作面板切換到專家模式。
(5)在腳本編輯區(qū)單擊。
(6)鍵入下面的一行代碼:
gotoAndPlay(5);

?

第3章 ActionScript編程初步

計算機程序是由命令、函數(shù)、運算符、條件和循環(huán)等結構組成的。命令是為計算機下達的一系列指令,函數(shù)執(zhí)行計算和返回值,通過運算符將若干數(shù)據(jù)以某種特定的方式結合起來,條件測試一個或多個值以返回一個為true或false的布爾值,循環(huán)結構使得程序能夠重復執(zhí)行一系列相同的指令。
變量是存儲數(shù)據(jù)的容器,變量有變量名和變量值。
編程是一項需要耐心的工作,首先你必須理解要用程序解決什么樣的問題,然后需要將這個問題分解成若干步驟,將每個步驟再分成更小的步驟,直到每個步驟都小得很容易解決了為止。
程序編寫好后,可能會存在許多漏洞或缺陷,所以你還需要對程序進行調試,直到程序能正確運行為止。

3.1 程序基本結構
計算機程序是由命令、函數(shù)、運算符、條件和循環(huán)等結構組成的。
3.1.1 命令、函數(shù)和運算符
在此之前,我們都是用關鍵字來描述ActionScript中的元素,如關鍵字gotoAndPlay,它也是一個命令。
命令是ActionScript中用來告訴Flash所要執(zhí)行的特定操作的元素。之所以稱之為命令,就是因為它將被嚴格的遵照執(zhí)行,如果要用gotoAndPlay跳轉到一個不存在的幀,這樣的命令就不能被執(zhí)行。
命令是程序中最基本的元素,在Flash中如果不使用命令,幾乎不能進行任何操作。從本書中你將學到很多命令。
函數(shù)是ActionScript中用來執(zhí)行計算和返回結果的元素。例如,一個特定的函數(shù)可以計算并返回一個指定數(shù)的平方根。
命令和函數(shù)都可以使用參數(shù)。參數(shù)就是傳遞給命令或函數(shù)的一個值。如gotoAndPlay命令就至少需要一個幀編號或幀標簽作為參數(shù)。求平方根的函數(shù)也需要一個數(shù)值作為參數(shù)。
與命令和函數(shù)不同的是運算符,它們主要是一些符號,而不是字母。例如,+運算符執(zhí)行兩數(shù)相加的操作。
在ActionScript程序中你將會用到大量的命令、函數(shù)和運算符。
3.1.2 變量
要編寫復雜的計算機程序往往需要存儲很多的信息。有時你可能只需要存儲很短暫的時間,例如,如果需要重復執(zhí)行10次相同的命令,你就需要對命令的執(zhí)行次數(shù)進行記數(shù),直到滿10次為止。
所有的編程語言都使用變量來存儲信息。一個變量由兩部分構成:變量名和變量的值。
1.變量名
變量名通常是一個單詞或幾個單詞構成的字符串,也可以是一個字母。總的來說,你需要盡可能地為變量指定一個有意義的名稱。
例如,如果你要使用變量存儲用戶的姓名,用userName作為變量名將是一個很好的選擇。如果你使用n作變量名,似乎太短了一點;如果使用name,又可能與影片中其他對象的名稱相混淆。
在ActionScript中為變量指定變量名時已經(jīng)形成了一種不成文的規(guī)范,就是變量名通常以小寫字母開頭,當一個新的單詞出現(xiàn)時,大寫這個新單詞的第一個字母,如userName,長一點的例子如currentUserFirstName。
變量名中不允許出現(xiàn)空格,也不允許出現(xiàn)特殊符號,但是可以使用數(shù)字。
2.變量類型
你可以用變量存儲不同類型的數(shù)據(jù)。數(shù)字是最簡單的變量類型。
你可以在變量中存儲兩種不同類型的數(shù)字:整數(shù)和浮點數(shù)。整數(shù)沒有小數(shù)點部分,如117、-3685都是整數(shù)。浮點數(shù)有小數(shù)點部分,如0.1、532.23、-3.7都是浮點數(shù)。
你也可以在變量中存儲字符串,字符串就是由字符組成的序列,可以是一個或多個字符,甚至可以沒有字符,即空字符串。
使用引號定義字符串,使其與其他變量相區(qū)別。如7是一個數(shù)字,而“7”則是一個字符串,這個字符串由一個字符7組成。
在別的編程語言中,你可能需要在程序的開頭部分提前定義程序中要用到的變量的具體類型,但在ActionScript中不需要預先聲明變量,你只需要直接使用它們,Flash在第一次遇到它們的時候會自動為它們創(chuàng)建變量。
另外,變量所能存放的數(shù)據(jù)類型也沒有嚴格的限定,某一變量可以在一個位置存放字符串,而在另一個位置存放數(shù)字。
這種靈活性并不是經(jīng)常用得到,但是它可以讓程序員們少一些不必要的擔心。
ActionScript程序員不必擔心的另一個問題是廢棄變量的空間回收問題。即當你不再需要使用一個變量的時候,你可能需要收回該變量占用的存儲空間。大多數(shù)現(xiàn)代的計算機語言如ActionScript都可以自動回收空間,所以你也不必擔心了。
除數(shù)字和字符串類型外還有一些別的變量數(shù)據(jù)類型。例如,數(shù)組可以存放一系列的數(shù)據(jù)而非單個數(shù)據(jù)。
3.1.3 條件
程序本身并不能作出抽象的決定,但是它可以獲取數(shù)據(jù),并對數(shù)據(jù)進行分析比較,然后根據(jù)分析結果執(zhí)行不同的任務。
例如,你想要檢查用戶輸入的名字并確定其至少包含3個字母。程序需要做的事情就是對用戶名作出判斷,如果是3個或更多的字母,就執(zhí)行一種操作;如果不足3個字母則執(zhí)行另一種操作。
這里,作出一個決定需要兩步,第一步是檢查條件是否滿足,如果名稱符合3個字母長度,條件滿足,我們稱條件的值為真(true);否則條件不滿足,我們稱條件的值為假(false)。所有的條件都必須是兩個值中的一種,要么為真,要么為假。要么為真(true)要么為假(false)的數(shù)據(jù)類型稱為布爾(boolean)類型。
決定的第二步是根據(jù)條件為true或為false的情況選擇要執(zhí)行哪些代碼。有時只有一個選項,當條件為true時執(zhí)行該選項;如果條件為false,將不執(zhí)行任何代碼。有時會有兩個相對的選項,條件為true和false時分別執(zhí)行不同的代碼。
例如,你想讓計算機根據(jù)一個變量的值是1、2或3執(zhí)行3種不同的任務,可以像這樣表達:
如果變量的值等于1,執(zhí)行命令1
如果變量的值等于2,執(zhí)行命令2
如果變量的值等于3,執(zhí)行命令3
條件總是建立在比較之上的,你可以比較兩個變量的值以判斷它們是否相等;或者判斷一個是否大于另一個,或是小于另一個。如果變量是字符串類型,你可以比較它們按字典順序排列時的先后次序。
3.1.4 循環(huán)
與人不同,計算機很適合做重復性的工作。一件事情僅僅重復幾次就可能使人厭倦,但是讓計算機重復執(zhí)行成千上萬次它都照樣有耐心。
循環(huán)在每種編程語言中都是一個很重要的部分,ActionScript也不例外。你可以指定一條指令執(zhí)行給定的次數(shù),或者令其執(zhí)行到滿足指定的條件為止。
事實上,條件是循環(huán)中的重要組成部分,整個循環(huán)只需要一個開始點,一個結束點,再加上一個標志循環(huán)結束的條件。
例如,你需要循環(huán)10次,使用一個變量從0開始計數(shù)。每循環(huán)一次,計數(shù)加1。當計數(shù)變量達到10時,循環(huán)結束,程序繼續(xù)執(zhí)行循環(huán)以后的部分。下面的內容代表了一個標準的循環(huán)結構:
(1)循環(huán)以前的命令。
(2)循環(huán)開始,計數(shù)變量置0。
(3)循環(huán)中的命令。
(4)計數(shù)變量加1。
(5)如果計數(shù)變量小于10,執(zhí)行步驟(3)。
(6)循環(huán)以后的命令。
在上面的步驟中,步驟(1)只執(zhí)行1次,步驟(2)表示循環(huán)的開始,步驟(3)、(4)、(5)都將執(zhí)行10次,當循環(huán)結束后,執(zhí)行步驟(6)及以后的部分。
3.2 ActionScript之一角
當你在編寫自己的腳本時,你會用到各種各樣不同的關鍵字和符號,為便于你熟悉腳本的構成,下面先來看一個真實的例子。
這是一段作用于按鈕的腳本,當用戶單擊按鈕時(確切地說是松開按下的按鈕時)執(zhí)行它。其中沒有包含特殊的函數(shù),但是它體現(xiàn)了ActionScript的主要結構。
on (release) {
var myNumber = 7;
var myString = "Flash MX ActionScript";
for (var i=0; i<myNumber; i++) {
trace(i);
if (i + 3 == 8) {
trace(myString);
}
}
}
腳本的第1行表明當用戶松開按下的按鈕時執(zhí)行大括號中的語句。on (release)結構只能用于按鈕,其他相關的幾種用法如on(press)、on(rollOver)、on(rollout)、on(dragOver)、on(dragOut)等。
第1行末尾的大括號{表示一段相對獨立的代碼段的開始。從{到與之相對的}之間的代碼是一個整體,它們都從屬于按鈕的release事件。
請注意,大括號之后的代碼較之第1行有一個制表符(按一次Tab鍵)的縮進,其后的每行代碼與之具有相同的縮進程度,直到一個新的大括號開始,在新大括號后的語句會比前面的語句增加一個制表符的縮進,以此類推,這種特點與其他編程語言是類似的。Flash會自動將你添加的代碼設置成正確的縮進樣式。
代碼的第1行創(chuàng)建一個名為myNumber的局部變量,并將該變量的值設置為7。下面一行將字符串Flash MX ActionScript賦給另一個變量myString。稍后我們會更詳細的介紹變量的兩種類型:局部變量和全局變量。
分號;表示一條指令的結束,在每個完整指令的末尾都應該添加分號。
for代表一個循環(huán)結構的開始,此處的循環(huán)執(zhí)行7(myNumber)次,即令i從0遞增到6,每遞增1便執(zhí)行一次循環(huán)結構中的語句。for后面大括號中的部分即為循環(huán)體。
命令trace將它后面括號中的內容發(fā)送到輸出窗口。我們將在下一部分詳細介紹輸出窗口。
if是一種條件結構,它測試后面的內容i + 3 == 8是否為true,如果為true,則執(zhí)行后面的語句;否則跳過該代碼段。
if結構中只有一個trace命令,它將變量myString的值發(fā)送到輸出窗口。
上例腳本以三個反向大括號}結束,第1個表示if語句的結束,第2個表示for語句的結束,第3個表示整個on(press)段結束。
3.3 輸出窗口
輸出窗口是只在測試Flash影片時出現(xiàn)的一個編程工具,Flash用它來顯示出錯信息或其他的一些重要信息。用戶可以用ActionScript中的trace命令自定義要發(fā)送到輸出窗口中的信息。
輸出窗口在測試程序時非常有用。你可以使用trace命令在輸出窗口中顯示變量的值或者哪一部分ActionScript正在執(zhí)行。
輸出窗口還可以幫助你學習ActionScript。你可以編寫一些小程序,將信息發(fā)送到輸出窗口,這將幫助你看到程序的運行結果。
要想熟悉輸出窗口,最好的方法就是多使用它。下面就來編寫一段小程序,將信息發(fā)送到輸出窗口。
(1)啟動Flash MX。
(2)選中時間軸的第1幀,打開第1幀的動作面板。
(3)使用右上角的菜單將動作面板切換到專家模式。
(4)在腳本編輯區(qū)單擊鼠標,將鼠標光標定位到腳本編輯區(qū)中。
(5)在動作面板中輸入如下ActionScript:
trace("I like ActionScript!");
(6)按Ctrl+Enter鍵測試影片,因為舞臺中沒有任何圖像,所以你將看到一個空白窗口,同時出現(xiàn)一個輸出窗口,窗口中顯示:I like ActionScript!如圖3-2所示。 輸出窗口顯示了trace命令中的信息
和動作面板一樣,輸出窗口右上角也有一個下拉菜單,其中包含了拷貝、清除、查找、保存到文件以及打印等命令。
下拉菜單的最后一項命令是“調試級別”,你可以選擇“錯誤”、“警告”、“詳細”中的一種,如果選擇“無”,將不顯示任何信息。
3.4 ActionScript基本語法
前面介紹了程序的基本結構,下面要講解ActionScript中的基本語法。
3.4.1 變量
1.設置變量
在ActionScript中使用變量的方法很簡單,你只需要為變量名分配一個值,例如:
myVariable = 7;
該例在創(chuàng)建名為myVariable的變量的同時將其值設置為7,你可以為變量任意取一個名字,而并不需要使用本例中的myVariable。
可以使用輸出窗口查看變量的值,如在一個空白影片第一幀的動作面板中添加如下ActionScript:
x = 7;
trace(x);
首先,數(shù)字7被存儲在變量x中;然后,使用trace命令將變量x的值發(fā)送到輸出窗口。影片播放時,輸出窗口中會顯示數(shù)字7。
2.全局變量
根據(jù)變量作用的范圍不同可將變量分為全局變量和局部變量。
全局變量就是可以作用在整個Flash影片的所有深度級別上的變量。你可以在某一幀中設置它,并在其他幀中使用和改變它的值。
你不需要使用特別的方法創(chuàng)建全局變量,像前一個例子一樣,直接設置并使用它,它自動成為一個全局變量。
在許多編程語言中,全局變量可以在任何地方使用。Flash影片使用一個概念叫層級(level)。整修影片的主時間軸作為根(root)層級,影片剪輯是時間軸中的小影片。影片剪輯中的圖形和腳本要比根層級低一個級別。影片剪輯不能直接使用根層級中的全局變量。
3.局部變量
局部變量只能存在于當前腳本中,而在其他幀中它將不再存在。你可以在使用同一個變量名在不同的幀中創(chuàng)建不同的局部變量,它們之間將互不影響。
局部變量可用來創(chuàng)建模塊化的代碼。當前腳本執(zhí)行完時,局部變量將被從內存中刪除;而全局變量將保留到影片結束。
創(chuàng)建局部變量需要使用關鍵字var。例如,下面的ActionScript創(chuàng)建值為15的局部變量myLocalVariable:
myLocalVariable = 15;
使用var創(chuàng)建局部變量后,在當前代碼中就不再需要使用關鍵字var了。例如,下面的代碼創(chuàng)建值為20的局部變量myLocalVariable,然后將其值改為8,再發(fā)送到輸出窗口中。
var myLocalVariable = 20;
myLocalVariable = 8;
trace(myLocalVariable);
如果沒有特殊的需要,請盡量使用局部變量。
3.4.2 比較
在ActionScript中比較兩個事物是很容易的,要進行比較可以使用標準的數(shù)學符號,如=、<、>等。
1.相等
在ActionScript中用比較運算符對兩個值進行比較。
要比較兩個值是否相等,可以使用連在一起的兩個等于符號(==)。單個等于符號(=)是用來為變量分配值的,并不是比較運算符。
如果要比較變量x的值是否等于7,就可以使用==符號,如下所示:
var x = 7;
trace(x == 7);
以上代碼使用=符號將變量x設置為7,然后使用==符號對x和7進行比較。
測試這兩行代碼,輸出窗口將顯示“true”。如果將x設置為8或其他數(shù),則會顯示“false”。
==符號還可以用來比較兩個字符串。如下所示:
var myString = "Hello ActionScript.";
trace(myString == "Hello ActionScript.");
trace(myString == "hello ActionScript.");
程序運行時,你將在輸出窗口中看到一個“true”和一個“false”,因為在字符串中字母是要區(qū)分大小寫的。
如果你要比較兩個值是否不等,可以使用!=符號,它的意思是“不等于”。如下所示:
var a = 7;
trace(a != 9);
trace(a != 7);
第1個trace語句顯示信息“true”,因為a確實不等于9;第2個trace語句顯示信息“false”。
2.小于和大于
使用標準的數(shù)學符號<和>比較兩數(shù)是否成小于或大于關系。舉例如下:
var a = 9;
trace(a < 10);
trace(a > 5);
trace(a < 1);
你將從輸出窗口中看到“true”、“true”和“false”。
符號<=或>=用于比較一個數(shù)是否小于等于或大于等于另一個數(shù),如下所示:
var a = 9;
trace(a <= 9);
trace(a >= 9);
trace(a >= 7);
以上3個trace語句都將顯示“true”。
3.4.3 運算
通過運算可以改變變量的值。分別使用算術運算符+、-、*、/執(zhí)行加、減、乘、除操作。
如下所示的ActionScript將值為9的變量x加上一個數(shù)7:
var x = 9;
x = x + 7;
trace(x);
運算結果為16。
在ActionScript中執(zhí)行運算可以使用一些簡寫方法,如+=運算符將其前后的值相加并將結果賦給它前面的變量。前面的腳本也可以寫成如下的形式:
var x = 9;
x += 7;
trace(x);
++運算符與+=運算符類似,但它每執(zhí)行一次,變量的值只增加1,如下面的例子:
var x = 9;
x++;
trace(x);
結果顯示10。再看下面的例子:
var x = 9;
trace(x++);
trace(x);
結果是9和10。為什么呢?因為第1個trace語句輸出x的當前值9,然后將x加1,輸出x的新值10。
再試一下下面的腳本:
var x = 9;
trace(++x);
trace(x);
這次的結果為兩個10。因為將++運算符置于變量前面,將先執(zhí)行運算再返回變量的值。
同理,--運算符執(zhí)行遞減操作,-=運算符在變量當前值的基礎上減去一個數(shù),*=運算符在變量當前值的基礎上乘上一個數(shù),/=運算符在變量當前值的基礎上除以一個數(shù)。
3.4.4 條件
既然現(xiàn)在你已經(jīng)知道如何比較兩個變量,你就可以將比較結果作為執(zhí)行某些語句的條件。
1.if語句
if語句使你可以使用比較結果控制Flash影片的播放。如下所示的語句判斷X是否等于9,如果比較結果為true,則讓影片跳到第15幀:
if (x == 9) {
gotoAndPlay(15);
}
if語句以if開始,其后緊跟一個比較表達式,比較表達式通常用一對括號括起來,再后面即是用大括號括起來當比較結果為true時要執(zhí)行的代碼。
2.else
對if語句可以進行擴展,使用else執(zhí)行條件不成立(比較表達式為false)時的代碼,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else {
gotoAndPlay(16);
}
你也可以使用else if語句將if語句更推進一步,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else if (x == 10) {
gotoAndPlay(16);
} else if (x == 11) {
gotoAndPlay(20);
} else {
gotoAndPlay(25);
}
你可以讓if語句想要多長就有多長,你也可以使用else if語句對別的變量進行比較,如下所示:
if (x == 9) {
gotoAndPlay(15);
} else if (y<20) {
gotoAndPlay(16);
} else {
gotoAndPlay(25);
}
3.復合比較
你可以在一個if語句中對幾個比較表達式的值進行判斷,比如說你希望在x為9并且y為20時跳轉到第10幀,可以使用如下所示的腳本:
if ((x == 9) && (y == 20)) {
gotoAndPlay(10);
}
邏輯與運算符&&將兩個比較表達式聯(lián)接在一起成為一個復合表達式,當兩個表達式的值都為true時復合表達式的值才為true。每個比較表達式都需要添加獨立的括號以便Flash能正確識別。在Flash的早期版本中使用and執(zhí)行邏輯與運算,現(xiàn)在已推薦不使用。
你也可以使用邏輯或運算符||將兩個比較表達式聯(lián)接在一起成為一個復合表達式,只要有一個表達式的值為true,復合表達式的值就為true。如下所示:
if ((x == 7) || (y == 15)) {
gotoAndPlay(20);
}
在該腳本中,只要x為7或者y為15,或者兩者都成立,結果都是跳轉到第20幀。只有當兩者都不成立時,才不會執(zhí)行gotoAndPlay命令。在Flash的早期版本中使用or執(zhí)行邏輯或運算,現(xiàn)在已推薦不使用。
3.4.5 循環(huán)
ActionScript中的循環(huán)要比if語句稍微復雜一點。它的循環(huán)結構與C語言中的循環(huán)結構幾乎是一致的。
1.for循環(huán)結構
for結構是主要的循環(huán)結構,其樣式如下所示:
for (var i = 0; i<10; i++) {
trace(i);
}
運行這段代碼,隨著局部變量I的改變,輸出窗口中將顯示數(shù)字0~9。
for結構中關鍵字for后面的括號中包含3個部分,它們之間用分號隔開。
第1部分聲明一個局部變量,在本例中創(chuàng)建了一個局部變量i并將其設置為0。該部分只在循環(huán)體開始執(zhí)行之前執(zhí)行一次。
第2部分作為一個供測試的條件,在這里,測試i是否小于10。只要滿足該條件,就會反復執(zhí)行循環(huán)體。循環(huán)開始的時候i等于0,它是小于10的,所以循環(huán)得以執(zhí)行。
第3部分是一個運算表達式,每完成一次循環(huán)都將執(zhí)行該表達式一次。在這里,i每次遞增1,然后轉到第2部分對i的新值進行判斷。
大括號中的部分是該循環(huán)的循環(huán)體,每執(zhí)行一次循環(huán)都將執(zhí)行其中的所有命令。我們來看看計算機是如何處理這個循環(huán)的。
聲明變量i并將其值設為0;
判斷條件i<10,結果為true,開始執(zhí)行循環(huán)體;
現(xiàn)在i值為0,trace命令將i值發(fā)送到輸出窗口,輸出窗口顯示0;
第1次循環(huán)結束,回到循環(huán)開始處,i在原來的基礎上遞增1,i值變?yōu)?;
判斷條件i<10,結果為true,繼續(xù)執(zhí)行循環(huán)體;
trace命令將i的值1發(fā)送到輸出窗口;
然后i再加1,這樣循環(huán)下去直到執(zhí)行完10次循環(huán);
回到循環(huán)開始處,i在原來的基礎上遞增1,i值變?yōu)?0;
判斷條件i<10,結果為false,結束循環(huán),開始執(zhí)行for結構后面的代碼。
2.其他形式的循環(huán)結構
for循環(huán)是最常用的一種循環(huán)結構,除for循環(huán)之外還有while循環(huán)和do…while循環(huán)。
while循環(huán)的例子如下所示:
i = 0;
while (i != 10) {
trace(i);
i++;
}
while循環(huán)看起來似乎要比for循環(huán)簡單一些,從結構上看甚至與if語句還有一些相似。只要while后面括號中的條件成立,循環(huán)就會一直進行下去,所以在while循環(huán)體中需要有改變條件的語句,以使條件最終能夠為false,完成循環(huán),如上例中的i++。
與while循環(huán)相似的是do…while循環(huán),如下所示:
i = 0;
do {
trace(i);
i++;
} while (i != 10);
除了測試條件的位置不同,while循環(huán)和do…while循環(huán)幾乎是一樣的。while循環(huán)在循環(huán)體之前測試條件,do…while循環(huán)在循環(huán)體之后測試條件,所以do…while循環(huán)至少要執(zhí)行一次,而while循環(huán)有可能一次也不執(zhí)行。
3.跳出循環(huán)
所有的循環(huán)結構都可以使用兩個命令改變循環(huán)的執(zhí)行流程,一個命令是break,另一個命令是continue。break命令終止循環(huán),并跳到循環(huán)結構后面的語句處執(zhí)行;continue命令終止本輪循環(huán)但不跳出循環(huán),進而執(zhí)行下一輪循環(huán)。
使用break和continue的例子都比較復雜,另外,還有一種特殊的for…in循環(huán)結構,在用到它們的時候我們再詳細講解。
3.4.6 函數(shù)
到現(xiàn)在為止,我們都是將腳本放在影片的第1幀中。如果程序相當復雜,再放在同一幀中就使腳本顯得太龐大了。
函數(shù)使你可以組織需重用的代碼,并放在時間軸中,例如:
function myFunction(myNum) {
var newNum = myNum+5;
return newNum;
}
函數(shù)以關鍵字function開頭,function后面是函數(shù)名。與變量名相似,你可以指定自己的函數(shù)名,最好將函數(shù)名取得有意義一些。
函數(shù)名后面的括號容納該函數(shù)的參數(shù),所謂參數(shù)也是一個變量,它的值在調用該函數(shù)時予以指定。一個函數(shù)可以有若干參數(shù),也可以沒有參數(shù)。無論有沒有參數(shù),函數(shù)名后都應緊跟一對括號。
大括號中的部分是函數(shù)體,在函數(shù)體中創(chuàng)建了一個局部變量newNum,將myNum加5的結果設置為newNum的值。如果你將10作為參數(shù)傳遞給該函數(shù),newNum的值就是15。
return命令僅用于函數(shù)中,使用return結束一個函數(shù)并返回函數(shù)值。此處,newNum是用return命令返回的函數(shù)值。
要使用函數(shù),就需要調用它,如下所示:
var a = myFunction(7);
該語句創(chuàng)建一個新的局部變量a,將7作為參數(shù)調用函數(shù)myFunction,并將函數(shù)返回的結果作為變量a的值。
被調用的函數(shù)開始運行,創(chuàng)建一個局部變量myNum,將7作為myNum的值,然后執(zhí)行函數(shù)體內的代碼,使用return命令將newNum的值12返回給函數(shù)的調用者。這時,a的值變?yōu)?2。
函數(shù)最大的作用體現(xiàn)在它可以重復使用。如下所示的3行代碼產(chǎn)生3個不同的結果:
trace(myFunction(3));
trace(myFunction(6));
trace(myFunction(8));
運行以上代碼,你將得到結果8、11和13。
使用函數(shù)還有一個好處就是可以只改變函數(shù)中的一處,從而影響所有調用該函數(shù)的命令。例如,將函數(shù)myFunction中的var newNum = myNum+5改成var newNum = myNum+7,上面3個調用該函數(shù)的命令的結果將變成10、13和15
3.4.7 點語法
ActionScript中一個很重要的概念是點語法。點語法也是很多面向對象的編程語言中用來組織對象和函數(shù)的方法。
假設你想求一個數(shù)的絕對值,Flash中有一個內置的絕對值函數(shù),它包含在ActionScript的“對象”/“核心”/“Math”/“方法”中。要使用絕對值函數(shù),首先要使用對象名,即Math,然后是方法名abs,它們之間用符號“.”隔開,具體表示方法如下所示:
var a = Math.abs(-7);
點語法的另一個用途是指定影片剪輯的屬性。如下面的語句將影片剪輯myMC的_alpha(透明度)屬性設置為50%:
myMC._alpha = 50;
你還可以在影片剪輯中使用點語法定位根(root)中的一個全局變量。如果你在主時間軸中創(chuàng)建了一個全局變量globelVar,而要在影片剪輯中使用這個全局變量,可以使用如下的語句:
trace(_root.globleVar);
如果你現(xiàn)在對對象、影片剪輯屬性、層級之類的概念還不熟悉,不用著急,在以后的內容中我們將對它們進行更深入的講解。
3.4.8 注釋
我們可以在Flash的動作面板中添加注釋,注釋就是程序中并不參與執(zhí)行的那些代碼。它可以用來提醒你某些代碼的作用,方便你組織和編寫腳本。一個注釋的例子如下所示:
// 將影片剪輯myMC的透明度設置為50%
myMC._alpha = 50;
該例的第1行是注釋,注釋以雙斜線//開頭,在//后面你可以輸入任意的文本和符號,Flash會自動將注釋部分用灰色標示。
上例是將注釋專門放在一行中,你也可以將注釋放在一行代碼的后面,如下所示:
myMC._alpha = 50; // 將影片剪輯myMC的透明度設置為50%
只要使用//符號,Flash就會忽略它后面的部分。
3.5 調試腳本
無論在編寫程序時有多么細心,每個程序員都避免不了要調試程序。要學好ActionScript,你就得熟練掌握調試程序的方法。在Flash MX中調試程序有3種方法:邏輯推斷、向輸出窗口發(fā)送信息和使用腳本調試器。
3.5.1 邏輯推斷
許多程序錯誤其實很簡單,也很容易解決,并不需要專門的調試工具。當程序出現(xiàn)錯誤時,你應對錯誤出現(xiàn)在哪里有一個大致的把握。
就算你不知道問題出在哪里,但通過細心閱讀代碼,你也有可能找到它。你可以思考一下,你要實現(xiàn)的效果是什么?現(xiàn)在的效果與你的設想有多大差距?是什么原因造成了這種差距?修改哪些部分有望改正這種錯誤?經(jīng)過反復思考、修改和調試,你對程序的理解就會不斷加深,你的程序也會越來越趨于正確。
沒有人比你更了解你自己的程序,所以對你來說,你編寫的程序最先宜采用邏輯推斷的方法進行調試。還有一些錯誤或漏洞隱藏得比較深,這就需要借助于調試工具。
3.5.2 輸出窗口
輸出窗口是一個簡單而實用的調試工具,在程序中可以使用trace命令將特定的信息發(fā)送到輸出窗口中,這些信息可以幫助你了解代碼的運行情況。
前面我們已經(jīng)介紹過輸出窗口,這里就不再贅述了。
3.5.3 調試器
調試器是一個更專業(yè)的調試工具,它是Flash MX中的一個窗口,通過調試器可以查看影片中的各種數(shù)據(jù)以及ActionScript代碼的運行情況。
選擇“控制”→“調試影片”命令,或按快捷鍵Ctrl+Shift+Enter,開始調試影片。與測試影片不同的是,調試影片時多了一個調試器窗口
調試器窗口中包含很多窗格,在左邊的窗格中可以檢查Flash影片中不同類型的對象,右邊的窗格顯示影片中所有的ActionScript。
在調試器窗口中可以設置斷點,斷點即是為某行代碼添加的一個標記,當調試影片時,影片會自動在斷點處停止,允許你查看當前包括變量值在內的的影片狀態(tài)。使用斷點可以使你逐行地執(zhí)行代碼,對每行代碼的運行結果進行觀察和分析。
初學ActionScript的時候,你可能并不需要使用調試器;但是當你成長為一名經(jīng)驗豐富的程序員時,你就會發(fā)現(xiàn)它對你是非常有用的。

?

第4章 影片播放控制

控制影片播放流程的命令有許多,如下所示:
stop:使影片停止在當前時間軸的當前幀中。
play:使影片從當前幀開始繼續(xù)播放。
gotoAndStop:跳轉到用幀標簽或幀編號指定的某一特定幀并停止。
gotoAndPlay:跳轉到用幀標簽或幀編號指定的某一特定幀并繼續(xù)播放。
nextFrame:使影片轉到下一幀并停止。
prevFrame:使影片回到上一幀并停止。
stop命令常常用在幀動作中,以使影片停止并等待用戶控制。其他命令常常用在按鈕的事件處理函數(shù)中。

4.1 使影片停止
最簡單的ActionScript恐怕要算stop命令了,當執(zhí)行stop命令的時候,影片在當前的幀處停止播放。
你可以將stop命令放到時間軸的某一關鍵幀中,在stop后面需要緊跟一對括號,如下所示:
stop();
執(zhí)行stop命令時,影片只是暫停在當前幀,在影片中嵌入的影片剪輯或圖形元件繼續(xù)播放,停止的僅僅是主時間軸中的動畫。
要讓影片繼續(xù)播放,需要用到ActionScript的另一個命令play。play命令使影片轉到下一幀并繼續(xù)播放。
我們將在按鈕部分介紹play命令,下面以一個例子的形式介紹stop命令的使用,其操作步驟如下:
(1)啟動Flash MX,在時間軸中插入兩個空白關鍵幀,使時間軸包含3個空白關鍵幀。
(2)在3個關鍵幀中使用文本工具分別添加字符1、2、3。
(3)選中第2幀,按F9鍵打開動作面板,在其中添加如下的ActionScript:
stop();
(4)按Ctrl+Enter測試影片,影片播放到第2幀即停止,你將看不到第3幀。
4.2 跳轉到指定幀
另一個基本的ActionScript命令是gotoAndPlay。該命令使影片從當前幀跳轉到指定的任意一幀。可以用幀編號或幀標簽指定一幀,如下所示:
gotoAndPlay(9);
gotoAndPlay("myFrame");
如果影片中不止一個場景,你也可以指定要跳轉到的特定場景的特定幀。如果gotoAndPlay命令中只有一個參數(shù),Flash將認為它代表某個幀;如果有兩個參數(shù),第1個參數(shù)將作為場景名,第2個參數(shù)代表該場景中的幀。如下所示:
gotoAndPlay("myScene", 1);
它表示跳轉到場景myScene的第1幀繼續(xù)播放。
gotoAndPlay命令使影片跳轉到某一特定幀并從該幀開始繼續(xù)播放,如果要使影片跳轉到某一特定幀并在該幀位置停止,就應該使用gotoAndStop命令。它的使用方法與gotoAndPlay命令相似,僅僅是跳轉幀后執(zhí)行的動作不同罷了。
還有兩個實現(xiàn)跳轉幀動作的命令,它們是nextFrame和prevFrame。nextFrame命令使影片從當前位置轉到下一幀并停止,prevFrame命令使影片從當前位置轉到上一幀(即回退一幀)并停止。它們后面都必須使用括號。
要了解這些命令究竟如何使用,最好的方法就是使用按鈕,下面我們就來看看如何創(chuàng)建按鈕。
4.2.1 創(chuàng)建按鈕
要創(chuàng)建按鈕,可以選擇“插入”→“新建元件”命令或按快捷鍵Ctrl+F8,你將看到一個“創(chuàng)建新元件”對話框,在該對話框中你可以在影片剪輯、按鈕和圖形這3種類型中選擇要創(chuàng)建元件的類型。
選擇按鈕類型,單擊“確定”按鈕,Flash窗口將由主場景切換到按鈕元件的編輯場景。按鈕元件的時間軸中有4個幀,分別是彈起(Up)、指針經(jīng)過(Over)、按下(Down)、和點擊(Hit),它們代表了按鈕的3種狀態(tài)和熱區(qū)(熱區(qū)的形狀代表了按鈕能在什么范圍內感應到鼠標的動作)。
如果你在按鈕的第1幀中放置一個圖形,而在其他3個幀中不放置任何東西,那么該按鈕的3種狀態(tài)和熱區(qū)將是一樣的。
要使按鈕顯示不同的狀態(tài),就需要在它的不同關鍵幀中創(chuàng)建不同的圖形或影片剪輯。
完成對按鈕的創(chuàng)建后,可以單擊舞臺上方的場景名“場景1”回到主場景。
按F1或Ctrl+L打開庫面板,你將看到庫中增加了一個按鈕,用鼠標將它拖到舞臺中。
4.2.2 為按鈕添加腳本
要為按鈕添加腳本,首先得選中該按鈕,然后按F9鍵打開動作面板。你也可以在該按鈕上單擊鼠標右鍵,在彈出的快捷菜單中選擇“動作”命令,這樣也可以打開按鈕的動作面板。
在專家模式下輸入如下腳本:
on (release) {
trace("You are cliking me!");
}
按鈕的腳本有特殊的語法,即必須以關鍵字on開頭,以on開頭的代碼是一種事件處理函數(shù),即當特定事件發(fā)生時要執(zhí)行的代碼。在這里,特定事件就是release(松開鼠標),它是按鈕最常用的事件。
按鈕事件還有press、releaseOutside、rollOver、rollOut、dragOver、dragOut以及keyPress等。press是按下鼠標事件,它在release事件之前發(fā)生,releaseOutside是在按鈕上按下鼠標,并且在按鈕外松開鼠標的事件,rollOver是鼠標指針移到按鈕所在熱區(qū)的事件,rollOut是鼠標從按鈕熱區(qū)移出的事件,dragOver是在鼠標指針位于按鈕上方并已按下按鈕的情況下,滑出按鈕再滑回按鈕的事件,dragOut是當鼠標指針位于按鈕內部,按下按鈕然后滾動出按鈕區(qū)域的事件,keyPress是按鈕響應在鍵盤上按下某些鍵時的事件。
某種事件的發(fā)生,會觸發(fā)相應事件處理函數(shù)開始運行,上例中使用trace語句將事件信息發(fā)送到輸出窗口中,使你可以更好地了解具體按鈕事件的含義。
4.3 練習:演示文檔
用Flash可以實現(xiàn)演示文檔的功能,演示文檔相當于我們常說的幻燈片,它可以進行逐頁展示。如果不使用腳本,Flash動畫會很快地播放每一幀,要用Flash制作演示文檔就得對Flash添加控制命令。
我們用腳本使每一幀停止,要跳轉到別的幀,就需要使用按鈕。
制作演示文檔的操作步驟如下:
(1)啟動Flash MX,編輯前5幀。
(2)在文檔中創(chuàng)建5個按鈕,從庫面板中可以看到它們。
(3)打開主時間軸第1幀的動作面板,其中添加了如下語句:
stop();
影片播放時,會停止在第一幀上。
(4)為圖層2的第1幀和第5幀分別添加幀標簽begin和end,
(5)選中第1幀中的“開始”按鈕,打開其動作面板,在其中添加如下語句:
on (release) {
nextFrame();
}
單擊“開始”按鈕,停止在第1幀的影片會跳轉到第2幀并停止。
(6)分別在第2~4幀的相同位置添加按鈕“首頁”、“上一頁”、“下一頁”、“末頁”。由于第5幀后面沒有別的幀,所以只添加“上一頁”和“首頁”兩個按鈕。
(7)為所有“首頁”按鈕添加腳本:
on (release) {
gotoAndStop("begin");
}
單擊“首頁”按鈕,影片將跳轉到幀標簽為begin的那一幀并停止,即第1幀。這里也可以用1替代"begin"。
(8)為所有“上一頁”按鈕添加腳本:
on (release) {
prevFrame();
}
單擊“上一頁”按鈕,影片將從當前幀跳轉到前一幀并停止。
(9)為所有“下一頁”按鈕添加腳本:
on (release) {
nextFrame();
}
單擊“下一頁”按鈕,影片將從當前幀跳轉到下一幀并停止。
(10)為所有“末頁”按鈕添加腳本:
on (release) {
gotoAndStop("end");
}
單擊“末頁”按鈕,影片將從當前幀跳轉到幀標簽為end的那一幀并停止,在此處也即是第5幀。
(11)按Ctrl+Enter鍵測試一下影片,單擊各個按鈕試一下效果。這些添加了ActionScript的按鈕是不是變得非常聽話?

?

第5章 控制影片剪輯

影片剪輯是Flash中最重要的一種元件,對影片剪輯的控制是ActionScript的最重要功能之一。從根本上說,Flash的許多復雜動畫效果和交互功能都與影片剪輯的運用密不可分。
使用點語法或方括號可以定位影片剪輯。使用方括號時可以使用由變量表示的影片剪輯實例名,這是它相對于點語法的優(yōu)點。
可以用腳本控制影片剪輯的各種動作,也可以在影片剪輯的事件處理函數(shù)中控制主時間軸和別的影片剪輯。影片剪輯最重要的兩個事件是load和enterFrame。

5.1 控制影片剪輯的播放動作
設想一個Flash動畫,它的主場景中只有一個幀,舞臺中只有一個影片剪輯,影片剪輯中并沒有ActionScript。如何才能控制影片剪輯的播放動作呢?
要控制一個影片剪輯,首先應該為影片剪輯命名。容易混淆的是,庫面板中的影片剪輯本身有一個名稱,這里要命名的是場景中影片剪輯實例的名稱。它們可以相同,也可以不相同。如果你在場景中創(chuàng)建了同樣的影片剪輯的多個實例,那么就需要將每個實例以不同的名稱命名,才能用ActionScript對每一個實例進行控制。如果不需要對影片剪輯進行控制,也就不需要為影片剪輯的實例命名。
從本例文件中,你將看到庫面板中只有一個影片剪輯rollmc,場景中創(chuàng)建了一個rollmc的實例。你還可以再從庫中拖出若干個rollmc的實例將它們放置到場景中。
選中場景中影片剪輯rollmc的實例,打開屬性面板,可以看到它被命名為roll,你同時可以看到該影片剪輯原來的名字rollmc。你也可以為它指定別的名稱,也可以是rollmc,Flash并不會混淆它們之間的區(qū)別。 實例名稱可以在程序中用來指代該影片剪輯實例,如果要控制該實例,就需要在腳本中使用該名稱。下面,我們就來看看如何通過腳本控制影片剪輯實例roll。
分別選中場景中的4個按鈕,打開它們的動作面板,查看其中的代碼。
“STOP”按鈕:
on (release) {
roll.stop();
}
單擊“STOP”按鈕使roll實例停止播放。
“PLAY”按鈕:
on (release) {
roll.play();
}
單擊“PLAY”按鈕使roll實例繼續(xù)播放。
“PREV”按鈕:
on (release) {
roll.prevFrame();
}
單擊“PREV”按鈕使roll實例回退一幀并停止。
“NEXT”按鈕:
on (release) {
roll.nextFrame();
}
單擊“NEXT”按鈕使roll實例播放一幀并停止。
按Ctrl+Enter鍵測試影片,如圖5-2所示。一開始影片剪輯自動播放。單擊不同的按鈕看看影片剪輯是否執(zhí)行相應的動作。
除了這幾種命令,你還可以使用gotoAndStop或gotoAndPlay命令控制影片剪輯跳轉到具體的幀,但是在命令前面都需要指定影片剪輯的實例名稱。
這種方法是在影片剪輯實例所在的層級中控制影片剪輯,如果是在影片剪輯內部,要控制它自身的播放,就可以直接使用stop、play等命令,而不需要指定實例名稱。如果你在影片剪輯內部的時間軸中使用了名稱roll,Flash會在影片剪輯內部的時間軸中尋找該實例。
5.2 定位影片剪輯
我們已經(jīng)了解了如何使用最簡單的方法定位一個影片剪輯,即使用影片剪輯的實例名,后面緊跟一個點記號“.”,然后是你想要影片剪輯執(zhí)行的命令。
還有許多方法可以定位影片剪輯。首先,我們來看看如何定位Flash影片中不同層級的對象。
Flash影片中最基本的目標層級就是它的主時間軸。可以用關鍵字_root來表示和定位主時間軸。
例如,你要向主時間軸發(fā)送一個gotoAndStop命令,可以使用如下所示的語句:
_root.gotoAndStop(9);
如果這個命令是包含在主時間軸的某一幀上的,則可以省略目標_root。如果這個命令是包含在主時間軸上某個影片剪輯中,需要由影片剪輯來控制它上一級的主時間軸,_root就很有必要了。
通常,要定位包含某一對象的上一級對象,可以使用關鍵字_parent。所以,如果一個影片剪輯是包含在主時間軸中,在影片剪輯中使用_parent和_root的效果是一樣的。如果影片剪輯與主時間軸相差兩個層級,即當影片剪輯包含在另一個位于主時間軸中的影片剪輯中,這時在該影片剪輯中使用_parent指代的是它上一級的影片剪輯,而_root是指它上兩級的主時間軸。在主時間軸中不能使用_parent,因為主時間軸沒有上一級。
可以用數(shù)字來方便地說明這種層級關系。主時間軸,它始終是最初級,作為層級0。主時間軸中的一個影片剪輯處于層級1。如果影片剪輯中包含另一個影片剪輯,它處于層級2。對層級2上的影片剪輯來說,_parent指代的就是層級1上的影片剪輯,而不管對哪一級來說,_root始終指代層級0上的主時間軸。
除了用點記號連接_root和實例名,還可以使用方括號表示_root上的對象。對上例中的按鈕“STOP”來說,如下所示的3種方法作用是一樣的:
rool.stop();
_root.roll.stop();
_root["roll"].stop();
還有一個關鍵字this,它代表腳本當前所在的層級。如果腳本位于主時間軸中,this即指代主時間軸;如果腳本位于影片剪輯中,this即指代該影片剪輯。所以以上語句還可以用以下兩種方式表示:
this.roll.stop();
this["roll"].stop();
使用_root和this時還可以用變量來定位影片剪輯,如下所示:
var mcInsName = "roll";
_root[mcInsName].stop();
今后我們會遇到這種情況,即有roll0~rool99共100個影片剪輯實例,可以使用下面的語句來控制它們:
on (release) {
for (var i = 0; i<100; i++) {
_root["roll"+i].stop();
}
}
多數(shù)情況下我們習慣使用_root,但在某些情況下使用this比_root更簡便。如要在某個影片剪輯中定位包含 在此影片剪輯中的另一影片剪輯childMC,就可以直接使用this.childMC。
5.3 為影片剪輯添加腳本
現(xiàn)在你已經(jīng)知道如何向幀和按鈕中添加腳本,下面需要知道如何向影片剪輯中添加腳本。
要為影片剪輯添加腳本,首先要選中影片剪輯,再打開它對應的動作面板,然后在其中輸入腳本。影片剪輯腳本和按鈕的腳本類似,它們都使用事件處理函數(shù),與按鈕的on關鍵字不同,影片剪輯使用onClipEvent關鍵字。當某種影片剪輯事件發(fā)生時,就會觸發(fā)相應的事件處理函數(shù)。
影片剪輯最重要的兩種事件是load和enterFrame。
load事件在影片剪輯完全加載到內存中時發(fā)生。在每次播放Flash影片時,每個影片剪輯的load事件只發(fā)生一次。
在主時間軸停止播放時,影片中的影片剪輯并不會停止播放,這個特性決定了影片剪輯的另一個事件enterFrame的重要性。enterFrame事件在影片每次播放到影片剪輯所在幀時發(fā)生。如果主時間軸中只有一幀,且不論它是否在該幀停止,該幀中的影片剪輯都會不斷觸發(fā)enterFrame事件,且觸發(fā)的頻率與Flash影片的幀頻一致。
影片剪輯事件的使用方法如下所示:
onClipEvent (load) {
var i = 0;
}
onClipEvent (enterFrame) {
trace(i);
i++;
}
當影片剪輯的load事件發(fā)生時,將變量i設置為0。當影片剪輯的enterFrame事件發(fā)生時,向輸出窗口中發(fā)送i的值,然后將i加1。輸出窗口中會從0開始輸出以1遞增的數(shù)字序列,直到影片被關閉為止。
為了熟悉影片剪輯事件處理函數(shù)的用法,我們來為影片剪輯編寫一段簡單的腳本,使影片剪輯逆序播放,
我們將從影片剪輯的最后一幀處開始播放,使用prevFrame命令使影片剪輯每次后退一幀。
本例文件場景中有一個影片剪輯元件rollmc,查看一下它的屬性面板,并沒有為其實例命名,這是因為我們要直接在影片剪輯的動作面板中添加腳本,并不需要用到實例名稱。
選中影片剪輯rollmc,此時動作面板的標題欄中應為“動作-影片剪輯”。打開動作面板,其中添加了如下ActionScript:
onClipEvent (load) {
gotoAndStop(40);
}
onClipEvent (enterFrame) {
prevFrame();
}
在事件處理函數(shù)onClipEvent (load)中,令Flash影片的播放頭轉到影片剪輯的第40幀(即最后一幀)。這個事件處理函數(shù)只在影片剪輯被加載完成時執(zhí)行1次。第2個事件處理函數(shù)onClipEvent (enterFrame)每播放1幀就執(zhí)行1次,使影片剪輯回退1幀。
按Ctrl+Enter鍵測試影片,你將看到齒輪以與上例相反的方向轉動,直到影片剪輯的時間軸回到第1幀,prevFrame命令不起作用,影片剪輯停止播放。要讓它連續(xù)不斷的播放,可以在影片剪輯元件rollmc的時間軸第1幀的動作面板中添加如下語句:
gotoAndStop(40);
5.4 用影片剪輯控制別的影片剪輯
一個影片剪輯可以控制別的影片剪輯。綜合使用_root或_parent關鍵字、點符號和影片剪輯實例名稱可以將命令發(fā)送給另一個影片剪輯實例。例如,在主時間軸上的影片剪輯實例roll1中添加如下腳本以控制同在主時間軸上的影片剪輯實例roll2回退1幀:
_root.roll2.prevFrame();
或者使用方括號表示如下:
_root["roll2"].prevFrame();
如果兩個影片剪輯不同在主時間軸上,而是同在別的層級上,可以使用_parent關鍵字。如果它們不同在一個層級上,也只需要使用點符號逐級標明所在的路徑即可。
下面綜合運用以上知識實現(xiàn)以影片剪輯控制另一個剪輯的播放動作。
(1)打開本例文件。分別查看場景中的每一層。按Ctrl+L打開庫面板。庫面板中有三個影片剪輯元件,分別是hour、minute和second。
(2)分別雙擊每個影片剪輯元件,查看它們的時間軸。
(3)second元件的的時間軸共60幀,secondhand圖形元件順時針旋轉1周。在第1幀中添加了如下ActionScript:
stop();
在最后1幀中添加了如下ActionScript:
_root[target].nextFrame();
gotoAndStop(1);
(4)minute元件的的時間軸共60幀,minutehand圖形元件順時針旋轉1周。在第1幀中添加了如下ActionScript:
stop();
在最后1幀中添加了如下ActionScript:
_root[target].nextFrame();
gotoAndStop(1);
(5)hour元件的的時間軸共12幀,hourhand圖形元件順時針旋轉1周。在第1幀中添加了如下ActionScript:
stop();
(6)回到主場景,在屬性面板中為hour影片剪輯和minute影片剪輯指定了與元件名稱相同的實例名稱。
(7)選中second元件實例,打開其動作面板,其中添加了如下ActionScript:
onClipEvent (load) {
target = "minute";
}
onClipEvent (enterFrame) {
nextFrame();
}
(8)選中minute元件實例,打開其動作面板,其中添加了如下ActionScript:
onClipEvent (load) {
target = "hour";
}
以上腳本的原理是:使每個影片剪輯都在各自的第1幀停止。在second的enterFrame事件中令其自身移到下一幀。直到second元件轉動完一周,到達最后一幀,使用_root[target].nextFrame();命令將target所指目標后移1幀,這里的target是在second影片剪輯實例的load事件中定義的,也就是minute。同樣,直到minute元件轉動完一周到達最后1幀,使用_root[target].nextFrame();命令將target所指目標后移1幀,這里的target是在minute影片剪輯實例的load事件中定義的,也就是hour。
由于影片剪輯的轉動是由nextFrame命令實現(xiàn)的,所以在每個元件內部時間軸的最后1幀中添加了跳轉到第1幀的語句,避免停止在最后1幀上。
上面的ActionScript主要有兩種,一種是在影片剪輯內部時間軸上的幀腳本,另一種是在主時間軸中的影片剪輯腳本。我們使用一個全局變量target記錄影片剪輯實例名稱,這個動作是在影片剪輯的事件處理函數(shù)中完成的,然后將這個全局變量應用到影片剪輯內部的幀腳本中。從這里也可以看到,影片剪輯動作和影片剪輯內部的幀動作是可以進行通信的,全局變量在它們之間有效,但在兩個影片剪輯之間就變得無效,所以我們可以在兩個影片剪輯中同時使用target而互不影響。
(9)按Ctrl+Enter測試影片

?

第6章 影片剪輯屬性 

通過調整影片剪輯的各種屬性可以改變影片剪輯的位置和顯示狀態(tài)。_x和_y屬性代表影片剪輯在場景中的水平坐標和垂直坐標。_xscale和_width屬性決定影片剪輯在水平方向上的顯示寬度,_yscale和_height屬性決定影片剪輯在垂直方向上的顯示高度。使用_rotation屬性可以旋轉影片剪輯。_alpha屬性代表影片剪輯的透明度,_visible屬性決定影片剪輯是否可見。使用關鍵字_xmouse和_ymouse可以獲取鼠標光標在屏幕中的坐標位置。

6.1 坐標
Flash場景中的每個對象都有它的坐標,坐標值以像素為單位。Flash場景的左上角為坐標原點,它的坐標位置為0,0,前一個0表示水平坐標,后一個0表示垂直坐標。Flash默認的場景大小為550×400像素,即場景右下角的坐標為550,400,它表示距坐標原點的水平距離為550,垂直距離為400。
場景中的每一點都可以用坐標表示
習慣地,水平坐標用x表示,垂直坐標用y表示。在Flash中,分別用_x和_y表示x坐標值屬性和y坐標值屬性。例如,要在主時間軸上表示場景中的影片剪輯myMC的位置屬性,可以使用下面的方法:
myMC._x
myMC._y
如果是在myMC自身的腳本中表示它的坐標,也以使用如下的方法:
_x;
_y;
或:
this._x;
this._y;
在屬性面板和信息面板中都有可以查看和更改對象的位置。選擇“窗口”→“信息”命令或按快捷鍵Ctrl+I都可以打開信息面板
信息面板中顯示了當前所選圖形或影片剪輯的大小、坐標位置、顏色以及鼠標位置等。圖6-2中信息面板右邊的兩個數(shù)值框X和Y代表了所選對象的水平坐標和垂直坐標。面板中的 圖標表示坐標位置是以所選對象的左上角為基準還是以中心為基本。當前左上角方塊呈黑色顯示,表示坐標位置以對象左上角為基準,如果中心方塊呈黑色顯示,表示坐標位置以對象中心為基準。
通過更改_x和_y屬性可以在影片播放時改變影片剪輯的位置。如可以為影片剪輯編寫如下的事件處理函數(shù):
onClipEvent (enterFrame) {
_x += 5;
_y += 5;
}
該事件處理函數(shù)使影片剪輯在每次enterFrame事件中向右和向下移動5像素的位置。
6.2 鼠標位置
你不但可以獲得影片中影片剪輯的坐標位置,還可以獲得鼠標位置,即鼠標光標在影片中的坐標位置。
表示鼠標光標的坐標屬性的關鍵字是_xmouse和_ymouse,其中,_xmouse代表光標的水平坐標位置,_ymouse代表光標的垂直坐標位置。
需要說明的是,如果這兩個關鍵字用在主時間軸中,則它們表示鼠標光標相對于主場景的坐標位置;如果這兩個關鍵字用在影片剪輯中,則它們表示鼠標光標相對于該影片剪輯的坐標位置。_xmouse和_ymouse屬性都是從對象的坐標原點開始計算的,即在主時間軸中代表光標與左上角之間的距離;在影片剪輯中代表光標與影片剪輯中心之間的距離。
多數(shù)情況下,你需要用到鼠標光標在主場景中的位置,所以可以使用_root._xmouse和_root._ymouse表示。
你可以使用下面的代碼讓影片剪輯保持與鼠標位置相同的坐標值:
onClipEvent (enterFrame) {
_x = _root._xmouse;
_y = _root._ymouse;
}
Flash不能獲得超出影片播放邊界的鼠標位置。這里的邊界并不是指影片中設置的場景大小。如將場景大小設置為550×400,在正常播放時能獲得的鼠標位置即在(0,0)~(550,400)之間;如果縮放播放窗口,將視當前播放窗口的大小而定;如果進行全屏播放,則與顯示器的像素尺寸有關。
6.3 旋轉方向
影片剪輯的另一個屬性是_rotation。
_rotation屬性代表影片剪輯的旋轉方向,它是一個角度值,介于-180°~180°之間,可以是整數(shù)和浮點數(shù)。
_rotation的值始終保持在-180°~180°之間,如果將它的值設置在這個范圍之外,系統(tǒng)會自動將其轉換為這個范圍之間的值。例如,將_rotation的值設置為181°,系統(tǒng)會將它轉換為-179°;將_rotation的值設置為-181°,系統(tǒng)會將它轉換為179°。
如使用下面的語句實現(xiàn)影片剪輯的連續(xù)轉動:
onClipEvent (enterFrame) {
_rotation += 10;
}
不用擔心_rotation會超出它的范圍,系統(tǒng)會自動將它的值轉換到-180°~180°之間,并不會影響到影片剪輯轉動的連貫性。
6.4 可見性
影片剪輯的另一個屬性是_visible,即可見性。_visible屬性使用布爾值,即要么為true(1),要么為false(0)。為true表示影片剪輯可見,即顯示影片剪輯;為false表示影片剪輯不可見,隱藏影片剪輯。
例如要隱藏影片剪輯myMC:
myMC._visible = false;
6.5 透明度
_alpha(透明度)是區(qū)別于_visible的另一個屬性,_alpha決定了影片剪輯的透明程度,它的范圍在0~100之間,0代表完全透明,100表示不透明。
例如要將影片剪輯myMC的透明度設為50%:
myMC._alpha = 50;
_alpha屬性代表了第4種顏色通道,即所謂的alpha通道。前3種顏色通道分別為red(紅)、green(綠)、blue(藍),也就是我們說的三原色通道,通常也簡稱R、G、B通道。前3種顏色通道決定像素的顏色成份,alpha通道決定像素的透明程度。在計算機中,每種顏色通道都用8 bit(位)來存儲,所以如果一幅圖像是32位的,它就有所有這4個通道;如果一幅圖像是24位的,則它就只有R、G、B這3個通道。
也可以在腳本中設置按鈕的_alpha屬性。特別指出,將按鈕的_alpha屬性設置為0,雖然按鈕不可見,但是它的熱區(qū)同樣存在,仍然可以對它進行單擊等操作;如果要將按鈕變?yōu)椴豢捎?#xff0c;可以將其_visible屬性設置為false。
6.6 縮放屬性
影片剪輯的縮放屬性包括橫向縮放_xscale和縱向縮放_yscale。
_xscale和_yscale的值代表了相對于庫中原影片剪輯的橫向尺寸width和縱向尺寸height的百分比,而與場景中影片剪輯實例的尺寸無關。如庫中影片剪輯元件的橫向寬度為150,在場景中將它的實例寬度調整為10,在腳本中將_xscale設置為50,則它在影片播放時顯示的橫向寬度將是150的50%,即75,而不是50像素或10的50%。
當_xscale和_yscale是0~100之間的數(shù)時,縮小原影片剪輯;當_xscale和_yscale是大于100的數(shù)時,放大原影片剪輯;當_xscale或_yscale為負時,將在縮放的基礎上水平或垂直翻轉原影片剪輯。
本例文件包含了一個矩形的影片剪輯和一幅圖片,并將矩形所在圖層作為遮罩層
在矩形影片剪輯的動作面板中添加如下ActionScript:
onClipEvent (load) {
xs = _width;
ys = _height;
}
onClipEvent (enterFrame) {
_xscale = 100*(_root._xmouse-_x)/(xs/2);
_yscale = 100*(_root._ymouse-_y)/(ys/2);
}
在load事件中,用變量xs和ys取得影片剪輯初始狀態(tài)下的寬度和高度值。在enterFrame事件中,計算鼠標位置與矩形影片剪輯中心的距離,算出它與矩形寬度和高度值的比值,然后作為_xscale和_yscale的值。該動畫實現(xiàn)移動鼠標位置以改變遮罩效果
6.7 尺寸屬性
上面例子中我們用到了影片剪輯的另兩個屬性:_width和_height。與_xscale和_yscale屬性不同,_width和_height代表影片剪輯的絕對寬度和高度,而不是相對比例。
同樣可以使用_width和_height調整影片剪輯的尺寸大小,如上例中的ActionScript也可寫成如下所示:
onClipEvent (enterFrame) {
_width = Math.abs(_root._xmouse-_x)*2;
_height = Math.abs(_root._ymouse-_y)*2;
}
Math.abs是一個內置函數(shù),用以計算一個數(shù)或表達式的絕對值。因為與縮放屬性不同,_width和_height的值不能為負,所以這時使用絕對值函數(shù)始終給出一個不為負的值。
此處用更簡潔的腳本實現(xiàn)了與上例相同的效果。
6.8 練習:使用影片剪輯的各種屬性
該動畫包含一支球桿影片剪輯stick,一個母球影片剪輯ball。在屏幕中移動鼠標,球桿會跟隨鼠標轉動,這是利用鼠標位置控制球桿的_rotation屬性。球桿的影片剪輯中添加了一個隱性按鈕(只有最后1幀作為熱區(qū),前面3幀都有為空,所以是不可見的),當單擊球桿時,控制球桿影片剪輯向后播放,作回拉動作,再出桿擊球。當球桿前端回到球的輪廓位置時,用球桿影片剪輯控制母球影片剪輯,將母球擊出,然后將其自身的_visible屬性設置為false,隱藏球桿。通過調整母球的_x和_y屬性,實現(xiàn)母球的滾動、反彈等動作。在母球滾動時,分析母球位置以判斷母球是否落袋,如果母球落袋,則使用trace語句給出提示“bad”,將母球重新置于初始位置。當母球停止?jié)L動時,將球桿的_visible屬性重新設置為true,并將球桿的位置設置為與母球相同,等待下一次擊球。
球桿stick影片剪輯元件:
(1)在stick影片剪輯元件第1幀的幀動作面板中添加如下語句:
stop();
(2)在第2、10、12幀中添加動作,使球桿作回拉——出桿運動。第12幀時的球桿前端應與中心保持相當于母球半徑長度即7.5像素的距離,在此幀時將母球擊出。
(3)在第12幀的動作面板中添加如下ActionScript:
_root.motherball.v = 20;
_root.motherball.dir = _root.stick._rotation;
上面的語句為motherball實例傳送兩個參數(shù)值v和dir,v代表了母球的運動速度,dir代表了母球的運動方向,它的方向與球桿的旋轉方向相同。
(4)在第13~20幀添加過渡,使球桿擊球后在場景中保留一段時間。
(5)在第20幀的動作面板中添加如下ActionScript:
_visible = false;
該語句將球桿自身隱藏。
(6)將第1幀中的球桿轉換成按鈕,選中該按鈕,在動作面板中添加如下ActionScript:
on (release) {
play();
}
單擊該鈕,球桿往后播放,作擊球動作。
球桿影片剪輯實例:
在主場景中將球桿和母球放在左邊,將它們的中心對齊。為球桿影片剪輯添加如下ActionScript:
onClipEvent (load) {
_x = _root.motherball._x;
_y = _root.motherball._y;
}
onClipEvent (mouseMove) {
xsm = _root._xmouse-_x;
ysm = _root._ymouse-_y;
if (xsm<0) {
_rotation = Math.atan(ysm/xsm)*(180/Math.PI);
} else {
_rotation = Math.atan(ysm/xsm)*(180/Math.PI)+180;
}
}
Math.atan是Flash的內置函數(shù),用它求一個數(shù)或表達式的反正切值。Math.PI是Flash的內置常數(shù),代表圓周率。使用Math.atan計算出的反正切值的單位是弧度,而_rotation屬性的單位是角度,所以要將其乘以(180/Math.PI)以實現(xiàn)弧度到角度的轉換。
在球桿影片剪輯的mouseMove事件中,根據(jù)鼠標位置調整_rotation屬性的值,使影片剪輯跟隨鼠標轉動,這也是鼠標跟隨動畫中的一種。
母球影片剪輯實例:
在母球影片剪輯實例的動作面板中添加如下ActionScript:
onClipEvent (load) {
v = 0; //初速度
dir = ""; //運動方向
vx = 0; //x方向分速度
vy = 0; //y方向分速度
slow = 0; //加速度
x0 = _x; //初始x位置
y0 = _y; //初始y位置
}
onClipEvent (enterFrame) {
//母球運動中
if ((dir != "") && (slow<100)) {
//母球落袋
if (((_x<60) && (_y<85)) || ((_x>440) && (_y<85)) || ((_x<60) && (_y>265)) || ((_x>440) && (_y>265))) {
_visible = false;
trace("Bad!");
dir = "";
v = 0;
vx = 0;
vy = 0;
slow = 0;
_x = x0;
_y = y0;
_visible = true;
//在母球位置顯示球桿
_root.stick._visible = true;
_root.stick.gotoAndStop(1);
_root.stick._x = x0;
_root.stick._y = y0;
}
//撞擊球桌左邊界
if (_x<60) {
_x = 60;
dir = -(180+dir);
}
//撞擊球桌右邊界
if (_x>440) {
_x = 440;
dir = 180-dir;
}
//撞擊球桌上邊界
if (_y<85) {
_y = 85;
dir = -dir;
}
//撞擊球桌下邊界
if (_y>265) {
_y = 265;
dir = -dir;
}
//調整母球位置和速度
v0 = v*(100-slow)/100;
vx = v0*Math.cos((dir)/(180/Math.PI));
vy = v0*Math.sin((dir)/(180/Math.PI));
_x += vx;
_y += vy;
slow++;
}
//母球減速完畢
if (slow == 100) {
//在母球位置顯示球桿
_root.stick._x = _root.motherball._x;
_root.stick._y = _root.motherball._y;
_root.stick._visible = true;
//重置變量
dir = "";
v = 0;
vx = 0;
vy = 0;
slow = 0;
}
}

?

?

第7章 影片剪輯方法

控制影片剪輯的方法很多,在ActionScript中最常用和最有用的命令是duplicateMovieClip和attachMovie,它們用于復制和附加影片剪輯,這兩個命令可以實現(xiàn)許多效果,如下雪、棋類、射擊游戲等。
使用hitTest方法可以代替按鈕實現(xiàn)人機交互,從這里也可以看出影片剪輯有多么強大的功能。
startDrag和stopDrag用于對影片剪輯進行拖動,它們可以靈活地實現(xiàn)許多有趣的效果。

7.1 復制和附加影片剪輯
使用ActionScript的一大理由便是它可以極大地提高工作效率,達到事半功倍的效果。本章要介紹的兩個命令duplicateMovieClip和attachMovie便是其中的典范。
7.1.1 Array對象
Array對象(動作面板的“對象”/“核心”目錄)即數(shù)組,它用來記錄成組的相關或相似變量。數(shù)組中的單個變量稱為元素,數(shù)組中的每個元素對應一個索引,訪問元素需要使用索引,索引需要用方括號括起來。
如下所示的ActionScript創(chuàng)建一個空的數(shù)組:
myArray = new Array();
如下所示的ActionScript創(chuàng)建一個確定值的數(shù)組并在輸出窗口中顯示每個元素的值:
weekDay = new Array("SUN", "MON", "TUE", "WED", "TUR", "FRI", "SAT");
for (var i = 0; i<7; i++) {
trace(weekDay[i]);
}
數(shù)組中還可以嵌套數(shù)組,即構成多維數(shù)組,如下所示:
polyArray = new Array();
for (var i = 0; i<3; i++) {
polyArray[i] = new Array(i*3+1, i*3+2, i*3+3, i*3+4);
trace(polyArray[i][0]+" "+polyArray[i][1]+" "+polyArray[i][2]+" "+polyArray[i][3]);
}
輸出窗口中將顯示:
1 2 3 4
4 5 6 7
7 8 9 10
7.1.2 復制影片剪輯
duplicateMovieClip動作(動作面板的“動作”/“影片剪輯控制”目錄)和MovieClip對象(動作面板的“對象”/“影片”目錄)中的duplicateMovieClip方法都用于在影片播放時創(chuàng)建影片剪輯的實例,也即復制場景中的父影片剪輯以產(chǎn)生新的影片剪輯。它們和后面要介紹的attachMovie方法對于要在影片中重復產(chǎn)生較多相同圖形或動畫對象時非常有用,如棋類游戲、射擊游戲、鼠標跟隨、下雪等特效動畫。
要使用duplicateMovieClip動作和MovieClip.duplicateMovieClip方法,首先需要在場景中創(chuàng)建用來復制的父影片剪輯,并且在屬性面板中為該父影片剪輯實例命名,該影片剪輯實例名稱將作為duplicateMovieClip的參數(shù)之一。
在幀動作中使用duplicateMovieClip動作的方法如下所示:
duplicateMovieClip("parentMC", "childMC", 10);
其中,第1個參數(shù)parentMC是父影片剪輯的唯一標識符,第2個參數(shù)childMC是復制產(chǎn)生的新影片剪輯實例的唯一名稱,第3個參數(shù)10是新影片剪輯的深度級別(level)。深度級別的概念與層類似,較高深度級別中的圖形會遮擋住較低深度級別中的圖形,影片剪輯所在的深度級別越高就越貼近我們的視線。在同一個深度級別中只能有一個影片剪輯實例,如果在同一深度級別中添加多于一個影片剪輯實例,新的影片剪輯實例將替換掉舊的影片剪輯實例。
復制產(chǎn)生的影片剪輯實例與父影片剪輯實例的位置是重疊在一起的,所以一般還需要調整新影片剪輯實例的坐標等屬性,以使其按照需要顯示,如下所示:
_root.parentMC._visible = false;
duplicateMovieClip("parentMC", "childMC", 10);
_root.childMC._x = 275;
_root.childMC._y = 200;
運行以上腳本,屏幕中只能看到新影片剪輯實例,而父影片剪輯實例不見了。從這里也可以看出,父影片剪輯實例的屬性并不會影響到復制產(chǎn)生的新實例。
通常情況下,可以用與下面類似的方法復制多個影片剪輯實例:
_root.parentMC._visible = false;
n = 50;
for (i=0; i<n; i++) {
duplicateMovieClip("parentMC", "childMC"+i, 10+i);
_root["childMC"+i]._x = 25+10*i;
_root["childMC"+i]._y = 8*i;
}
在父影片剪輯中使用MovieClip.duplicateMovieClip方法如下所示:
onClipEvent (enterFrame) {
this.duplicateMovieClip("childMC", 10);
_root.childMC._x += 150;
}
它比duplicateMovieClip動作少了第1個參數(shù),即不需要父剪輯名稱。如果以上腳本不是在父剪輯而是在別的影片剪輯中,只需要將this換成父剪輯的實例名稱即可。
7.1.3 附加影片剪輯
attachMovie方法也是在影片播放時創(chuàng)建影片剪輯的實例,它與duplicateMovieClip不同的是,attachMovie方法不需要使用父影片剪輯,而是將庫中影片剪輯的實例附加到場景中。
要使用attachMovie方法,首先需要在庫面板中為要附加到場景中的影片剪輯添加鏈接。為影片剪輯添加鏈接的方法如下:
(1)在庫面板中要添加鏈接的影片剪輯上單擊鼠標右鍵,在彈出的快捷菜單中選擇“鏈接”命令。
(2)系統(tǒng)彈出“鏈接屬性”對話框,
(3)在“鏈接:”后選中“為動作腳本導出”復選框,“為運行時共享導入”復選框自動變?yōu)檫x中狀態(tài),“標識符”文本框變?yōu)榭捎?#xff0c;并將影片剪輯的元件名稱作為默認的鏈接標識符
(4)單擊“確定”按鈕,添加鏈接后的庫面板
為影片剪輯添加鏈接后,就可以在動作腳本中調用它,如下所示:
attachMovie("blackchess", "chess1", 100);
第1個參數(shù)即在庫面板中添加的鏈接名稱,第2個參數(shù)和第3個參數(shù)的意義和使用方法與duplicateMovieClip中相同位置的參數(shù)類似。
在使用attachMovie方法將影片剪輯實例附加到場景中后,該實例將默認出現(xiàn)在場景左上角,即坐標原點的位置,所以仍然需要調整它的位置等屬性。
7.1.4 刪除影片剪輯
通過以上方法創(chuàng)建的影片剪輯實例都可以使用removeMovieClip動作(動作面板的“動作”/“影片剪輯控制”目錄)或MovieClip對象的removeMovieClip方法刪除,如下所示:
n = 50;
for (i=0; i<n; i++) {
removeMovieClip(_root["childMC"+i]);
}
7.2 練習:動態(tài)添加影片剪輯
本例是一個運用了duplicateMovieClip和attachMovie命令的鼠標跟隨特效動畫,
本例使用attachMovie命令將魚附加到場景中的,使用duplicateMovieClip命令復制荷花影片剪輯以調整它的深度級別,使其保持在魚的上面。
該文件只有兩層,圖層1用來處理魚,圖層2用來處理荷花。場景中只添加了荷花影片剪輯,它的實例名稱與元件名稱同為picMC。在庫面板中為魚的身體元件設置了鏈接,鏈接標識符與元件名稱相同。
(1)在圖層1的第1幀添加如下ActionScript:
unit = 20; //魚的分段數(shù):20
v0 = 12; //魚的游動速度
v1 = 2/3; //魚身緊驟程度
v2 = 3; //魚身大小遞減速度
var x = new Array(); //創(chuàng)建橫坐標數(shù)組
var y = new Array(); //創(chuàng)建縱坐標數(shù)組
for (i=1; i<=unit; i++) {
if (i == 1) {
attachMovie("head", "fish"+i, unit+1-i); //在第1節(jié)附加魚頭
} else if ((i == 4) or (i == 13)) {
attachMovie("fin", "fish"+i, unit+1-i); //在第4和13節(jié)附加魚鰭
} else {
attachMovie("body", "fish"+i, unit+1-i); //在其他節(jié)附加魚身
}
_root["fish"+i]._xscale = 50-v2*(i-1); //寬度遞減
_root["fish"+i]._yscale = 60-v2*(i-1); //高度遞減
_root["fish"+i]._alpha = 100-(100/unit)*i; //透明度遞減
}
(2)在圖層1的第2幀添加如下ActionScript:
x[0] += (_xmouse-x[0])/v0;
y[0] += (_ymouse-y[0])/v0;
for (i=1; i<=unit; i++) {
x[i] = x[i]+(x[i-1]-x[i])*v1;
y[i] = y[i]+(y[i-1]-y[i])*v1;
} //為數(shù)組元素賦值
for (i=1; i<=unit; i++) {
_root["fish"+i]._x = (x[i-1]+x[i])/2;
_root["fish"+i]._y = (y[i-1]+y[i])/2;
_root["fish"+i]._rotation = 90+180/Math.PI*Math.atan2((y[i]-y[i-1]), (x[i]-x[i-1]));
} //確定魚身各節(jié)坐標位置和旋轉方向
(3)在圖層1的第3幀添加如下ActionScript:
gotoAndPlay(2);
該行語句令影片回到第2幀重新確定魚身各節(jié)的位置。
(4)將荷花影片剪輯picMC拖放到圖層2,并在屬性面板中將其實例命名為picMC。選中該影片剪輯實例,在其動作面板中添加如下ActionScript:
duplicateMovieClip("picMC", "pic", 30);
該行語句復制荷花,并將其深度級別設為30。因為在魚身各節(jié)中,魚頭的深度級別最高,為20,這里只要是一個大于20的數(shù)即可將荷花置于魚的上面。
(5)按Ctrl+Enter測試影片,最終效果如圖7-4所示。

7.3 單擊影片剪輯
你也許會認為只有按鈕才能被鼠標單擊,其實并非如此,采用一些技巧,影片剪輯也能接受鼠標的單擊動作,并且可以有幾種方法實現(xiàn)這種功能。
7.3.1 將按鈕置于影片剪輯中
影片剪輯本身并不能響應鼠標單擊動作,所以不能像按鈕一樣使用on(release)或是on(press)等事件處理函數(shù)。要使影片剪輯響應鼠標單擊動作,可以在影片剪輯中放入按鈕。如前一章中的臺球實例,在球桿影片剪輯中即加入了一個覆蓋整個球桿的隱形按鈕,當單擊球桿(實際上是單擊按鈕)時,即令影片剪輯開始播放,執(zhí)行擊球的動作。
7.3.2 hitTest方法
在影片剪輯中加入按鈕并不是讓影片剪輯響應鼠標動作的唯一方法。事實上,你可以使用onClipEvent (mouseDown)或是onClipEvent (mouseUp)或是onClipEvent (mouseMove)等事件處理函數(shù)響應鼠標的動作,如在上一章的scale實例中,我們使用了onClipEvent (mouseMove)事件處理函數(shù)。
雖然影片剪輯中有這們的事件處理函數(shù),但它與按鈕的事件處理函數(shù)是有明顯區(qū)別的。如影片剪輯的onClipEvent (mouseUp)事件,無論鼠標在什么位置單擊,只要是包含該函數(shù)的影片剪輯都要執(zhí)行相應的動作;而按鈕的on (release)事件只有當鼠標在按鈕上單擊才會發(fā)生。例如本例文件,其中,為每個影片剪輯添加了如下的ActionScript:
onClipEvent (mouseUp) {
gotoAndStop(2);
}
當在窗口中的任意位置單擊鼠標時,所有影片剪輯實例都轉到第2幀。
這是因為所有影片剪輯都響應了mouseUp事件,而不區(qū)別鼠標單擊的具體位置。
7.3.3 判斷哪個影片剪輯被單擊
正因為如此,要讓影片剪輯像按鈕一樣準確地響應鼠標動作,就需要判斷哪個影片剪輯被單擊。
hitTest函數(shù)專門用來檢測兩個影片剪輯之間或影片剪輯和某一點之間是否相交。如將上例影片剪輯中的ActionScript改成如下所示:
onClipEvent (mouseUp) {
if (this.hitTest(_root._xmouse, _root._ymouse)) {
gotoAndStop(2);
}
}
以上語句在mouseUp事件發(fā)生時,判斷鼠標位置所在點與當前影片剪輯之間是否相交,相交時執(zhí)行命令gotoAndStop(2)。此時在窗口中單擊鼠標,只有鼠標位置處的影片剪輯會轉到第2幀
從例子中可以看出,Flash將影片剪輯所在的最小矩形范圍作為影片剪輯的范圍,所以在圓形的外切正方形區(qū)域單擊鼠標同樣會使hitTest函數(shù)為true。為了使hitTest函數(shù)只在圓形范圍內為true,可以在hitTest函數(shù)中加入一個參數(shù)true,如下所示:
onClipEvent (mouseUp) {
if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
gotoAndStop(2);
}
}
現(xiàn)在測試影片,只有在圓形內部單擊鼠標,影片剪輯才會響應鼠標動作。
現(xiàn)在已經(jīng)有兩種方法可以使影片剪輯響應鼠標動作,一是在影片剪輯中加入按鈕,另一種就是使用hitTest函數(shù),兩種方法各有所長,具體使用哪一種要視情況而定。使用hitTest函數(shù)會使影片剪輯和庫都更精簡,而按鈕的up、down和over這3種狀態(tài)對創(chuàng)建交互式的動畫也是非常方便和有效的。
7.4 拖動影片剪輯
可以使用startDrag拖動一個影片剪輯,使用stopDrag停止對影片剪輯的拖動動作。
如本例文件,左下角有一只扇動翅膀的蝴蝶。
在蝴蝶上按下鼠標并拖動,蝴蝶會跟隨鼠標飛舞;釋放鼠標,蝴蝶在當前位置停下。如圖7-8所示。按下鼠標拖動蝴蝶用到的ActionScript就是startDrag,釋放鼠標停止拖動用到的ActionScript就是stopDrag。
多試幾次,你會發(fā)現(xiàn),將蝴蝶拖放到畫面中的兩朵花上,蝴蝶將不再扇動翅膀,而是靜靜地品嘗花香。這是因為在花朵中央放置了一個透明的影片剪輯,使用hitTest函數(shù)判斷該影片剪輯與蝴蝶影片剪輯是否相交,如果相交,則讓蝴蝶停止在第1幀。
打開文件drag.fla,庫中共有兩個影片剪輯:蝴蝶和flower。放置兩個flower的實例到兩朵花的中心,在屬性面板中將它們的分別命名為flower1和flower2,并將透明度設置為0%,讓它們不可見。
選中蝴蝶影片剪輯實例,打開其動作面板,在其中添加如下ActionScript:
onClipEvent (mouseDown) {
if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
this.startDrag(true);
play();
}
}
onClipEvent (mouseUp) {
if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
this.stopDrag();
}
if (this.hitTest(_root.flower1) or this.hitTest(_root.flower2)) {
gotoAndStop(1);
}
}
在mouseDown事件中,判斷是否與鼠標光標相交,如果是,開始拖動。
在mouseUp事件中,判斷是否與鼠標光標相交,如果是,停止拖動;并且判斷是否與flower1或flower2相交,如果是,停止在第1幀。
該例用到了hitTest函數(shù)的兩個功能,即判斷影片剪輯和鼠標所在點是否相交以及判斷兩個影片剪輯是否相交。該例還用到了一對很常用的命令:startDrag和stopDrag,使用它們可以方便地實現(xiàn)鼠標拖動操作。
仔細觀察將會發(fā)現(xiàn),蝴蝶停在花朵上的位置并不是很居中,這是因為只要兩個影片剪輯的邊緣相交,hitTest的值就會為true,為了使位置更精確一點,一種方法就是將flower影片剪輯做得更小一點,另一種方法就是修改上面的ActionScript,將判斷兩影片剪輯相交的一段代碼改成如下所示:
if (_root.flower1.hitTest(this._x, this._y, true) or _root.flower2.hitTest(this._x, this._y, true)) {
gotoAndStop(1);
}
實際上,這種方法是將判斷兩個影片剪輯相交改成判斷flower影片剪輯和蝴蝶影片剪輯的中心點相交,范圍當然精確得多。

?

第8章 響應鍵盤

有4種方法可以檢測鍵盤上的按鍵動作。第1種方法是使用按鈕,第2種方法是使用Key對象,第3種方法是使用鍵盤偵聽,第4種方法是使用影片剪輯的keyUp和keyDown事件處理函數(shù)。

8.1 通過按鈕檢測按鍵動作
在按鈕的on事件處理函數(shù)中不但可以對鼠標事件作出響應,而且可以對鍵盤事件作出響應。如在按鈕的動作面板中加入如下所示的代碼,在敲擊鍵盤上的A鍵時輸出窗口中將提示:A is pressed。
on (keyPress "a") {
trace("A is pressed");
}
檢測鍵盤上的字母鍵時,字母都應為小寫。如果要檢測鍵盤中的特殊鍵,如方向鍵,Flash中有一些專門的代碼來表示它們,如表8-1所示。
表8-1 鍵盤中的特殊鍵
<Left> <Right> <Up> <Down> <Space>
<Home> <End> <Insert> <PageUp> <PageDown>
<Enter> <Delete> <Backspace> <Tab> <Escape>
如要檢測鍵盤上的<End>鍵,可以使用下面的ActionScript:
on (keyPress "<End>") {
trace("End is pressed");
}
您可以在一個按鈕中加入若干個on函數(shù),也可以在一個on函數(shù)中結合多種事件,這使您可以為按鈕定義快捷鍵,如下所示:
on (release, keyPress "<Left>") {
_root.myMC.prevFrame();
}
上面的語句實現(xiàn)單擊按鈕或按鍵盤上的左方向鍵,控制影片剪輯myMC回退1幀。
8.2 影片剪輯的keyUp和keyDown事件
影片剪輯包含兩個與鍵盤相關的事件keyUp和keyDown,使用它們也可以實現(xiàn)對按鍵事件的響應,如下所示:
onClipEvent (keyDown) {
trace(Key.getAscii());
}
函數(shù)Key.getAscii返回與按鍵相對應的ASCII碼。ASCII碼是一個整數(shù),鍵盤上的每個字符對應一個ASCII碼,如字母A對應的ASCII碼為65,B對應的ASCII碼為66,a對應的ASCII碼為97, b對應的ASCII碼為98,+對應的ASCII碼為43等。只有字符才有ASCII碼,鍵盤上的功能鍵沒有ASCII碼。
如果需要在輸出窗口中輸出與按鍵相對應的字符,可以使用String對象的fromCharCode函數(shù)將ASCII碼轉換成字符,如將上例的trace命令改成如下所示:
trace(String.fromCharCode(Key.getAscii()));
String對象見動作面板的“對象”/“核心”目錄下面。
8.3 Key對象
利用按鈕檢測按鍵動作很有效,但是并不利于檢測持續(xù)按下的鍵,所以不適合于制作某些通過鍵盤控制的游戲。
這時,您就需要用到Key對象。Key對象包含在動作面板的“對象”/“影片”目錄下面,它由Flash內置的一系列方法、常量和函數(shù)構成。使用Key對象可以檢測某個鍵是否被按下,如要檢測左方向鍵是否被按下,可以使用如下ActionScript:
if (Key.isDown(Key.LEFT)) {
trace("The left arrow is down");
}
函數(shù)Key.isDown返回一個布爾值,當該數(shù)中的參數(shù)對應的鍵被按下時返回true,否則返回false。常量Key.LEFT代表鍵盤上的左方向鍵。當左方向鍵被按下時,該函數(shù)返回true。
Key對象中的常量代表了鍵盤上相應的鍵,如表8-2所示。
表8-2 Key對象中的常量
Key.BACKSPACE Key.ENTER Key.PGDN
Key.CAPSLOCK Key.ESCAPE Key.RIGHT
Key.CONTROL Key.HOME Key.SHIFT
Key.DELETEKEY Key.INSERT Key.SPACE
Key.DOWN Key.LEFT Key.TAB
Key.END Key.PGUP Key.UP
以上是鍵盤上的功能鍵,那么如何表示鍵盤上的字母鍵呢?Key對象提供了一個函數(shù)Key.getCode來實現(xiàn)這一功能,如下所示:
if (Key.isDown(Key.getCode("a"))) {
trace("A is pressed");
}
8.4 鍵盤偵聽
假設在影片剪輯的onClipEvent(enterFrame)事件處理函數(shù)中檢測按鍵動作,而影片剪輯所在的時間軸較長,或計算機運算速度較慢,有可能出現(xiàn)這種情況,即當在鍵盤上按下某個鍵時還未來得及處理onClipEvent(enterFrame)函數(shù),那么按鍵動作將被忽略。
還有一個問題就是,在某些游戲(如射擊)中,我們需要按一次鍵就執(zhí)行一次動作(發(fā)射一發(fā)子彈),即使長時間按住某個鍵不放也只能算作一次按鍵,而Key對象并不能區(qū)別是長時間按住同一個鍵還是快速地多次按鍵。
在解決這個問題,就需要用到Flash MX中的第3種方法:鍵盤偵聽。when it comes to listening for key presses您可以使用 “偵聽器(listener)”來偵聽鍵盤上的按鍵動作。
要使用偵聽器首先需要創(chuàng)建它,您可以使用如下所示的命令來告訴計算機您需要偵聽某個事件:
Key.addListener(_root);
Key.addListener命令將主時間軸或某個影片剪輯作為它的參數(shù),當偵聽的事件發(fā)生時可以用這個參數(shù)指定的對象來響應該事件。
上面的代碼指定主時間軸來響應該事件。要讓主時間軸對該事件作出響應,還需要設置一個相應的事件處理函數(shù)。
鍵盤偵聽的事件處理函數(shù)有兩個:onKeyUp和onKeyDown,如下所示:
_root.onKeyUp = function() {
trace(Key.getAscii());
};
您也可以使用影片剪輯作為偵聽鍵盤的對象,只需要使用影片剪輯的路徑代替_root作為Key.addListener命令的參數(shù)。
8.5 練習:鍵盤控制影片剪輯
文件如圖8-1所示,可以通過鍵盤上的方向鍵控制影片剪輯運動。當敲擊空格鍵時,瓢蟲回到初始位置。
文件ladybug.fla,其中包含了一個影片剪輯ladybug。在主場景中選中瓢蟲影片剪輯,打開其動作面板,其中添加了如下ActionScript:
onClipEvent (load) {
x0 = this._x;
y0 = this._y;
}
onClipEvent (enterFrame) {
if (Key.isDown(Key.SPACE)) {
this._x = x0;
this._y = y0;
this._rotation = 0;
}
if ((Key.isDown(Key.LEFT)) && (Key.isDown(Key.UP))) {
this._x -= 10/Math.SQRT2;
this._y -= 10/Math.SQRT2;
this._rotation = -45;
} else if ((Key.isDown(Key.LEFT)) && (Key.isDown(Key.DOWN))) {
this._x -= 10/Math.SQRT2;
this._y += 10/Math.SQRT2;
this._rotation = -135;
} else if ((Key.isDown(Key.RIGHT)) && (Key.isDown(Key.UP))) {
this._x += 10/Math.SQRT2;
this._y -= 10/Math.SQRT2;
this._rotation = 45;
} else if ((Key.isDown(Key.RIGHT)) && (Key.isDown(Key.DOWN))) {
this._x += 10/Math.SQRT2;
this._y += 10/Math.SQRT2;
this._rotation = 135;
} else if (Key.isDown(Key.LEFT)) {
this._x -= 10;
this._rotation = -90;
} else if (Key.isDown(Key.RIGHT)) {
this._x += 10;
this._rotation = 90;
} else if (Key.isDown(Key.UP)) {
this._y -= 10;
this._rotation = 0;
} else if (Key.isDown(Key.DOWN)) {
this._y += 10;
this._rotation = 180;
}
if (this._x>550) {
this._x = 0;
}
if (this._x<0) {
this._x = 550;
}
if (this._y>400) {
this._y = 0;
}
if (this._y<0) {
this._y = 400;
}
}
當敲擊空格鍵(Key.isDown(Key.SPACE))時,影片剪輯回到初始位置;當敲擊不同的方向鍵或方向鍵組合時,相應調整影片剪輯的_x、_y和_rotation屬性,從而實現(xiàn)以鍵盤控制影片剪輯。

第9章 輸入文本和字符串

Flash中的文本形式有3種,即靜態(tài)文本、動態(tài)文本和輸入文本。輸入文本可以接受用戶輸入,這也是響應鍵盤事件的一種。輸入文本是一種人機交互工具,輸入文本作為變量可以被ActionScript識別。
有許多方法可以操縱String(字符串)對象,如使用運算符“+”連接字符串,使用substring和substr函數(shù)從目標字符串中截取子字符串,使用indexOf函數(shù)確定匹配字符串在目標字符串中的位置等。


9.1 輸入文本
Flash中的文本形式有3種,即靜態(tài)文本、動態(tài)文本和輸入文本。輸入文本可以接受用戶輸入,這也是響應鍵盤事件的一種。
3種形式的文本都是由文本工具 創(chuàng)建的,要創(chuàng)建輸入文本,首先要使用文本工具繪制一個文本框,然后在屬性面板中將該文本框的類型設置成輸入文本
在輸入文本的屬性面板中,除可以設置一般的文本格式外,還可以單擊 按鈕將文本顯示為HTML格式,單擊 按鈕為文本添加邊框,在 后面的下拉列表框中設置文本的換行格式或將文本設置成密碼顯示。
輸入文本最重要的是變量名,如圖9-2所示中的“變量”文本框,其中的myInputText即是該輸入文本的變量名。輸入文本變量和其他變量類似,變量的值會呈現(xiàn)在輸入文本框中,輸入文本框中的值同時也作為輸入文本變量的值,它們之間是等價的。
如在場景中繪制了一個變量名為myInputText的輸入文本框,然后在主時間軸的幀動作面板中添加如下ActionScript:
Key.addListener(_root);
_root.onKeyDown = function() {
trace(_root.myInputText);
};
以上腳本創(chuàng)建一個鍵盤偵聽器,當按下鍵時即將輸入文本myInputText中的內容顯示在輸出窗口中。測試一下您可以看到,輸出窗口不會漏掉輸入的每個字符,并且每輸入一個字符即輸出一行。
9.2 字符串
字符串是一種特殊類型的數(shù)據(jù),對字符串可以進行多種操作。
9.2.1 連接字符串
要連接兩個字符串,可以使用“+”運算符。如下所示:
var myString = "Hello";
myString += " World.";
trace(myString);
輸出窗口中將輸出如下所示的字符串:
Hello World.
您可以在一行ActionScript中使用多個“+”運算符,如下所示:
myStr1 = "How";
myStr2 = "are";
myStr3 = "you";
myStr = myStr1+" "+myStr2+" "+myStr3+"?";
trace(myStr);
輸出窗口中將輸出如下所示的字符串:
How are you?
9.2.2 截取字符串
從字符串中可以截取它的子字符串。例如,下面的腳本從字符串中截取第5到第14個字符組成的子字符串:
myString = "ActionScript is so useful!";
childStr = myString.substring(4, 14);
trace(childStr);
截取字符串函數(shù)substring有兩個參數(shù),第一個參數(shù)表示要截取的字符串的開始位置,第2個參數(shù)表示要截取的字符串的結束位置。
輸出窗口中輸出如下所示的子字符串:
onScript i
我們要截取的子字符串是從第5個開始,為什么substring的參數(shù)中要從4開始呢?這是因為在ActionScript中,通常是從0開始計數(shù)的,即上面的字符串中第0位上是A,第1位上是c,以此類推。那么既然從0開始計數(shù),第14個字符就應該是第13位,為什么第2個參數(shù)不是13而是14呢?這是因為substring的第2個參數(shù)是指要截取到的位置,即要截取的最后一個字符是它前面的一個字符,所以它應該比要截取的最后一個字符多一位。
還有一種方法可以截取字符串,這就是substr。substr與substring命令的區(qū)別在于substr的第2個參數(shù)代表要截取的子字符串的長度。如下所示的ActionScript實現(xiàn)與前例相同的效果:
myString = "ActionScript is so useful!";
childStr = myString.substr(4, 10);
trace(childStr);
在輸出窗口中輸出子字符串:
onScript I
還有一個特殊的截取字符串的命令charAt。charAt可以從字符串的指定位置截取一個字符,如要從前面的字符串中截取第6位上的字符S,可以使用如下所示的ActionScript:
myString = "ActionScript is so useful!";
childStr = myString.charAt(6);
trace(childStr);
輸出窗口中將輸出字符S。
9.2.3 字符串函數(shù)
String對象有很多內置函數(shù),使您可以對字符串進行各種操作。
indexOf方法用于從目標字符串中查找另一字符串的索引,即與另一字符串相匹配的子字符串的起始位置。如下所示:
myString = "Macromedia Flash MX";
myStr = myString.indexOf("Flash", 0);
trace(myStr);
以上腳本從目標字符串“Macromedia Flash MX”中查找字符串“Flash”的位置,運行該腳本,輸出窗口中輸出11。
如果目標字符串中沒有找到相匹配的字符串,將返回-1。
indexOf的第2個參數(shù)表示從目標字符串中開始查找的起始位置,前例中的0表示從目標字符串的第1個字符開始查找。該參數(shù)可以省略,將默認從第1個字符開始查找。
與indexOf函數(shù)相對的是lastindexOf,用它查找在參數(shù)所指定的開始位置之前的最后一個子字符串的索引,即逆序查找。如下所示:
myString = "Macromedia Flash MX";
myStr = myString.lastindexOf("a", 12);
trace(myStr);
運行該腳本,輸出窗口中輸出9。
如果將參數(shù)12改成13或更大的數(shù),或將該參數(shù)省略,將返回結果13。
String對象的toLowerCase函數(shù)實現(xiàn)將大寫字母轉換為小寫形式,toUpperCase函數(shù)實現(xiàn)將小寫字母轉換為大寫形式。如下所示:
myString = "Macromedia Flash MX";
myStr1 = myString.toLowerCase();
myStr2 = myString.toUpperCase();
trace("Original String : "+myString);
trace("LowerCase String : "+myStr1);
trace("UpperCase String : "+myStr2);
運行該腳本,輸出窗口中顯示:
Original String : Macromedia Flash MX
LowerCase String : macromedia flash mx
UpperCase String : MACROMEDIA FLASH MX
String對象只有一個屬性,即length,它表示字符串的長度,即字符串中包含字符串的個數(shù),如下所示:
myString = "Macromedia Flash MX";
trace(myString.length);
運行該腳本,輸出窗口中顯示19,即該字符串中共19個字符。
在使用String對象的函數(shù)和屬性時要注意,字母的大寫形式和小寫形式是有區(qū)別的,并且每個空格也作為一個字符。
9.3 練習:表單
表單(form)在網(wǎng)頁中使用得非常頻繁,用戶可以通過表單與服務器進行交互,從而實現(xiàn)注冊或登錄等操作。
借助于輸入文本、按鈕以及ActionScript等,也可以用Flash來制作網(wǎng)頁中的表單。
第1個輸入文本框采用單行格式,第2個輸入文本框采用密碼格式,第3個輸入文本框采用多行格式,并設置了30像素的縮進。3個輸入文本變量名分別為name、paword和words,使用ActionScript分別控制3個文本框中的最大字符數(shù)。當單擊按鈕Clear時,清除3個文本框中的內容,當單擊按鈕Submit時,提交所填的內容。因為這里還沒學到Flash與服務器的交互,所以將用戶所填內容通過輸出窗口顯示出來。
打開文件form.fla,分別查看一下3個輸入文本框的屬性面板中的設置。
在主場景中新建一層Actions,打開其動作面板,其中添加了如下ActionScript:
Key.addListener(_root);
_root.onKeyUp = function() {
if (_root.name.length>8) {
_root.name = _root.name.substr(0, 8);
}
if (_root.paword.length>16) {
_root.paword = _root.paword.substr(0, 16);
}
if (_root.words.length>150) {
_root.words = _root.words.substr(0, 150);
}
};
以上腳本控制3個文本框中的最大字符數(shù),當在文本框中輸入的字符數(shù)超過了限制,則使用substr函數(shù)從輸入的字符串中截取指定長度的字符串。
選中按鈕Clear,打開其動作面板,其中添加了如下ActionScript:
on (release) {
_root.name = "";
_root.paword = "";
_root.words = "";
}
選中按鈕Submit,打開其動作面板,其中添加了如下ActionScript:
on (release) {
trace("Welcome "+_root.name+" !");
trace("Your password is "+_root.paword+" .");

第10章 動態(tài)文本

在制作游戲的時候,有時需要一個文本框來記錄用戶的游戲得分,這個分數(shù)是根據(jù)游戲情況動態(tài)改變的。這時候,我們就需要用到動態(tài)文本。
動態(tài)文本與輸入文本的區(qū)別在于它不能直接接受用戶輸入。
但是,動態(tài)文本可以用來顯示不同樣式和字體的文本。

10.1 動態(tài)文本
和輸入文本一樣,使用文本工具可以創(chuàng)建動態(tài)文本框,只需在屬性面板中選擇“動態(tài)文本”即可
要讓動態(tài)文本框動態(tài)地顯示文本,就需要在屬性面板中為其設置變量名。將動態(tài)文本的變量名設為myDynamicText。在Flash影片播放時,只需改變動態(tài)文本變量的值,就可以改變動態(tài)文本框中顯示的文本。
動態(tài)文本有3種基本格式:單行、多行和多行不換行,它沒有輸入文本的密碼格式。
屬性面板中間有3個按鈕,其中:
= :可選,它決定了是否可以對動態(tài)文本框中的文本執(zhí)行選擇、復制、剪切等操作,按下表示可選。如果是輸入文本,它是默認按下并且不可改變的,因為輸入文本一定是可選的。
= :將文本呈現(xiàn)為HTML,它決定了動態(tài)文本框中的文本是否可以使用HTML格式,即使用HTML語言為文本設置格式。
= :在文本周圍顯示邊框,它決定了是否在動態(tài)文本框周圍顯示邊框。
怎樣才能讓動態(tài)文本框顯示需要的文本呢?如下所示的腳本即在變量名為myDynamicText的動態(tài)文本框中顯示“Welcome to ActionScript!”:
myDynamicText = "Welcome to ActionScript!";
上面的腳本是加在動態(tài)文本所在的時間軸上的。
動態(tài)文本的使用雖然很簡單,但是用它可以做許多事情。
10.2 HTML格式
HTML即超文本置標語言,它是網(wǎng)頁格式的一種顯示規(guī)范。在瀏覽網(wǎng)頁時,瀏覽器通過解讀HTML標記將網(wǎng)頁中的各種元素顯示成需要的樣式。在Flash中可以使用HTML來設置動態(tài)文本的格式。要使用HTML,首先需要按下屬性面板中的 按鈕。在Flash中使用HTML標記為動態(tài)文本設置格式的ActionScript如下所示:
myDynamicText = "<B>B:粗體</B>.
";
myDynamicText += "<I>I:斜體</I>.
";
myDynamicText += "<U>U:下劃線</U>.
";
myDynamicText += "<FONT COLOR='#F000F0'>FONT COLOR:顏色</FONT>.
";
myDynamicText += "<FONT FACE='Arial Black'>FONT FACE:字體</FONT>.
";
myDynamicText += "<FONT SIZE='28'>FONT SIZE:字號</FONT>.
";
myDynamicText += "<A HREF=' http://www.sina.com.cn& #39;>A HREF:超鏈接</A>.
";

Flash中使用的并不是完整的HTML,而只是HTML中的一些標記,使用這些標記可以輕松地為動態(tài)文本設置各種格式。
Flash MX中可用的所有HTML標記如下所示:
= <B></B>:粗體
= <I></I>:斜體
= <U></U>:下劃線
= <FONT FACE='face'></FONT>:設置字體
= <FONT SIZE='size'></FONT>:設置字號
= <FONT COLOR='#XXXXXX></FONT>:設置顏色
= <A HREF='address'></A>:網(wǎng)頁超鏈接
= <P></P>:定義段落
=
:換行
10.3 從文本文件中獲取變量
通過ActionScript可以調用Flash影片外部文本文件中的變量。從外部文件中獲取變量的方法非常有用,它可以在不改變Flash文件的基礎上對Flash影片的內容作出修改。例如要用Flash制作一個天氣預報動畫,如果每天都對Flash文件進行修改就太麻煩了。而使用外部變量就只需要對文本文件作出修改。
要從外部文件中獲取變量需要用到的命令是loadVariables,如下所示:
loadVariables("weather.txt", _root);
其中,第1個參數(shù)是Flash影片要獲取變量的文件位置,第2個參數(shù)是文本變量要加載到的位置,可以是_root,也可以是某個影片剪輯或深度級別。Flash將來自外部文件中的變量值加載到與指定位置中具有相同變量名的文本字段中。
使用loadVariables命令要注意的是,指定的文本應以Flash影片中的文本變量名開始,否則不能被加載。本例weather.txt中的內容如下所示:
myDynamicText=Today is Friday,it's rainy!
打開文件loadVariables.fla,在主時間軸中有一個動態(tài)文本框,其變量名與weather.txt中的文本字段相同,當運行前面的腳本時,該文本框中顯示:
Today is Friday,it's rainy!
如果在文本文件中為變量指定多行字符串,Flash將自動識別換行符,從而實現(xiàn)自動換行。
您可以修改文本文件中的內容,Flash中動態(tài)文本顯示的內容也將作出相應的改變。
10.4 練習:滾動新聞
(1)新建一個Flash文檔并保存。
(2)在場景中繪制一個動態(tài)文本框,在屬性面板中將其變量名設為text。
(3)選中文本框,按F8鍵將其轉換為影片剪輯元件,在屬性面板中將該影片剪輯實例命名為news。
(4)選中影片剪輯實例news,打開其動作面板,在其中添加如下ActionScript:
onClipEvent (load) {
loadVariables("news.txt", news);
v = 0;
}
onClipEvent (enterFrame) {
v++;
if (v == 1) {
text = text.substr(1, text.length-1)+text.substr(0, 1);
v = 0;
}
}
在onClipEvent(load)事件中使用loadVariables命令將外部文件news.txt中的文本調入到Flash影片中。
變量v用來控制新聞滾動的速度。
在onClipEvent(enterFrame)事件中使用String對象的substr方法將text中的字符串分拆重組,以實現(xiàn)字符串滾動的效果。
(5)在與該Flash文檔保存位置相同的位置創(chuàng)建一個文本文檔news.txt,在其中添加如下所示的字符:
text=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
其中的text變量與Flash中的動態(tài)文本變量名相同,其后的字符串可以根據(jù)需要添加。測試影片,效果如圖10-3所示。

第11章 Math對象

作為一門編程語言,進行數(shù)學計算是必不可少的。在數(shù)學計算中經(jīng)常會使用到數(shù)學函數(shù),如取絕對值、開方、取整、求三角函數(shù)值等,還有一種重要的函數(shù)是隨機函數(shù)。ActionScript將所有這些與數(shù)學有關的方法、常數(shù)、三角函數(shù)以及隨機數(shù)都集中到一個對象里面——Math對象。
Math對象是ActionScript的一塊敲門磚,只有掌握了它,才能真正對ActionScript動畫編程做到運用自如。

11.1 Math對象的方法
11.1.1 Math.abs
Math對象中集合了許多常用數(shù)學函數(shù)。Math.abs就是用來計算一個數(shù)的絕對值,即一個數(shù)去掉正負符號后的值。其用法如下:
x=Math.abs(-9);
或:
x=Math.abs(num1-num2);
11.1.2 Math.round
Math.round方法將一個浮點數(shù)四舍五入為最接近的整數(shù),如:
trace(Math.round(9.4));
trace(Math.round(9.5));
trace(Math.round(-9.4));
trace(Math.round(-9.5));
trace(Math.round(-9.6));
輸出窗口中將顯示:
9、10、-9、-9、-10
11.1.3 Math.ceil、Math.floor
Math.ceil方法取比一個浮點數(shù)大且最接近的整數(shù),Math.floor方法取比一個浮點數(shù)小且最接近的整數(shù)。如:
trace(Math.ceil(9.1));
trace(Math.floor(9.1));
trace(Math.ceil(-9.1));
trace(Math.floor(-9.1));
輸出窗口中將顯示:
10、9、-9、-10
11.1.4 Math.min、Math.max
Math.min方法取兩個數(shù)中較小的一個數(shù),Math.max方法取兩個數(shù)中較大的一個數(shù),如:
trace(Math.min(9, 8));
trace(Math.max(9, 8));
輸出窗口中顯示:
8、9
11.1.5 Math.pow
Math.pow方法用來計算一個數(shù)的乘方,它包含兩個參數(shù),第1個參數(shù)是底數(shù)(要乘方的數(shù)),第2個參數(shù)是冪(乘方數(shù))。如計算5的3次方:
trace(Math.pow(5, 3));
輸出窗口中顯示:
125
Math.pow方法也可以計算一個數(shù)的開方,如計算125的開3次方:
trace(Math.pow(125, 1/3));
輸出窗口中顯示
5
11.1.6 Math.sqrt
除了用Math.pow計算一個數(shù)的開方,還可以使用Math.sqrt計算一個數(shù)的平方根,如計算64的平方根:
trace(Math.sqrt(64));
輸出窗口中顯示
8
它等同于:
trace(Math.pow(64, 1/2));
11.2 Math對象的常數(shù)
Math對象的常數(shù)有以下幾個:
= Math.PI:圓周率(大約為3.141593)。
= Math.SQRT1_2:1/2的平方根的倒數(shù)(大約為0.707107)。
= Math.SQRT2:2的平方根(大約為1.414214)。
= Math.E:歐拉(Euler)常數(shù),自然對數(shù)的底(大約為2.718282)。
= Math.LN2:2的自然對數(shù)(大約為0.693147)。
= Math.LN10:10的自然對數(shù)(大約為2.302585)。
= Math.LOG2E:e的以2為底的對數(shù)(大約為1.442695)。
= Math.LOG10E:e的以10為底的對數(shù)(大約為0.434294)。
其中Math.PI用得較多,如下面的腳本將弧度值arcdegree轉換為角度值angledegree:
angledegree = arcdegree*(180/Math.PI);
下面的ActionScript將弧度1轉換為角度:
arcdegree = 1;
angledegree = arcdegree*(180/Math.PI);
trace(angledegree);
輸出窗口中顯示:
57.2957795130823
11.3 三角函數(shù)
Math對象中的三角函數(shù)有:
= Math.sin:正弦
= Math.cos:余弦
= Math.tan:正切
= Math.asin:反正弦
= Math.acos:反余弦
= Math.atan:反正切
= Math.atan2:從x坐標軸到點的角度
三角函數(shù)在ActionScript中有著舉足輕重的地位,它們在制作一些特效動畫時將發(fā)揮重要的作用。
在程序語言中通常以x和y標記位置,但是在一個圓周上使用x和y來標記位置并不是很容易。三角函數(shù)在處理與圓周相關的位置參數(shù)時很有效。如用某個圓的圓心位置為(x0,y0),半徑為r,可以用y0+r*Math.sin(0)表示該圓水平直徑右端點的縱坐標,用x0+r*Math.cos(0)表示該圓水平直徑右端點的橫坐標。
如下所示的ActionScript使影片剪輯繞圓周運動:
onClipEvent (load) {
i = 0;
r = 150;
x0 = 275;
y0 = 200;
}
onClipEvent (enterFrame) {
i += 10;
this._x = x0+r*Math.cos(i/(180/Math.PI));
this._y = y0+r*Math.sin(i/(180/Math.PI));
}
此時的影片剪輯是沿順時針方向轉動的,如要讓它沿相反方向轉動,只需將i += 10改寫成i -= 10即可。
ActionScript中的三角函數(shù)都是按照弧度計算的。一個完整圓周的弧度數(shù)為2*Math.PI,大約是6.283185,而一個圓周的角度數(shù)是360。如要在三角函數(shù)中使用角度數(shù),需要將其除以180/Math.PI以轉換為弧度數(shù)。
在上面的腳本中,i的值是遞增的,而并沒有限定在0~360之間。這是因為正弦函數(shù)和余弦函數(shù)是定義在負無窮~正無窮上的周期函數(shù),它們的值是以360°為周期循環(huán)的。
11.4 字符串和數(shù)字的轉換
在ActionScript中,字符串和數(shù)字之間可以相互轉換。在很多時候,將字符串轉換為數(shù)字或將數(shù)字轉換為字符串都是很有必要的。例如,在Flash中有一個變量名為n的輸入文本框和一個按鈕,按鈕中的ActionScript如下:
on (release) {
trace(n+7);
}
當在輸入文本框中輸入11,再單擊按鈕時,輸出窗口將顯示字符串“11”與字符串“7”相加的結果117,而不是數(shù)字11與數(shù)字7相加的結果8。這是因為從輸入文本框中獲得的是字符串,當表達式中有字符串和數(shù)字時,ActionScript優(yōu)先考慮字符串,將數(shù)字轉換為字符串后再進行字符串運算。
為了將字符串轉換成數(shù)字,可以使用ActionScript提供的函數(shù)Number,如將上例所示的腳本改寫成如下所示:
on (release) {
trace(Number(n)+7);
}
當在輸入文本框中輸入11,再單擊按鈕時,輸出窗口將顯示結果18。
如果Number函數(shù)中的參數(shù)不能轉換成數(shù)字,則返回結果NaN。
以“0x”開頭的字符串將被解釋為十六進制數(shù)。
對于布爾值,true將轉換為1,false將轉換為0。例如將上例所示的腳本改寫成如下所示:
on (release) {
n = n>10;
trace(Number(n));
}
當輸入的值小于等于10時,輸出窗口中顯示0;當輸入的值大于10時,輸出窗口中顯示1。
除了Number函數(shù)以外,函數(shù)parseInt可以將字符串轉換成整數(shù),函數(shù)parseFloat可以將字符串轉換為浮點數(shù)。如將上例所示的腳本改寫成如下所示:
on (release) {
trace(parseInt(n)+7);
trace(parseFloat(n)+7);
}
當在輸入文本框中輸入11.99,再單擊按鈕時,輸出窗口中將顯示18和18.99。
parseInt和parseFloat在處理字符串時比Number函數(shù)更專業(yè)一點,它們可以從字符串中取出能轉換成數(shù)字的最長字符串進行轉換,而忽略后面不能轉換成數(shù)字的字符串。如將上例的腳本改寫成如下所示:
on (release) {
trace(Number(n)+7);
trace(parseInt(n)+7);
trace(parseFloat(n)+7);
}
當在輸入文本框中輸入11t7.9并單擊按鈕時,輸出窗口中將顯示
NaN、18、18
parseInt函數(shù)可以有兩個參數(shù),第2個參數(shù)在2~36之間,表示要轉換的數(shù)字的基數(shù),即進制數(shù)。如將二進制數(shù)1101轉換為十進制整數(shù):
trace(parseInt(1101, 2));
輸出窗口中顯示13。
要將數(shù)字轉換成字符串可以使用Number對象(動作面板的“對象”/“核心”目錄)的toString方法。要使用toString方法需要先創(chuàng)建一個Number對象,其用法如下:
myNumber = new Number(15);
trace(myNumber.toString(2));
trace(myNumber.toString(16));
toString中的參數(shù)與parseInt函數(shù)的第2個參數(shù)一樣,都表示進制數(shù)。本例中的2和16分別表示將myNumber轉換為二進制數(shù)和16進制數(shù)。運行腳本,輸出窗口中顯示
1111
f
如果省略參數(shù),默認為十進制。
11.5 隨機數(shù)
隨機數(shù)在Flash中的應用非常廣泛。
在Flash 5以前的版本中,使用random函數(shù)獲取一個近似的隨機數(shù),如random(10)隨機返回0~9這10個整數(shù)中的一個。但在Flash MX中推薦使用Math對象的random方法,即Math.random(),該方法返回一個大于或等于0并且小于1的隨機浮點數(shù)。
Math.random方法比random函數(shù)得到的結果更精確,但它并不能直接產(chǎn)生一個整數(shù)。我們可以使用別的辦法將Math.random方法產(chǎn)生的隨機數(shù)轉換為我們需要的整數(shù),如要得到一個1~10之間的隨機整數(shù),可以使用如下所示的ActionScript:
trace(Math.floor(Math.random()*10+1));
11.6 練習:下雪
打開文件snow.fla,這是一個利用attachMovie和Math.random方法制作的下雪效果,其中每一片雪花的大小、方向各不相同
該動畫中形狀各異的雪花與Math.random函數(shù)密不可分,下面來看它的制作方法。
(1)在庫面板中為snow影片剪輯創(chuàng)建鏈接,其鏈接標識符為snow
(2)將snow元件拖到場景中,選中該影片剪輯實例,在其中添加如下ActionScript:
onClipEvent (load) {
this._visible = false;
v0 = 3; //速度
num = 50; //數(shù)量
vx = new Array(); //記錄水平速度的數(shù)組
vy = new Array();成 //記錄垂直速度的數(shù)組
for (var i = 1; i<=num; i++) {
_root.attachMovie("snow", "snow"+i, i); //附加num個影片剪輯實例
scale = 100*Math.random()+50; //隨機設定實例大小
with (_root["snow"+i]) { //with語句
_xscale = scale;
_yscale = scale;
_x = 500*Math.random(); //隨機出現(xiàn)在影片水平寬度范圍
_y = 400*Math.random(); //隨機出現(xiàn)在影片垂直高度范圍
_rotation = 360*Math.random(); //隨機旋轉一個角度
vx[i] = v0*Math.random()+v0; //隨機取得水平方向上的速度
vy[i] = v0*Math.random()+v0; //隨機取得垂直方向上的速度
}
}
}
onClipEvent (enterFrame) {
for (var i = 1; i<=num; i++) {
with (_root["snow"+i]) {
_x += vx[i]; //在水平方向上運動
_y += vy[i]; //在垂直方向上運動
if (_x<0) { //超出左邊界,從右邊界進入
_x = 500;
}
if (_x>500) { //超出右邊界,從左邊界進入
_x = 0;
}
if (_y>400) { //超出下邊界,從上邊界進入
_y = 0;
}
}
}
}
以上腳本除了用到數(shù)組、attachMovie、Math.random等知識外,還用到了with動作。with動作用來為一組動作腳本指定一個對象,如本例用with動作指定對象_root["snow"+i],并在其后的大括號中對該對象的多種屬性進行修改,從而避免了為每一個屬性重復指定相同的對象,使腳本更緊湊和更簡化。

?

第12章 Color對象

運用好的色彩可以使Flash作品具有更大的感染力,許多好的作品在色彩搭配和控制上都做得很成功。
在ActionScript中,Color對象專門用來管理顏色。使用Color對象可以實現(xiàn)許多色彩特效。

12.1 Color對象
使用ActionScript中的Color對象(動作面板的“對象”/“影片”目錄)可以改變影片剪輯的顏色,Color對象的setRGB方法用來設置影片剪輯實例對象的RGB值。但是并不能對影片剪輯直接使用setRGB命令,在使用Color對象的方法之前首先需要創(chuàng)建Color對象的實例,如下所示:
myColor = new Color(myMC);
其中的參數(shù)myMC是要改變顏色的目標影片剪輯,創(chuàng)建Color對象的實例之后即可調用Color對象的方法,如下所示:
myColor.setRGB(0xFF0000);
setRGB的參數(shù)是以十六進制表示的,0x表示十六進制,后面的6位數(shù)字每兩位為一組,分別表示紅、綠、藍3種顏色成份。如0xFF0000表示純紅,0x00FF00表示純綠,0x0000FF表示純藍,0xFFFF00表示純黃。
當然,也可以用十進制的數(shù)字代替十六進制,如下所示:
myColor1 = new Color(myMC1);
myColor2 = new Color(myMC2);
myColor1.setRGB(0xFFFF00);
myColor2.setRGB(255*256*256+255*256);
trace(myColor1.getRGB().toString(16));
trace(myColor2.getRGB().toString(16));
其中,Color對象的getRGB方法用來獲取由setRGB方法指定的顏色值。
運行腳本,輸出窗口中輸出:
ffff00
ffff00
在這里,使用十六進制比十進制要方便得多。
12.2 練習:改變影片剪輯的顏色
下面是一個應用Color對象的例子,通過選擇顏色面板中的顏色方格,為汽車添加相應的顏色,如圖12-1所示。
其中,顏色面板的每個方格中都有一個透明按鈕,在每個按鈕中添加ActionScript,從而逼真地模仿了Flash的顏色面板。
該例的制作過程如下:
(1)建立影片剪輯panel,第1層放置顏色面板的原始位圖;第2層放置動態(tài)文本框,用來顯示顏色的RGB值,如圖12-1所示的#FF0033,動態(tài)文本變量名為colortext;第3層放置影片剪輯colorarea,當鼠標滑過顏色面板時,顯示鼠標經(jīng)過方格的顏色,它的實例名也為colorarea;第4層為每個顏色方格放置一個按鈕cb,并在屬性面板中將其alpha值設置為0。
(2)將影片剪輯panel拖放到場景中。
(3)新建1層colorcar,將經(jīng)過處理的圖片car.jpg導入進來,選擇“修改”/“轉換位圖為矢量圖”命令將其轉換為矢量圖,并將顏色填充為白色, 將汽車位圖轉換為矢量圖
(4)按F8鍵將白色的汽車矢量圖轉換為影片剪輯元件colorcar,并在場景中將其實例命名為colorcar。
(5)在主場景中新建1層car,導入事先處理好的圖片car.png,這里使用png格式的圖片是因為它保留了alpha通道,即具有透明度。將car.png與第2層中的colorcar影片剪輯對齊將car.png和colorcar對齊
(6)重新進入顏色面板panel影片剪輯,為其中的按鈕添加ActionScript。如為左上角第1個黑色方格的按鈕添加的ActionScript如下所示:
on (rollOver) { //鼠標經(jīng)過時
colortext = "#000000"; //在動態(tài)文本區(qū)中顯示方格的RGB值
mycolor = new Color(colorarea);
mycolor.setRGB(0x000000); //將左上角顏色框設置成方格的顏色
}
on (rollOut) { //鼠標移出時
colortext = ""; //動態(tài)文本區(qū)中不顯示
mycolor.setRGB(0xFFFFFF); //將左上角顏色框設置成白色
}
on (release) { //單擊鼠標時
carbody = new Color(_root.colorcar);
carbody.setRGB(0x000000); //將colorcar設置成單擊處方格的顏色
}
為第1列第7個紅色方格的按鈕添加的ActionScript如下所示:
on (rollOver) {
colortext = "#FF0000";
mycolor = new Color(colorarea);
mycolor.setRGB(0xFF0000);
}
on (rollOut) {
colortext = "";
mycolor.setRGB(0xFFFFFF);
}
on (release) {
carbody = new Color(_root.colorcar);
carbody.setRGB(0xFF0000);
}
其他按鈕中的腳本與上類似,相應的RGB值可以在Flash的顏色面板中查找。
(7)按Ctrl+Enter測試影片,效果如圖12-1所示。

?

第13章 Date對象

Date 對象使您可以獲取相對于通用時間(格林尼治平均時,現(xiàn)在叫做通用時間或 UTC)或相對于運行 Flash Player 的操作系統(tǒng)的日期和時間值。Date 對象的方法不是靜態(tài)的,但僅應用于調用方法時指定的 Date 對象的單個實例。Date.UTC 方法是個例外,它是一個靜態(tài)方法。
Date 對象以不同的方式處理夏時制,具體取決于操作系統(tǒng)和 Flash Player 的版本。
若要調用 Date 對象的方法,必須首先使用 Date 對象的構造函數(shù)創(chuàng)建一個 Date 對象的實例。

13.1 Date對象
Date對象(動作面板的“對象”/“核心”目錄)也是ActionScript重要的內置對象之一。Date對象提供了很多處理通用時間(格林威治時間)或系統(tǒng)時間的方法。
Date對象由七部分構成,它們是:
= year:0~99表示1900~1999年,如果要表示在此以外的年,必須使用完整的4位數(shù)字。
= month:0~11表示1月~12月。
= date:1~31表示日期。
= hour:0~23表示小時數(shù)。
= minute:0~59表示分鐘數(shù)。
= second:0~59表示秒數(shù)。
= millisecond:0~999表示毫秒數(shù)。
Date對象主要有兩種創(chuàng)建方法,一種是通過指定時間創(chuàng)建一個Date對象的實例,這時至少要用到y(tǒng)ear和month兩個參數(shù),如下所示:
myDate = new Date(2003, 7, 8, 13, 16, 500);
另一種方法是通過獲取系統(tǒng)時間創(chuàng)建一個Date對象的實例,這時不指定任何參數(shù),如下所示:
myDate = new Date();
創(chuàng)建Date對象后即可使用Date對象的方法。如下所示:
myDate = new Date();
year = myDate.getYear();
fullyear = myDate.getFullYear();
month = myDate.getMonth();
dates = myDate.getDate();
hour = myDate.getHours();
minute = myDate.getMinutes();
second = myDate.getSeconds();
millisecond = myDate.getMilliseconds();
day = myDate.getDay();
time = myDate.getTime();
trace(year+","+fullyear+","+month+","+dates+","+hour+","+minute+","+second+","+millisecond+","+day+","+time);
getYear方法返回簡寫年份,如1999年返回99,2003年返回103。
getFullYear方法返回完整的4位數(shù)年份,如2003年返回2003。
getMonth方法返回月份,如7月返回6。
getDate方法返回日期,如7月16日返回16。
getHours方法返回小時數(shù),如下午1點返回13。
getMinutes、getSeconds和getMilliseconds方法分別返回分鐘、秒和毫秒數(shù)。
getDay方法返回星期數(shù),星期日返回0,星期一返回1,以此類推。
getTime方法返回自1970年1月1日上午8時至Date對象所指時間的毫秒數(shù)。
運行腳本,輸出窗口中顯示:
103,2003,6,8,13,56,45,679,2,1057643805679
即:2003年7月8日13點56分45秒679毫秒,星期二,距離1970年1月1日上午8時共1057643805679毫秒。
13.2 練習:萬年歷
使用該例萬年歷可以翻查任何一年任何一月的日歷,單擊返回按鈕可以查看當天所在的月份,且當天以白色顯示。本例的制作過程如下:
(1)在圖層back加入背景圖片back.jpg。
(2)在圖層yearmonth添加兩個動態(tài)文本框,變量名為displaymonth和displayyear,分別用來顯示月和年,字體為Vineta BT,顏色為黃色。
(3)在圖層button添加按鈕,分別用來控制月份上翻查、月份下翻查、年份上翻查、年份下翻查和返回當天。
(4)建立一個影片剪輯元件daynum,在其中添加一個變量名為num的動態(tài)文本框,用來顯示日期,它的顏色為綠色。在庫面板中為daynum元件添加鏈接,鏈接標識符也為daynum。
(5)在圖層Actions的第1幀中添加如下ActionScript:
MyDate = new Date(); //創(chuàng)建Date對象以獲取系統(tǒng)時間
MyCurYear = MyDate.getFullYear();
MyCurMonth = MyDate.getMonth();
MonthNames = new array(); //記錄每個月名稱的數(shù)組
DaysOfMonth = new array(); //記錄每個月天數(shù)的數(shù)組
if (MyCurMonth == 1) { //如果是二月,判斷是否為閏年
if ((MyNewYear%4 == 0) && (MyNewYear%100 != 0) || (MyNewYear%400 == 0)) {
DaysOfMonth[1] = 29;
} else {
DaysOfMonth[1] = 28;
}
}
MonthNames[0] = "January";
MonthNames[1] = "February";
MonthNames[2] = "March";
MonthNames[3] = "April";
MonthNames[4] = "May";
MonthNames[5] = "June";
MonthNames[6] = "July";
MonthNames[7] = "August";
MonthNames[8] = "September";
MonthNames[9] = "October";
MonthNames[10] = "November";
MonthNames[11] = "December";
DaysOfMonth[0] = 31;
DaysOfMonth[2] = 31;
DaysOfMonth[3] = 30;
DaysOfMonth[4] = 31;
DaysOfMonth[5] = 30;
DaysOfMonth[6] = 31;
DaysOfMonth[7] = 31;
DaysOfMonth[8] = 30;
DaysOfMonth[9] = 31;
DaysOfMonth[10] = 30;
DaysOfMonth[11] = 31;
(6)在Actions層的第3幀插入關鍵幀,在其動作面板中添加如下ActionScript:
stop();
MyNewDate = new Date(MyCurYear, MyCurMonth, 1); //根據(jù)參數(shù)創(chuàng)建Date對象
MyNewYear = MyNewDate.getFullYear();
MyNewMonth = MyNewDate.getMonth();
displaymonth = MonthNames[MyNewMonth]; //根據(jù)Date對象設置顯示的月份
displayyear = MyNewYear; //根據(jù)Date對象設置顯示的年份
if (MyNewMonth == 1) {
if ((MyNewYear%4 == 0) && (MyNewYear%100 != 0) || (MyNewYear%400 == 0)) {
DaysOfMonth[1] = 29;
} else {
DaysOfMonth[1] = 28;
}
}
MyDaysOfMonth = DaysOfMonth[MyNewDate.getMonth()];
MyDay = MyNewDate.getDay();
for (i=1; i<=Number(MyDaysOfMonth); i++) { //顯示當月的所有天數(shù)
attachMovie("daynum", "daynum"+i, i); //附加顯示日期的影片剪輯
_root["daynum"+i].num = i; //修改影片剪輯內的動態(tài)文本
if (i == 1) { //如果是每月的第1天
if (MyDay == 0) { //星期日
_root.daynum1._x = 50; //_x坐標為50,位于SUN下面
} else if (MyDay == 1) {
_root.daynum1._x = 100;
} else if (MyDay == 2) {
_root.daynum1._x = 150;
} else if (MyDay == 3) {
_root.daynum1._x = 200;
} else if (MyDay == 4) {
_root.daynum1._x = 250;
} else if (MyDay == 5) {
_root.daynum1._x = 300;
} else if (MyDay == 6) {
_root.daynum1._x = 350;
}
_root.daynum1._y = 130; //_y坐標為130
} else { //如果不是第1天
_root["daynum"+i]._x = _root["daynum"+(i-1)]._x+50; //_x坐標增加50
_root["daynum"+i]._y = _root["daynum"+(i-1)]._y; //_y坐標不變
if (_root["daynum"+i]._x>350) { //_x坐標超出星期六
_root["daynum"+i]._x = 50; //回到星期日的位置
_root["daynum"+i]._y += 40; //_y坐標下移40
}
if (_root["daynum"+i]._y>290) { //_y坐標超出下邊界
_root["daynum"+i]._y = 130; //回到第一行顯示
}
}
}
MyNewDate = new Date(); //獲取系統(tǒng)時間
colorday = MyNewDate.getDate(); //獲取要以白色顯示的日期
if ((_root.displayyear == MyNewDate.getFullYear()) && (_root.displaymonth == MonthNames[MyNewDate.getMonth()])) { //如果顯示的月份為當前月份
MyColor = new Color(_root["daynum"+colorday]); //將當前日期設置成白色
MyColor.setRGB(0xFFFFFF);
}
(7)為年份上翻查按鈕的動作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //單擊時刪除顯示的日期
}
MyCurYear--; //年份變量減1
gotoAndPlay(2); //回到第2幀創(chuàng)建新的Date對象
}
(8)為年份下翻查按鈕的動作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //單擊時刪除顯示的日期
}
MyCurYear++; //年份變量加1
gotoAndPlay(2); //回到第2幀創(chuàng)建新的Date對象
}
(9)為月份上翻查按鈕的動作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //單擊時刪除顯示的日期
}
MyCurMonth--; //月份變量減1
if (MyCurMonth == -1) {
MyCurMonth = 11;
MyCurYear--;
}
gotoAndPlay(2); //回到第2幀創(chuàng)建新的Date對象
}
(10)為月份下翻查按鈕的動作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //單擊時刪除顯示的日期
}
MyCurMonth++; //月份變量加1
if (MyCurMonth == 12) {
MyCurMonth = 0;
MyCurYear++;
}
gotoAndPlay(2); //回到第2幀創(chuàng)建新的Date對象
}
(11)為返回按鈕的動作面板添加如下ActionScript:
on (release) {
for (j=1; j<=31; j++) {
removeMovieClip("daynum"+j); //單擊時刪除顯示的日期
}
gotoAndPlay(1); //回到第1幀獲取系統(tǒng)時間
}
(12)按Ctrl+Enter測試影片,效果如圖13-1所示。

?

第14章 Sound對象

在時間軸中直接嵌入聲音是制作Flash MV的一種通用手法,但是這種方法除了從頭至尾地播放聲音外,并不能對聲音進行很好的控制。ActionScript內置的Sound對象(動作面板的“對象”/“影片”目錄)為我們提供了管理和控制聲音的一種好方法。


14.1 attachSound方法
Sound對象的attachSound方法與MovieClip對象的attachMovie方法類似,它在影片播放時將庫中的聲音元件附加到場景中。要使用該方法將聲音附加到場景中,首先需要在庫中為聲音添加鏈接,為聲音元件添加鏈接和為影片剪輯元件添加鏈接的方法類似,在要添加鏈接的聲音元件中單擊鼠標右鍵,在彈出的快捷菜單中選擇“鏈接”命令,彈出“鏈接屬性”對話框,
與Color對象和Date對象等其他內置對象一樣,在使用Sound對象需要創(chuàng)建Sound對象的新實例,如下所示:
mySound = new Sound();
創(chuàng)建Sound對象的實例之后即可調用聲音元件的鏈接,如下所示:
mySound.attachSound("music");
其中,attachSound方法的參數(shù)即是庫中為聲音元件添加的鏈接。僅僅執(zhí)行以上操作還不夠,必須使用下面的ActionScript讓聲音開始播放:
mySound.start();
如果操作執(zhí)行無誤,測試影片,一首動人的化蝶便開始播放了。
要停止用Sound對象播放的聲音,可以使用如下所示的ActionScript:
mySound.stop();
14.2 練習:用按鈕點歌
下面用以上的方法制作一個使用按鈕點歌的影片,以加深對attachMovie方法的印象。
打開文件attachSound.fla,場景中添加了4個按鈕和1個空影片剪輯,庫中包含3個添加了鏈接的聲音元件,它們的鏈接標識符分別為music1~music3,如圖14-3所示

圖14-3 attachSound.fla文件的編輯場景
在空影片剪輯的動作面板中添加如下所示的ActionScript:
onClipEvent (load) {
_root.turn = 1;
}
變量turn用來記錄當前播放的曲目位置。
第2個按鈕用來播放當前位置的曲目,在它的的動作面板中添加如下所示的ActionScript:
on (release) {
mySound.stop();
mySound = new Sound();
mySound.attachSound("music"+_root.turn);
mySound.start();
}
不管當前是否有曲目正在播放,單擊該按鈕都將重新加載當前曲目,并從頭開始播放。
第3個按鈕用來停止播放當前位置的曲目,在它的動作面板中添加如下所示的ActionScript:
on (release) {
mySound.stop();
}
單擊該按鈕,Sound對象停止播放。
第1個按鈕用來使當前曲目回退一首并開始播放,在它的動作面板中添加如下所示的ActionScript:
on (release) {
mySound.stop();
_root.turn--;
if (_root.turn<1) {
_root.turn = 3;
}
mySound = new Sound();
mySound.attachSound("music"+_root.turn);
mySound.start();
}
單擊該按鈕,曲目位置回退一首,并判斷是否超出第1首,如果是,則跳到第3首,從而實現(xiàn)循環(huán)。
第4個按鈕的作用與第1個按鈕相反,它使當前曲目前進一首并開始播放,在它的動作面板中添加如下所示的ActionScript:
on (release) {
mySound.stop();
_root.turn++;
if (_root.turn>3) {
_root.turn = 1;
}
mySound = new Sound();
mySound.attachSound("music"+_root.turn);
mySound.start();
}
單擊該按鈕,曲目位置前進一首,并判斷是否超出第3首,如果是,則跳到第1首,從而實現(xiàn)循環(huán)。
14.3 loadSound方法
使用attachSound方法雖然可以動態(tài)地加載聲音,但前提是需要將聲音預先加入到庫中,這樣并不能避免文件過大的弊端。使用Sound對象的loadSound方法可以將Flash文件以外的MP3聲音文件加載到影片中進行播放,這樣可以有效地解決文件過大且播放的曲目有限的缺陷,使用loadSound方法可以播放計算機或網(wǎng)絡中的任何MP3文件。
loadSound方法如下所示:
mySound.loadSound("url", isStreaming);
其中,url是指定要載入的MP3文件在計算機或網(wǎng)絡中的路徑,isStreaming是一個布爾值,用于指示加載的聲音是作為事件聲音還是作為聲音流,為false時表示作為事件聲音,為true時表示作為聲音流。
事件聲音在完全加載后才能播放。它們由動作腳本 Sound 對象進行管理,而且響應此對象的所有方法和屬性。聲音流在下載的同時播放。當接收的數(shù)據(jù)足以啟動解壓縮程序時,播放開始。
與attachMovie方法類似,使用loadSound方法的過程是:創(chuàng)建Sound對象、使用loadSound方法載入MP3文件、使用start命令播放聲音以及使用Sound對象的其他方法控制聲音或使用stop命令停止聲音。
14.4 練習:從計算機中加載MP3
打開文件loadSound.fla,
其中有一個輸入文本框,一個播放按鈕和一個停止按鈕。輸入文本框的變量名為sound_url,在播放按鈕的動作面板中添加了如下ActionScript:
on (release) {
mySound.stop();
mySound = new Sound();
mySound.loadSound(sound_url, false);
mySound.start();
}
單擊該按鈕,從輸入文本框sound_url中獲取MP3文件的路徑,并將其作為事件聲音(第2個參數(shù)為false)加載到影片中進行播放。
在停止按鈕的動作面板中添加如下ActionScript:
on (release) {
mySound.stop();
}
單擊該按鈕,聲音停止播放。
14.5 調節(jié)和控制聲音
Sound對象不僅提供了動態(tài)加載聲音、播放和停止聲音的方法,而且也提供了調節(jié)聲音和控制進度等方法,綜合使用這些方法,完全可以用Flash做出一個具有較高品質的音樂播放器。
= start方法
如前所示,不使用參數(shù)時,start方法簡單地從開始位置播放聲音;start方法也可以接受參數(shù),如下所示:
mySound.start(secondOffset, loop);
參數(shù)secondOffset指定聲音開始播放的位置,如指定10,將從第10秒的位置開始播放聲音。參數(shù)loop指定聲音的循環(huán)次數(shù)。
= setVolume方法
setVolume方法用來設置音量,其使用方法如下所示:
mySound.setVolume(volume);
參數(shù)volume的值位于0~100之間,0表示無音量,100表示最大音量,聲音播放時默認的音量為100。
= setPan方法
setPan方法用來設置聲音的左右均衡,其使用方法如下所示:
mySound.setPan(pan);
參數(shù)pan的值位于-100~100之間,-100表示僅使用左聲道,100表示僅使用右聲道,0表示左右聲道均衡。
= getBytesTotal方法
getBytesTotal方法以字節(jié)為單位返回聲音對象的總大小。
= duration屬性
Sound對象的duration屬性返回整個聲音對象持續(xù)的毫秒數(shù)。
= position屬性
Sound對象的position屬性返回聲音已播放的毫秒數(shù)。
使用duration屬性和position屬性可以方便地控制聲音的播放進度,這在制作播放器時是非常有用的。
= onSoundComplete事件處理函數(shù)
當聲音播放完時自動調用onSoundComplete事件處理函數(shù)。
14.6 練習:MP3播放器
單擊打開文件按鈕可以打開一個輸入文本框,在其中可以輸入MP3文件的路徑,單擊關閉文件按鈕可以關閉輸入文本框。
左邊的五個按鈕分別用于控制MP3的播放、快進、快退、暫停、停止,右邊的三個游標分別用于控制音量、聲道和顯示MP3的播放進度。
當播放MP3時,控制相關影片剪輯播放動畫,當MP3停止時,所有動畫同時停止。播放器上部還顯示了日期和時間。在播放器上按下鼠標可以拖動播放器到任意位置。
下面來看MP3播放器的制作過程。
(1)在影片剪輯實例url的動作面板中添加如下ActionScript:
onClipEvent (load) {
_visible = false; //隱藏輸入文本框
}
(2)在打開文件按鈕的動作面板中添加如下ActionScript:
on (release) {
_root.url._visible = true; //顯示輸入文本框
}
(3)在關閉文件按鈕的動作面板中添加如下ActionScript:
on (release) {
_root.url._visible = false; //隱藏輸入文本框
}
(4)在播放按鈕的動作面板中添加如下ActionScript:
on (release) {
_root.music.stop();
_root.music = new Sound();
_root.music.loadSound(_root.url.music_url, false);
//music_url是輸入文本變量名,它所在的影片剪輯實例名為url
_root.music.start(); //開始播放
_root.music.onSoundComplete = function() { //播放結束時停止相關動畫
_root.face.mcphone.gotoAndStop(1);
_root.face.tyre.gotoAndStop(1);
_root.scene.gotoAndStop(1);
};
if (_root.music.getBytesTotal()>0) { //有聲音載入時開始相關動畫
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
}
(5)在停止按鈕的動作面板中添加如下ActionScript:
on (release) { //停止聲音和相關動畫
_root.music.stop();
_root.face.mcphone.gotoAndStop(1);
_root.face.tyre.gotoAndStop(1);
_root.scene.gotoAndStop(1);
}
(6)在快進按鈕中添加如下ActionScript:
on (release) {
if ((_root.music.position/_root.music.duration)<0.95) {
pos = _root.music.position/1000; //獲取MP3的當前進度
_root.music.stop();
_root.music.start((pos+0.05*_root.music.duration/1000), 1);
//從當前進度快進5%開始播放
if (_root.music.getBytesTotal()>0) { //有聲音載入時播放相關動畫
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
} else {
_root.music.stop();
_root.face.mcphone.gotoAndStop(1);
_root.face.tyre.gotoAndStop(1);
_root.scene.gotoAndStop(1);
}
}
(7)在快退按鈕的動作面板中添加如下ActionScript:
on (release) {
if ((_root.music.position/_root.music.duration)>0.05) {
pos = _root.music.position/1000; //獲取MP3的當前進度
_root.music.stop();
_root.music.start((pos-0.05*_root.music.duration/1000), 1);
//從當前進度快退5%開始播放
if (_root.music.getBytesTotal()>0) { //有聲音載入時播放相關動畫
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
} else {
_root.music.start();
if (_root.music.getBytesTotal()>0) {
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
}
}
(8)在暫停按鈕的動作面板中添加如下ActionScript:
on (release) {
if (pause != 1) { //pause!=1表示播放狀態(tài),停止聲音
_root.music.stop(); //停止聲音和相關動畫
_root.face.mcphone.gotoAndStop(1);
_root.face.tyre.gotoAndStop(1);
_root.scene.gotoAndStop(1);
pos = _root.music.position;
pause = 1; //標記暫停狀態(tài)
} else { //pause==1表示暫停狀態(tài),播放聲音
_root.music.start(pos/1000, 1); //在停止位置開始聲音
if (_root.music.getBytesTotal()>0) { //有聲音載入時播放相關動畫
_root.face.mcphone.gotoAndPlay(2);
_root.face.tyre.gotoAndPlay(2);
_root.scene.gotoAndPlay(2);
}
pause = 0; //標記播放狀態(tài)
}
}
(9)控制音量、聲道和進度的游標都是內嵌了按鈕的影片剪輯。在音量游標影片剪輯的動作面板中添加如下ActionScript:
onClipEvent (load) {
left = _x-100;
right = _x;
top = _y;
bottom = _y;
}
onClipEvent (enterFrame) {
_root.music.setVolume(_x-left); //將音量游標和標尺左端的距離作為音量大小
}
(10)在音量游標內的按鈕的動作面板中添加如下ActionScript:
on (press) {
startDrag("", false, left, top, right, bottom); //限制游標的拖動范圍
}
(11)在聲道游標影片剪輯的動作面板中添加如下ActionScript:
onClipEvent (load) {
left = _x-50;
right = _x+50;
top = _y;
bottom = _y;
center = _x;
}
onClipEvent (enterFrame) {
_root.music.setPan((_x-center)*2); //將聲道游標和標尺中點的距離作為聲道值
}
on (release, releaseOutside) {
stopDrag();
}
(12)在聲道游標內的按鈕的動作面板中添加如下ActionScript:
on (press) {
startDrag("", false, left, top, right, bottom); //限制游標的拖動范圍
}
on (release, releaseOutside) {
stopDrag();
}
(13)在進度游標影片剪輯的動作面板中添加如下ActionScript:
onClipEvent (load) {
source = _x;
left = _x;
top = _y;
right = _x+100;
bottom = _y;
}
onClipEvent (enterFrame) {
_x = source+100*(_root.music.position/_root.music.duration);
}
(14)在進度游標內的按鈕的動作面板中添加如下ActionScript:
on (press) {
startDrag("", false, left, top, right, bottom);
}
on (release, releaseOutside) {
_root.music.stop();
_root.music.start(((_root.face._xmouse-source)/100*_root.music.duration/1000), 1);
stopDrag();
}
(15)在整個播放器影片剪輯的動作面板中添中如下ActionScript:
onClipEvent (load) {
days = new Array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT');
datetime = new Date(); //創(chuàng)建Date對象
}
onClipEvent (enterFrame) {
mymonth = datetime.getMonth()+1; //mymonth是顯示月份的動態(tài)文本變量名
mydate = datetime.getDate(); //mydate是顯示日期的動態(tài)文本變量名
day = datetime.getDay();
myday = days[day]; //myday是顯示星期的動態(tài)文本變量名
myhour = datetime.getHours(); //myhour是顯示小時的動態(tài)文本變量名
if (myhour<10) {
myhour = "0"+myhour;
}
myminute = datetime.getMinutes(); //myminute是顯示分鐘的動態(tài)文本變量名
if (myminute<10) {
myminute = "0"+myminute;
}
mysecond = datetime.getSeconds(); //mysecond是顯示秒的動態(tài)文本變量名
if (mysecond<10) {
mysecond = "0"+mysecond;
}
delete datetime; //刪除Date對象
datetime = new Date(); //獲取新的系統(tǒng)時間
}
(16)在播放器影片剪輯中加入了一個透明度為0的按鈕,在它的動作面板中添加如下ActionScript:
on (press) {
this.startDrag("true"); //按下鼠標時拖動播放器
}
on (release, releaseOutside) {
this.stopDrag(); //釋放鼠標時停止拖動播放器
}
(17)按Ctrl+Enter鍵測試影片,效果如圖14-5所示。

?

第15章 實現(xiàn)與服務器的交互

作為Macromedia公司的網(wǎng)頁三劍客之一,Flash理所當然地在網(wǎng)頁設計和網(wǎng)絡運用方面占占據(jù)著重要的地位。不僅可以在網(wǎng)頁中嵌入Flash動畫,而且可以使用Flash制作網(wǎng)站片頭、導航條,甚至是全Flash的網(wǎng)站。借助于ActionScript,Flash也具備與服務器的交互功能。優(yōu)秀的服務器端程序與ActionScript的結合將使網(wǎng)頁更加精彩。

15.1 簡單鏈接
使用ActionScript可以將Flash影片鏈接到指定的網(wǎng)頁,這與HTML中的<A HREF>標記類似。如在按鈕中添加如下ActionScript:
on (release) {
getURL(" http://www.macromedia.com" ;);
}
無論該Flash影片是獨立存在的還是嵌入在網(wǎng)頁中,單擊該按鈕都將啟動瀏覽器并打開通過getURL命令指定的頁面,這里是Macromedia公司的主頁。
getURL動作位于動作面板的“動作”/“瀏覽器/網(wǎng)絡”目錄。
除了使用getURL命令,也可以直接在動態(tài)文本中添加超鏈接,如為動態(tài)文本變量url添加鏈接如下所示:
url = "<A HREF=' http://www.macromedia.com& #39;>The Macromedia Homepage.</A>";
在動態(tài)文本框中將顯示The Macromedia Homepage.它與網(wǎng)頁中的<A HREF>標記類似,只是鏈接文字下面沒有下劃線。
除了可以鏈接到網(wǎng)絡中的地址,getURL命令還可以用來打開計算機中的文件夾和文件,如通過單擊按鈕打開F盤:
on (release) {
getURL("file:///f:");
}
通過單擊按鈕打開文件:
on (release) {
getURL("file:///f:/music/Stronger.DAT");
}
15.2 指定打開鏈接的目標框架或窗口
使用getURL可以指定瀏覽器中用來打開鏈接的框架或窗口,getURL命令的第2個參數(shù)即用來指定目標框架或窗口的名稱。
如Flash影片所在的網(wǎng)頁是由兩個框架構成的,Flash所在的框架名為Frame1,另一個框架名為Frame2,可以使用如下所示的ActionScript在框架Frame2中打開目標網(wǎng)頁:
on (release) {
getURL(" http://www.macromedia.com" ;, "Frame2");
}
指定窗口的方式與此相同。
在ActionScript中有4個特殊的關鍵字用來指示瀏覽器執(zhí)行特殊的操作,如下所示:
= _blank
在新窗口中打開目標頁,該窗口將應用默認的瀏覽器設置。
= _parent
在當前框架的父級打開目標頁。
= _top
在當前框架的頂級窗口中打開目標頁,無論當前窗口由多少子框架構成,目標頁都將取代框架而占據(jù)整個窗口。
= _self
使用當前窗口或框架打開目標頁。當getURL命令省略第2個參數(shù)時即默認此方式。
如在新窗口中打開目標頁的ActionScript如下所示:
on (release) {
getURL(" http://www.macromedia.com" ;, "_blank");
}
如果要自定義瀏覽器中新窗口的大小或設置,你將需要用到JavaScript。
15.3 LoadVars對象
Flash MX版本提供了新增的LoadVars對象使你可以實現(xiàn)Flash與服務器的交互。
LoadVars 對象是 loadVariables 動作的替代方法,用于在 Flash 影片和服務器之間傳輸變量。
可使用 LoadVars 對象在下載時獲取錯誤信息、進度指示和流數(shù)據(jù)。LoadVars 對象的工作原理非常類似于 XML 對象;它使用方法 load、send 和 sendAndLoad 與服務器進行通訊。LoadVars 對象和 XML 對象的主要差別在于 LoadVars 傳輸動作腳本的名稱和值對,而不是 XML 對象中存儲的 XML DOM 樹。
LoadVars 對象與 XML 對象遵循相同的安全限制。
15.3.1 從服務器下載數(shù)據(jù)
和其他對象一樣,在使用LoadVars對象之前必須使用構造函數(shù)創(chuàng)建一個LoadVars對象的實例,如下所示:
myVars = new LoadVars();
要從服務器獲取數(shù)據(jù)可以使用命令load,只需在load命令中指定要下載據(jù)的鏈接地址,如下所示:
myVars.load("myURL.txt");
從這里看來,LoadVars對象的load命令和LoadVariables命令很相似,但是LoadVariables命令不能區(qū)別文本中的不同變量,而在load命令中可以指定要獲取數(shù)據(jù)的變量,如文本url.txt中有如下內容:
ID=thyme&Password=cd99
在Flash文件的第1幀動作面板中添加如下ActionScript:
myVars = new LoadVars();
myVars.load("url.txt");
在第40幀的動作面板中添加如下ActionScript:
stop();
loadVariables("url.txt", _root);
_root.varID = myVars.ID;
_root.varPA = myVars.Password;
其中,第40幀的第1個動態(tài)文本變量名為ID,第2個動態(tài)文本變量名為varID,第3個動態(tài)文本變量名為varPA。
需要說明的是,與loadVariables命令相同,load命令指定的鏈接文件也必須與Flash的播放文件在同一個文件目錄下面。
15.3.2 向服務器上傳數(shù)據(jù)
使用send命令可以向服務器上傳數(shù)據(jù),如下所示:
myVars = new LoadVars();
myVars.ID = "thyme";
myVars.Password = cd99;
myVars.send("mypage.asp", "_self");
以上的腳本創(chuàng)建一個LoadVars對象myVars,然后分別設置兩個屬性ID和Password,最后將該對象發(fā)送到服務器的mypage.asp頁中。
參數(shù)_self表示將使用上傳的變量從服務器獲取信息以刷新當前頁面。
使用sendAndLoad命令不僅可以上傳數(shù)據(jù),而且可以獲取服務器的響應信息,如下所示:
mySendVars = new LoadVars();
myLoadVars = new LoadVars();
mySendVars.ID = "thyme";
mySendVars.Password = cd99;
mySendVars.sendAndLoad("mypage.asp", myLoadVars);
其中創(chuàng)建了兩個LoadVars對象,myLoadVars作為sendAndLoad命令的第2個參數(shù)用于存放來自服務器的響應。
15.3.3 下載狀態(tài)
使用load、send、sendAndLoad命令下載和上傳數(shù)據(jù)有一定的速度限制,這種速度與客戶端和服務器的數(shù)據(jù)傳輸速率有關,但是無論如何都不是剛一執(zhí)行命令就能馬上完成。如上面的例子,其中在第1幀執(zhí)行l(wèi)oad命令,在第40幀才使用腳本將其中的數(shù)據(jù)在動態(tài)文本中顯示出來;如果只有1幀,在執(zhí)行l(wèi)oad命令后馬上使用腳本為動態(tài)文本變量賦值,并不能實現(xiàn)我們預期的效果。
為了避免被動地等待數(shù)據(jù)傳輸,LoadVars對象提供了檢測數(shù)據(jù)下載狀態(tài)的辦法。
使用getBytesLoaded和getBytesTotal方法可以了解數(shù)據(jù)下載的進度,傳輸?shù)臄?shù)據(jù)量小并且網(wǎng)絡速度也并不是很慢時這兩種方法并不能發(fā)揮明顯的作用。如果要解決上例中的問題,可以定義一個在數(shù)據(jù)下載完成時執(zhí)行的函數(shù),當數(shù)據(jù)完全傳輸成功時,系統(tǒng)會自動啟動該函數(shù)。
如要將文件load.fla的第40幀合并到第1幀,如果使用如下的ActionScript,結果如圖15-3所示。
stop();
myVars = new LoadVars();
myVars.load("url.txt");
loadVariables("url.txt", _root);
_root.varID = myVars.ID;
_root.varPA = myVars.Password;

如果將其中的腳本改寫成如下所示,我們將得到正確的結果,如圖15-4所示:
stop();
loadVariables("url.txt", _root);
myVars = new LoadVars();
myVars.load("url.txt");
myVars.onLoad = function() {
_root.varID = myVars.ID;
_root.varPA = myVars.Password;
};

僅僅完成從服務器下載和向服務器上傳數(shù)據(jù)是不夠的,要用Flash更強大的應用程序就得編寫相應的服務器端腳本,如前面提到的mypage.asp就是用ASP(Active Sever Pages)語言編寫的動態(tài)頁面。編寫服務器端腳本的語言很多,如PHP、CGI、Perl等,限于篇幅,在此不予詳細講解。

?

第16章 XML運用

XML(eXtensible Markup Language可擴展置標語言),它是有別于HTML(Hyper Text Markup Language超文本置標語言)的一種數(shù)據(jù)表示規(guī)范。由于它極大的靈活性和方便性,在存儲和表示數(shù)據(jù)方面占據(jù)了巨大的優(yōu)勢。
ActionScript中的XML對象為你提供了訪問XML文檔的途徑,使用點語法和XML對象的屬性可以方便地訪問XML文檔(既可以是存儲XML數(shù)據(jù)的文本文檔,也可以是XML格式的文檔)中的具體數(shù)據(jù),并可以在Flash中將外部XML文檔中的數(shù)據(jù)顯示出來。

16.1 XML基礎
XML與HTML有相似之處,因為它們都使用標簽(tag)。但是HTML中的標簽都是HTML的語法所預定好的,如<font></font>表示字體,<br>表示換行等;而XML中的標簽則可以由用戶根據(jù)需要、習慣和愛好自由指定,如下所示是一個XML的例子:
<student>
<name>Thyme</name>
<age>18</age>
<score>
<English>94</English>
<Physics>86</Physics>
<Chemistry>99</Chemistry>
</score>
<grade>B</grade>
</student>
上例的XML文檔定義了一個student對象,在student對象下面包含4組信息,分別是name、age、score和grade,在score下面又分為English、Physics、Chemistry這3類,以上這些成對出現(xiàn)的標志即是XML的標簽,標簽又稱為XML的元素(element)或節(jié)點(node)。每對節(jié)點之間包含與該節(jié)點相對應的數(shù)據(jù),這些數(shù)據(jù)又稱為文本節(jié)點(text node)。
使用XML表示的數(shù)據(jù)結構一目了然,這也是它之所以深受人們寵愛的原因之一。在Flash中使用XML對象可以方便地解析XML的數(shù)據(jù)結構,以訪問需要的節(jié)點或數(shù)據(jù)。
XML的另一大優(yōu)點就是可以使用簡單的文本編輯器進行編輯,程序員可以很容易地編寫出訪問XML格式數(shù)據(jù)的程序。這也為使用Flash制作與服務器交互的影片提供了一條捷徑。
16.2 XML對象
同ActionScript的其他對象一樣,要使用XML對象,就得先創(chuàng)建XML對象的實例,其方法如下:
myXML = new XML();
XML對象提供了眾多的屬性、方法和事件,下面重點介紹常用的幾種。
16.2.1 load方法
XML的load方法用于從指定的URL中加載XML文檔,并使用下載的XML數(shù)據(jù)替換指定XML對象的內容。使用load方法加載的XML文檔必須與Flash影片處于相同的文件夾中。如下所示的ActionScript創(chuàng)建并從外部文本文檔中加載XML對象:
myXML = new XML();
myXML.load("XMLData.txt");
如下所示的ActionScript創(chuàng)建并從外部XML文檔中加載XML對象:
myXML = new XML();
myXML.load("XMLData.xml");
和LoadVars.load方法類似,使用XML.load命令后并不能立即將外部文檔中的數(shù)據(jù)加載到影片中,如果直接引用文檔中的數(shù)據(jù)可能會得不到需要的結果。要判斷XML文檔是否已經(jīng)加載到影片中,可以使用下面要介紹的onLoad事件。
16.2.2 onLoad事件
當從服務器上接收XML文檔時,由Flash Player調用XML的onLoad事件。調用onLoad事件時自動返回一個參數(shù)success,如果成功地收到XML文檔,則success參數(shù)為true;如果未收到該文檔,或從服務器上接收響應時出現(xiàn)錯誤,則success參數(shù)為false。
onLoad事件的使用方法如下所示:
myXML = new XML();
myXML.load("XMLData.txt");
myXML.onLoad = function() {
if (success == true) {
trace("XML is successfully loaded");
} else {
trace("Something is wrong with the XML document");
}
};
16.2.3 childNodes屬性
XML的childNodes屬性返回指定XML對象的子級的數(shù)組,數(shù)組中的每個元素都是對表示子節(jié)點的XML對象的引用,也就是說childNodes屬性將XML對象當前級的子級節(jié)點作為一個數(shù)據(jù)返回。與數(shù)據(jù)一樣,使用方括號可以訪問數(shù)據(jù)的每一個元素。
例如外部文檔中有圖16-1所示結構圖的XML對象,先將其加載到影片中的XML對象中:
myXML = new XML();
myXML.load("XMLData.xml");
myXML.onLoad = function(success) {
if (success == true) {
trace(myXML.childNodes[0]);
}
};
運行以上腳本,輸出窗口中將顯示整個XML對象
將上面腳本中的trace語句換成如下所示:
trace(myXML.childNodes[0].childNodes[0]);
運用腳本,奇怪,輸出窗口中沒有顯示。其實并不是沒有顯示,而是因為<student>后面有一個換行,Flash沒能識別這個換行,而是將一個空行也作為XML對象的一個節(jié)點了。如果要驗證,可以運行以下腳本:
trace(myXML.childNodes[0].childNodes[1]);
輸出窗口中顯示:
<name>Thyme</name>
如果Flash Player不能識別空格和空行,那么就不能把XML文檔寫成很有層次的格式,也就不方便我們閱讀了。事實上,不用擔心,下一個屬性將幫助你解決這個問題。
16.2.4 ignoreWhite屬性
ignoreWhite屬性的默認設置為false,當設置為true時,在分析過程中將放棄僅包含空白的文本節(jié)點。要解決前面遇到的問題,只需要將XML對象的ignoreWhite屬性設置為true即可。
在上例中使用如下所示的ActionScript將在輸出窗口中返回<name>Thyme</name>:
myXML = new XML();
myXML.load("XMLData.xml");
myXML.ignoreWhite = true;
myXML.onLoad = function(success) {
if (success == true) {
trace(myXML.childNodes[0].childNodes[0]);
}
};
如果要返回<Physics>86</Physics>就需要如下的ActionScript:
trace(myXML.childNodes[0].childNodes[2].childNodes[1]);
如何才能返回Physics字段中的86呢?下面的ActionScript可以嗎:
trace(myXML.childNodes[0].childNodes[2] .childNodes[1].childNodes[0]);
上面的腳本的確是返回了86,但事實上,它返回的是86這個節(jié)點,而不是這個節(jié)點中的文本。要得到文本節(jié)點中的文本字段,就需要使用nodeValue屬性。
16.2.5 nodeValue屬性
nodeValue屬性返回XML對象的節(jié)點值。如果XML對象為文本節(jié)點,則nodeValue為該節(jié)點的文本;如果該XML對象是XML元素,則其nodeValue為null。
要得到上例中的文本86,可以使用如下所示的ActionScript:
trace(myXML.childNodes[0].childNodes[2].childNodes[1].childNodes[0].nodeValue);
既然XML元素和XML的文本節(jié)點是有區(qū)別的,就有必要將這兩種類型的節(jié)點區(qū)別開來。
16.2.6 nodeType屬性
nodeType是一個只讀屬性,值為1表示XML元素,為3表示文本節(jié)點。如上例中,使用以下腳本將分別返回1和3。
trace(myXML.childNodes[0].childNodes[2].childNodes[1].nodeType);
trace(myXML.childNodes[0].childNodes[2].childNodes[1].childNodes[0].nodeType);
16.2.7 nodeName屬性
與節(jié)點密切相關的還有一個nodeName屬性。nodeName屬性返回XML對象的節(jié)點名稱,如果該XML對象是一個XML元素(nodeType==1),則nodeName是表示XML文件中節(jié)點的標簽名稱;如果該XML對象為文本節(jié)點(nodeType==3),則nodeName為null。如上例中,使用以下腳本將分別返回Physics和null:
trace(myXML.childNodes[0].childNodes[2].childNodes[1].nodeName);
trace(myXML.childNodes[0].childNodes[2].childNodes[1].childNodes[0].nodeName);
16.2.8 status屬性
如果從外部加載進來的XML文檔有漏洞,在Flash影片中引用時肯定會出現(xiàn)問題。XML對象的status屬性可以幫助檢查XML對象是否完整和存在缺陷。調用status屬性將返回一個數(shù)值,該數(shù)值的不同狀態(tài)分別表示不同的含義,如下所示:
= 0 沒有錯誤;成功地完成了分析。
= -2 一個CDATA部分沒有正確結束。
= -3 XML聲明沒有正確結束。
= -4 DOCTYPE聲明沒有正確結束。
= -5 一個注釋沒有正確結束。
= -6 一個XML元素有格式錯誤。
= -7 內存不足。
= -8 一個屬性值沒有正確結束。
= -9 一個開始標記沒有匹配的結束標記。
= -10 遇到一個沒有匹配的開始標記的結束標記。
通過分析status屬性的不同值,可以對相應的XML文檔作有針對性的檢查和修改,直到?jīng)]有錯誤為止。
16.3 練習:用表單顯示XML文檔內容
本練習的目的是使用表單加載和顯示XML文檔的內容,以對XML對象的各種常用屬性、方法和事件有進一步的了解。本練習的源文件為XML.fla。在同一文件夾中包含一個XML格式的文檔,其中的內容如下所示:
<form>
<formname>Author's Information</formname>
<Name>
<firstname>Thyme</firstname>
<familyname>CD</familyname>
</Name>
<IDNo.>510228198111079090</IDNo.>
<Address>
<mailID>610031</mailID>
<Street>New 2 Fu Qing West Road</Street>
<City>Chengdu</City>
<Country>China</Country>
</Address>
<Tel>
<Home>028-87732901</Home>
<Move>028-81822013</Move>
</Tel>
<E-mail>chendong2000will@sina.com</E-mail>
</form>
在文件XML.fla的第一幀中添加了table0~table17共18個動態(tài)文本,在幀動作面板中添加了如下所示的ActionScript:
stop();
myXML = new XML();
myXML.ignoreWhite = true;
myXML.load("information.xml");
myXML.onLoad = function() {
if (myXML.status == 0) {
t0 = myXML.childNodes[0].childNodes[0].childNodes[0].nodeValue;
t1 = myXML.childNodes[0].childNodes[1].nodeName;
t2 = myXML.childNodes[0].childNodes[1].childNodes[0].childNodes[0].nodeValue;
t3 = myXML.childNodes[0].childNodes[1].childNodes[1].childNodes[0].nodeValue;
t4 = myXML.childNodes[0].childNodes[2].nodeName;
t5 = myXML.childNodes[0].childNodes[2].childNodes[0].nodeValue;
t6 = myXML.childNodes[0].childNodes[3].nodeName;
t7 = myXML.childNodes[0].childNodes[3].childNodes[3].childNodes[0].nodeValue;
t8 = myXML.childNodes[0].childNodes[3].childNodes[2].childNodes[0].nodeValue;
t9 = myXML.childNodes[0].childNodes[3].childNodes[1].childNodes[0].nodeValue;
t10 = myXML.childNodes[0].childNodes[3].childNodes[0].childNodes[0].nodeValue;
t11 = myXML.childNodes[0].childNodes[4].nodeName;
t12 = myXML.childNodes[0].childNodes[4].childNodes[0].nodeName;
t13 = myXML.childNodes[0].childNodes[4].childNodes[0].childNodes[0].nodeValue;
t14 = myXML.childNodes[0].childNodes[4].childNodes[1].nodeName;
t15 = myXML.childNodes[0].childNodes[4].childNodes[1].childNodes[0].nodeValue;
t16 = myXML.childNodes[0].childNodes[5].nodeName;
t17 = myXML.childNodes[0].childNodes[5].childNodes[0].nodeValue;
} else {
gotoAndStop("error");
}
};
第2幀用于顯示XML文檔加載出錯的信息。將第2幀的幀標簽設為error,在其中添加一個按鈕“get more information”,在該按鈕的動作面板中添加如下ActionScript:
on (release) {
gotoAndStop("errorinfor");
switch (myXML.status) {
case -2 :
errorinfor = "A CDATA has no correct ending";
break;
case -3 :
errorinfor = "XML declaration has no correct ending";
break;
case -4 :
errorinfor = "DOCTYPE declaration has no correct ending";
break;
case -5 :
errorinfor = "A comment has no correct ending";
break;
case -6 :
errorinfor = "An XML node has wrong format";
break;
case -7 :
errorinfor = "Memory of computer is not enough";
break;
case -8 :
errorinfor = "An attibute has no correct ending";
break;
case -9 :
errorinfor = "A beginning tag without an ending one";
break;
case -10 :
errorinfor = "An ending tag without a beginnig one";
break;
}
}
將第3幀的幀標簽設為errorinfor,并在第3幀中添加一個名為errorinfor的動態(tài)文本。當單擊“get more information”按鈕時,將在第3幀中顯示相關的出錯信息。
XML文檔無誤時的Flash表單如圖16-3所示。試著改一下XML文檔的內容(以記事本方式打開information.xml進行修改),此時的Flash影片如圖16-4所示。單擊“get more information”,

?

第17章 Flash UI組件

Flash MX中新增了7種內置組件(Flash UI Components),它們是PushButton、CheckBox、RadioButton、ListBox、ComboBox、ScrollPane、ScrollBar。要將這些組件添加到影片中,只需要在組件面板中雙擊相應的組件或在組件上按下鼠標將其拖動到場景中。

17.1 組件面板
選擇“窗口”→“組件”命令或按快捷鍵Ctrl+F7即可打開Flash MX的組件面板,如圖17-1所示。
在組件面板中雙擊組件或是按下鼠標左鍵拖動組件都可以將組件添加到場景中。添加內置組件后,Flash的庫面板中會添加一個名為Flash UI Components的組件夾,如果添加了不止一種組件,它們都將自動保存在這個組件夾中,所以不會給你帶來多大麻煩。
17.2 PushButton
在場景中添加了PushButton后,選中PushButton,它的屬性面板如圖17-3所示。

圖17-3 PushButton的屬性面板
單擊屬性面板右下角的“屬性”按鈕,屬性面板將變成如圖17-4所示。再單擊“參數(shù)”按鈕,屬性面板將切換回原來的狀態(tài)。

圖17-4 單擊“屬性”按鈕后的效果
在屬性面板中PushButton有兩個參數(shù),Label即是PushButton的標簽,即顯示在按鈕上的文字,默認的文字是Push Button。在Label欄單擊,Label后的文本框變成可改寫的,在其中輸入要顯示在按鈕上的文字。Click Handler參數(shù)表示單擊PushButton時要執(zhí)行的函數(shù),該函數(shù)必須與PushButton在同一條時間軸中。即如果PushButton位于主場景中,則它的事件處理函數(shù)應該在主時間軸的關鍵幀中。
在<實例名稱>文本框中可以為PushButton命名,它將作為PushButton的name屬性。單擊PushButton時,name屬性將作為參數(shù)傳遞給Click Handler指定的單擊事件處理函數(shù)。
與用戶創(chuàng)建的按鈕一樣,PushButton也可以使用按鈕的on事件處理函數(shù)。
PushButton的使用方法見PushButton.fla。其中的函數(shù)如下所示:
function PushButtonClick(xbutton) {
trace(xbutton._name);
}
在場景中添加了3個PushButton,將Label分別設為“是”、“否”和“取消”,將Click Handler都設為PushButtonClick,將實例名稱分別設為yes、no和cancel。按Ctrl+Enter鍵測試影片,分別在3個按鈕上單擊,輸出窗口中將相應地顯示yes、no和cancel。

17.3 CheckBox
CheckBox就是我們平常所見的復選框,它有選中和未選中兩種狀態(tài)
CheckBox的Label參數(shù)與PushButton類似,Initial Value參數(shù)是CheckBox的初始狀態(tài),false表示未選中,true表示選中
Label Placement參數(shù)決定Check Box的標簽(Label)位于復選框的左邊還是右邊,它有兩個值right和left,默認為right.
Change Handler參數(shù)與PushButton的Click Handler屬性類似,表示改變CheckBox的狀態(tài)時要調用的事件處理函數(shù),該函數(shù)也必須與CheckBox位于相同的時間軸中。
改變CheckBox的狀態(tài)時,它的實例名稱將作為參數(shù)傳遞給事件處理函數(shù),在編寫腳本時可以利用這個屬性。
CheckBox的使用方法見CheckBox.fla,其中用于CheckBox的事件處理函數(shù)如下所示:
function CheckBoxChange(xCheckBox) {
if (xCheckBox.getValue() == true) {
trace("You like "+xCheckBox._name);
} else {
trace("You dislike "+xCheckBox._name);
}
}
getValue方法用來獲取CheckBox的狀態(tài),CheckBox還有getLabel以及setValue、setLabel等方法,在此不再詳述。
17.4 RadioButton
RadioButton即常說的單選按鈕或單選項,它與CheckBox類似,但是在同一組RadioButton中只能有一個為選中狀態(tài),而一組CheckBox中的任意一個都可以為選中狀態(tài)。
RadioButton的使用方法見RadioButton.fla,其中的函數(shù)如下所示:
function RadioButtonChange(xRadioButton) {
trace("You like "+xRadioButton.getData());
}
17.5 ListBox
ListBox即列表框,使用ListBox可以將多個選項綜合在一個列表框中,從而代替CheckBox和RadioButton行使它們的功能。
選中Labels或Data欄再單擊鼠標,將打開如圖17-11所示的值面板,單擊 和 按鈕可以添加或刪除項目,單擊 和 按鈕可以將項目向下或向下移動。
在值面板中添加完項目后,單擊“確定”按鈕即可。
Select Multiple參數(shù)決定ListBox中的項目是否可以多選,為false時不能多選,相當于一組RadioButton;為true時可以多選,相當于一組CheckBox。
使用getValue方法返回有關列表框中當前選定項的信息。如果該項目沒有指定的Data,則此方法返回該項目的Label;如果該項目有關聯(lián)的Data,則此方法返回該Data。在單選列表框中使用getSelectedItem方法可以將選定的項目作為一個具有Label和Data屬性的對象返回,在多選列表框中使用getSelectedItems方法可以將選定的項目作為一個具有Label和Data屬性的數(shù)組返回。ListBox的使用方法見ListBox.fla。其中的函數(shù)如下所示:
function ListBoxChange(xListBox) {
trace(xListBox.getSelectedItem().Label+":"+xListBox.getSelectedItem().Data);
}
17.6 ComboBox
ComboBox即組合框,也即下拉列表框。既然稱為組合框,ComboBox是由一個文本框和一個列表框組合起來的,平常只顯示文本框,單擊下拉箭頭可以展開列表框,因此它比ListBox要節(jié)省許多空間。
它的第1個參數(shù)Editable,表示ComboBox是否可編輯。當Editable為false時ComboBox中的方框是不可編輯的;當Editable為true時ComboBox中的方框相當于一個輸入文本框,你可以在其中輸入字符,也可以在其下拉列表中進行選擇。
ComboBox的Labels和Data參數(shù)與ListBox類似。Row Count參數(shù)表示ComboBox的下拉列表中可以直接顯示的項數(shù),超過這個項數(shù)就需要使用滾動條查看。默認的Row Count為8,你也可以根據(jù)需要進行修改。
ComboBox的使用方法見ComboBox.fla,其中的函數(shù)如下:
function ComboBoxChange(xComboBox) {
trace(xComboBox.getValue()+":"+xComboBox.getSelectedItem().Data);
}
17.7 ScrollPane
ScrollPane組件包含水平滾動條、垂直滾動條和視圖區(qū)。
ScrollPane最重要的參數(shù)是Scroll Content,它代表視圖區(qū)中要顯示的影片剪輯的鏈接名稱,即在庫面板中元件的鏈接字段中的鏈接標識符。運行影片時,Scroll Content參數(shù)指向的影片剪輯將加載到視圖區(qū)中顯示。
Horizontal Scroll和Vertical Scroll參數(shù)都具有3個可選值:auto、true和false。當值為auto(自動)時,將根據(jù)加載的影片剪輯的實際大小是否超出視圖區(qū)的邊界來決定水平和垂直滾動的條的顯示與否;當值為true時永遠顯示對應的滾動條;當值為false時不顯示滾動條。
Drag Content參數(shù)決定視圖區(qū)中的內容是否可以使用鼠標進行拖動,它有兩個值:true和false。
除了在Scroll Content參數(shù)中指定要加載的影片剪輯外,還可以使用loadScrollContent命令將外部的swf文件加載到ScrollPane的視圖區(qū)中。ScrollPane的使用方法見ScrollPane.fla,其中有兩個ScrollPane,一個使用Scroll Content參數(shù)加載庫中的影片剪輯graphic,另一個使用loadScrollContent命令將外部的pic.swf文件加載到視圖區(qū)中,其腳本如下所示:
myScrollPane.loadScrollContent("pic.swf");

17.8 ScrollBar

ScrollBar即滾動條,它可以添加到動態(tài)文本或輸入文本中。其屬性面板如圖17-17所示。

圖17-17 ScrollBar的屬性面板
Target TextField參數(shù)指定與ScrollBar相組合的動態(tài)文本或輸入文本的實例名稱,將ScrollBar拖動到文本框要添加滾條的邊框一側,Target TextField參數(shù)的值將自動改變成與文本實例的名稱相一致。
Horizontal參數(shù)決定ScrollBar是水平還是垂直的,為false時是垂直滾動條,為true時是水平滾動條。
ScrollBar的使用見ScrollBar.fla。

?

第18章 用ActionScript畫圖

Flash MX ActionScript的繪畫方法位于動作面板的“對象”/“影片”/“MovieClip”/“繪畫方法”目錄下面。使用ActionScript的繪畫方法可以定義線條樣式、畫直線、曲線、對圖形進行填充以及清除所畫圖形等操作。

18.1 動態(tài)創(chuàng)建影片剪輯
由于繪畫方法包含在影片剪輯中,所以在使用繪畫方法前要創(chuàng)建影片剪輯。使用MovieClip的createEmptyMovieClip方法可以動態(tài)地創(chuàng)建影片剪輯,如下所示:
_root.createEmptyMovieClip("MovieClipName", depth);
其中,MovieClipName是創(chuàng)建的影片剪輯實例名,depth是創(chuàng)建的影片剪輯所在的深度級別。
18.2 繪畫方法
18.2.1 lineStyle
MovieClipName.lineStyle ([thickness[,rgb[,alpha]]])
linStyle命令定義將要繪制的線條的樣式,其中,參數(shù)thickness定義線條的粗細,rab參數(shù)定義線條的顏色,alpha參數(shù)定義線條的透明度。如:
lineStyle(0, 0x000000, 100); //定義極細線條,顏色為黑色,不透明
lineStyle(2, 0xFF0000, 50); //定義線條寬度為2,顏色為紅色,透明為50%
定義了線條樣式后即可以使用繪線命令繪制線條,繪制的線條都將保持與lineStyle命令所定義一致的樣式,直到使用新的lineStyle命令為止。
18.2.2 moveTo
MovieClipName.moveTo (x,y)
moveTo命令將當前繪畫位置移到指定的坐標點(x,y)。
moveTo命令一般用于新起一點開始畫線。
18.2.3 lineTo
MovieClipName.lineTo (x,y)
使用當前線條樣式從當前繪畫位置向(x,y)繪制直線;當前繪畫位置隨后被設置為(x,y)。
18.2.4 curveTo
MovieClipName.curveTo (controlX,controlY,anchorX, anchorY)
使用由(controlX,controlY)指定的控制點,以當前的線條樣式繪制從當前繪畫位置到(anchorX,anchorY)的曲線。當前的繪畫位置隨后設置為(anchorX,anchorY)。使用curveTo命令最關鍵的就是控制點的確定。控制點相當于是所繪曲線起始點和終點切線的交點,
18.2.5 beginFill
MovieClipName.beginFill ([rgb[,alpha]])
beginFill命令表示填充的開始,參數(shù)rgb表示要用于填充的顏色,alpha表示透明度。在使用beginFill命令后所繪制的閉合路徑將自動以beginFill命令指定的顏色和顏色進行填充。
18.2.6 beginGradientFill
MovieClipName.beginGradientFill (fillType, colors, alphas, ratios, matrix)
beginGradientFill用于在閉合路徑中填充漸變色,參數(shù)fillType有兩個值:linear表示線性漸變,radial表示放射漸變。colors是一個數(shù)組,包括要在漸變中使用的RGB十六進制顏色值。alphas也是一個數(shù)組,包括與colors數(shù)組中顏色相對應的Alpha值;有效值為0~100。如果該值小于0,則Flash使用0。如果該值大于100,則Flash使用100。ratios是顏色配額的數(shù)組;有效值為0~255。該值按100%定義了對顏色進行采樣處的寬度的百分比。matrix 一個變形矩陣,是帶有下列兩組屬性之一的一個對象:
= a、b、c、d、e、f、g、h、i,它們用于描述下列形式的 3×3 矩陣:
a b c
d e f
g h i
如果matrixType屬性不存在,則其余參數(shù)都是必需的;如果缺少其中任何一個則該函數(shù)會失敗。該矩陣縮放、平移、旋轉和傾斜在(-1,-1)和(1,1)處定義的單位漸變。
= matrixType、x、y、w、h、r。
這些屬性表示下列含義:matrixType 是字符串box、x是相對于該漸變左上角父級剪輯的注冊點的水平位置,y是相對于該漸變左上角父級剪輯的注冊點的垂直位置,w是漸變的寬度,h是漸變的高度,r是漸變的旋轉角度(以弧度為單位)。
18.2.7 endFill
MovieClipName.endFill()
對調用beginFill或beginGradientFill方法以來添加的線條或曲線應用填充。Flash使用的是對beginFill或beginGradientFill的上一次調用中指定的填充。如果當前的繪畫位置不等于moveTo方法中指定的上一個位置,而且定義了填充,則用線條閉合該路徑,然后進行填充。
18.2.8 clear
MovieClipName.clear()
刪除與影片剪輯關聯(lián)的所有繪畫命令。用Flash繪畫工具繪制的形狀和線條不受影響。調用clear方法還會刪除當前的線條樣式。
18.3 練習:全腳本的圖形
使用繪圖方法繪制全腳本的圖形不難,主要是工作量比較大,要求細心。一般來說完全使用ActionScript命令繪制復雜圖形的意義不是很大,作為了解已經(jīng)足夠了。
下面給出文件draw.fla的所有源程序,供你參考。其中主要用到的繪圖方法有l(wèi)ineStyle、moveTo、lineTo和curveTo,沒有用到的方法請自己研究和練習。

_root.createEmptyMovieClip("girl", 1);
with (_root.girl) {
lineStyle(0, 0x000000, 100);
beginFill(0x000000, 100);
moveTo(138, 164);
curveTo(119, 160, 98, 165);
curveTo(120, 155, 138, 164);
moveTo(156, 166);
curveTo(166, 162, 174, 164);
lineTo(174, 161);
curveTo(164, 160, 156, 166);
endFill();
lineStyle(2, 0x000000, 100);
moveTo(133, 178);
curveTo(116, 166, 104, 183);
moveTo(132, 181);
curveTo(116, 169, 104, 184);
moveTo(132, 184);
curveTo(117, 170, 104, 184);
moveTo(128, 193);
curveTo(119, 197, 109, 193);
moveTo(126, 179);
curveTo(130, 191, 121, 195);
moveTo(117, 195);
curveTo(106, 184, 116, 175);
lineStyle(0, 0x000000, 100);
moveTo(115, 179);
curveTo(118, 180, 118, 183);
curveTo(116, 185, 113, 183);
curveTo(114, 190, 119, 191);
curveTo(125, 190, 125, 185);
curveTo(124, 177, 115, 179);
lineStyle(2, 0x000000, 100);
moveTo(151, 185);
curveTo(151, 177, 160, 173);
curveTo(168, 171, 173, 176);
moveTo(154, 180);
curveTo(162, 170, 171, 178);
moveTo(163, 174);
curveTo(170, 175, 170, 182);
moveTo(155, 192);
curveTo(163, 195, 167, 191);
moveTo(160, 175);
curveTo(153, 181, 155, 189);
curveTo(157, 192, 161, 192);
curveTo(171, 188, 163, 176);
lineStyle(0, 0x000000, 100);
moveTo(160, 180);
curveTo(162, 182, 161, 183);
curveTo(159, 184, 158, 182);
curveTo(156, 187, 160, 189);
curveTo(164, 189, 164, 185);
curveTo(164, 180, 160, 180);
lineStyle(2, 0x000000, 100);
moveTo(148, 185);
curveTo(147, 195, 153, 203);
curveTo(147, 207, 147, 209);
moveTo(130, 219);
lineTo(152, 218);
lineStyle(3, 0x000000, 40);
moveTo(133, 225);
lineTo(143, 225);
lineStyle(1, 0x000000, 100);
moveTo(174, 145);
curveTo(176, 157, 175, 172);
curveTo(173, 181, 172, 186);
lineTo(169, 212);
curveTo(169, 217, 164, 224);
lineTo(148, 242);
curveTo(144, 246, 135, 246);
curveTo(112, 242, 96, 230);
moveTo(71, 168);
curveTo(68, 164, 63, 164);
curveTo(58, 164, 55, 172);
curveTo(56, 191, 68, 204);
lineTo(74, 206);
lineStyle(1, 0x000000, 60);
moveTo(70, 174);
curveTo(67, 170, 63, 169);
curveTo(54, 174, 62, 185);
curveTo(68, 200, 72, 192);
moveTo(71, 180);
curveTo(71, 177, 68, 177);
curveTo(65, 177, 65, 180);
curveTo(66, 185, 64, 189);
curveTo(70, 200, 72, 189);
curveTo(67, 184, 71, 181);
lineStyle(1, 0x000000, 60);
moveTo(47, 151);
curveTo(55, 93, 113, 85);
lineTo(115, 87);
lineTo(116, 85);
curveTo(170, 92, 195, 130);
curveTo(207, 158, 194, 164);
curveTo(207, 152, 185, 123);
curveTo(203, 150, 189, 169);
curveTo(193, 150, 186, 138);
curveTo(197, 169, 179, 179);
curveTo(190, 174, 184, 145);
moveTo(176, 127);
curveTo(190, 165, 178, 174);
curveTo(184, 159, 178, 137);
curveTo(182, 156, 173, 169);
curveTo(179, 155, 175, 139);
moveTo(171, 123);
curveTo(181, 153, 164, 167);
curveTo(176, 146, 168, 127);
curveTo(175, 149, 159, 160);
curveTo(171, 141, 166, 129);
moveTo(161, 113);
curveTo(175, 141, 144, 164);
curveTo(161, 151, 161, 128);
moveTo(158, 127);
curveTo(159, 151, 143, 164);
curveTo(157, 147, 155, 119);
curveTo(152, 144, 120, 157);
curveTo(157, 136, 152, 106);
moveTo(150, 115);
curveTo(146, 139, 130, 150);
curveTo(140, 140, 147, 117);
curveTo(132, 149, 113, 153);
moveTo(145, 121);
curveTo(139, 132, 126, 141);
curveTo(116, 154, 97, 160);
moveTo(118, 141);
curveTo(103, 156, 98, 156);
moveTo(118, 141);
curveTo(105, 149, 98, 155);
curveTo(87, 162, 70, 163);
moveTo(101, 156);
curveTo(94, 163, 72, 163);
moveTo(71, 164);
curveTo(72, 222, 105, 318);
moveTo(74, 164);
curveTo(74, 185, 78, 205);
moveTo(77, 164);
curveTo(75, 194, 88, 241);
moveTo(80, 165);
curveTo(90, 245, 101, 292);
moveTo(72, 187);
curveTo(73, 225, 80, 250);
moveTo(82, 165);
curveTo(82, 210, 103, 259);
moveTo(85, 164);
lineTo(84, 193);
moveTo(90, 162);
lineTo(85, 171);
moveTo(95, 162);
lineTo(84, 177);
moveTo(172, 183);
curveTo(180, 247, 187, 263);
curveTo(200, 294, 195, 334);
moveTo(171, 200);
curveTo(174, 230, 182, 258);
moveTo(171, 212);
curveTo(170, 226, 183, 274);
curveTo(196, 314, 190, 331);
moveTo(168, 219);
curveTo(168, 234, 176, 263);
moveTo(165, 224);
lineTo(168, 242);
moveTo(163, 227);
curveTo(161, 251, 184, 296);
moveTo(166, 240);
curveTo(170, 253, 171, 268);
moveTo(173, 261);
curveTo(175, 272, 180, 281);
curveTo(188, 295, 189, 330);
lineStyle(2, 0x000000, 100);
moveTo(68, 165);
lineTo(75, 154);
curveTo(68, 155, 62, 150);
curveTo(60, 150, 55, 154);
lineTo(50, 155);
lineTo(46, 163);
curveTo(49, 163, 50, 161);
curveTo(55, 162, 57, 166);
curveTo(62, 162, 68, 165);
moveTo(47, 159);
lineTo(58, 159);
curveTo(58, 156, 55, 157);
moveTo(44, 154);
lineTo(39, 148);
lineTo(18, 153);
curveTo(20, 160, 14, 167);
lineTo(30, 161);
curveTo(38, 164, 43, 163);
curveTo(40, 156, 44, 154);
moveTo(42, 157);
lineTo(36, 159);
lineTo(30, 157);
moveTo(44, 154);
curveTo(50, 150, 52, 153);
moveTo(44, 164);
curveTo(38, 167, 32, 166);
lineTo(22, 170);
lineTo(14, 170);
lineTo(4, 177);
curveTo(15, 179, 13, 191);
curveTo(22, 173, 43, 166);
curveTo(53, 182, 41, 203);
curveTo(53, 195, 62, 209);
lineTo(61, 196);
moveTo(57, 168);
curveTo(50, 169, 48, 163);
lineStyle(1, 0x000000, 100);
moveTo(31, 171);
curveTo(13, 201, 21, 210);
moveTo(37, 168);
curveTo(15, 204, 24, 214);
moveTo(31, 187);
curveTo(20, 213, 31, 218);
moveTo(35, 195);
curveTo(27, 225, 37, 224);
moveTo(34, 206);
curveTo(35, 224, 40, 222);
moveTo(44, 167);
curveTo(33, 221, 44, 225);
moveTo(41, 209);
curveTo(42, 228, 52, 228);
moveTo(47, 199);
curveTo(43, 228, 57, 227);
moveTo(49, 199);
curveTo(50, 226, 60, 228);
curveTo(71, 227, 66, 202);
moveTo(64, 200);
curveTo(62, 244, 54, 201);
curveTo(61, 240, 60, 204);
lineStyle(2, 0x000000, 100);
moveTo(189, 169);
curveTo(192, 166, 195, 169);
curveTo(199, 174, 206, 176);
curveTo(196, 181, 196, 191);
curveTo(190, 178, 181, 179);
curveTo(188, 182, 188, 186);
curveTo(189, 189, 194, 188);
moveTo(187, 173);
lineTo(193, 175);
moveTo(197, 184);
lineTo(208, 189);
lineTo(204, 193);
curveTo(199, 190, 189, 205);
curveTo(188, 192, 184, 190);
curveTo(182, 189, 182, 183);
curveTo(179, 182, 180, 179);
lineStyle(1, 0x000000, 100);
moveTo(198, 193);
curveTo(207, 207, 193, 216);
moveTo(194, 203);
curveTo(195, 215, 188, 221);
moveTo(189, 204);
curveTo(192, 214, 186, 225);
curveTo(183, 227, 178, 224);
moveTo(180, 181);
curveTo(178, 186, 181, 191);
curveTo(187, 210, 182, 224);
moveTo(177, 181);
curveTo(176, 189, 180, 198);
curveTo(186, 213, 179, 223);
moveTo(181, 202);
curveTo(181, 219, 177, 218);
moveTo(176, 182);
curveTo(178, 199, 174, 205);
lineStyle(2, 0x000000, 100);
moveTo(80, 248);
curveTo(74, 248, 79, 253);
lineTo(79, 259);
lineTo(85, 265);
moveTo(103, 293);
curveTo(113, 319, 123, 335);
moveTo(76, 249);
curveTo(76, 259, 70, 263);
curveTo(84, 271, 90, 283);
moveTo(106, 318);
lineTo(112, 336);
moveTo(69, 263);
curveTo(29, 284, 29, 295);
curveTo(18, 331, 16, 372);
curveTo(33, 377, 55, 374);
curveTo(56, 369, 68, 369);
curveTo(73, 375, 65, 377);
moveTo(47, 292);
curveTo(56, 312, 69, 329);
curveTo(63, 334, 63, 340);
moveTo(57, 312);
curveTo(60, 339, 69, 356);
lineTo(67, 358);
moveTo(65, 353);
lineTo(69, 370);
lineStyle(1, 0x000000, 100);
moveTo(18, 363);
curveTo(40, 367, 48, 365);
curveTo(55, 359, 66, 360);
moveTo(19, 374);
curveTo(18, 387, 20, 400);
moveTo(64, 370);
curveTo(65, 388, 67, 400);
moveTo(83, 255);
curveTo(83, 260, 80, 261);
moveTo(137, 248);
curveTo(137, 259, 139, 269);
moveTo(138, 263);
curveTo(142, 267, 148, 268);
lineStyle(2, 0x000000, 100);
moveTo(138, 254);
curveTo(156, 263, 157, 310);
curveTo(161, 327, 162, 335);
moveTo(141, 258);
curveTo(156, 270, 173, 273);
moveTo(159, 269);
curveTo(168, 289, 166, 314);
curveTo(167, 328, 169, 336);
moveTo(193, 287);
lineTo(202, 298);
curveTo(208, 336, 222, 365);
lineTo(215, 373);
lineTo(213, 374);
lineTo(195, 371);
moveTo(186, 307);
curveTo(181, 333, 185, 337);
lineTo(186, 342);
moveTo(63, 344);
curveTo(72, 338, 84, 337);
curveTo(103, 338, 140, 335);
curveTo(170, 335, 190, 347);
lineTo(187, 353);
moveTo(183, 346);
curveTo(205, 368, 185, 396);
lineStyle(1, 0x000000, 100);
moveTo(213, 373);
lineTo(213, 400);
moveTo(136, 329);
curveTo(136, 331, 139, 335);
lineStyle(2, 0x000000, 20);
moveTo(131, 324);
curveTo(132, 325, 136, 329);
moveTo(139, 324);
curveTo(138, 325, 136, 329);
lineStyle(4, 0x000000, 10);
moveTo(131, 284);
curveTo(141, 280, 151, 282);
moveTo(119, 284);
curveTo(109, 280, 100, 284);
moveTo(123, 280);
curveTo(126, 282, 128, 279);
lineStyle(7, 0x000000, 10);
moveTo(79, 343);
curveTo(90, 339, 101, 341);
lineTo(155, 341);
curveTo(167, 339, 184, 349);
moveTo(72, 396);
curveTo(128, 389, 180, 397);
lineStyle(2, 0x000000, 20);
moveTo(132, 93);
curveTo(144, 95, 152, 105);
}

總結

以上是生活随笔為你收集整理的ActionScript菜鸟教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

无码国模国产在线观看 | 亚洲国产成人a精品不卡在线 | 国产成人精品久久亚洲高清不卡 | 精品国精品国产自在久国产87 | 精品无码成人片一区二区98 | 国产一区二区三区精品视频 | 精品国产青草久久久久福利 | 日韩精品成人一区二区三区 | 色婷婷综合中文久久一本 | 欧美午夜特黄aaaaaa片 | 无码播放一区二区三区 | 亚洲爆乳大丰满无码专区 | 免费人成在线视频无码 | 免费看少妇作爱视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 2019午夜福利不卡片在线 | 久久视频在线观看精品 | 2020久久香蕉国产线看观看 | 成人精品视频一区二区三区尤物 | 88国产精品欧美一区二区三区 | 亚洲国产欧美在线成人 | 老子影院午夜精品无码 | 97久久国产亚洲精品超碰热 | 国产激情一区二区三区 | 国产sm调教视频在线观看 | 久久亚洲日韩精品一区二区三区 | 国产精品美女久久久网av | 国产极品美女高潮无套在线观看 | 搡女人真爽免费视频大全 | 国产无套粉嫩白浆在线 | 精品水蜜桃久久久久久久 | 无码精品人妻一区二区三区av | 色婷婷综合激情综在线播放 | 波多野结衣aⅴ在线 | 国产午夜无码视频在线观看 | 18无码粉嫩小泬无套在线观看 | 欧美人与善在线com | 日本va欧美va欧美va精品 | 国产精品第一国产精品 | 日日碰狠狠丁香久燥 | 久久99精品久久久久婷婷 | 精品夜夜澡人妻无码av蜜桃 | 激情内射亚州一区二区三区爱妻 | 亚洲第一网站男人都懂 | 亚洲综合色区中文字幕 | 中文字幕乱码人妻二区三区 | 精品国产精品久久一区免费式 | 精品夜夜澡人妻无码av蜜桃 | 日产精品99久久久久久 | 国产精品久久久久久亚洲影视内衣 | 久久亚洲中文字幕无码 | 亚洲va中文字幕无码久久不卡 | 人人爽人人澡人人高潮 | 少妇高潮喷潮久久久影院 | 国产精品二区一区二区aⅴ污介绍 | 午夜男女很黄的视频 | 日日摸天天摸爽爽狠狠97 | 国产精品亚洲五月天高清 | 激情国产av做激情国产爱 | 欧美喷潮久久久xxxxx | 成人毛片一区二区 | 亚洲第一无码av无码专区 | 亚洲а∨天堂久久精品2021 | 国产肉丝袜在线观看 | 人人妻在人人 | 欧美三级不卡在线观看 | 成年女人永久免费看片 | 成人aaa片一区国产精品 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲精品一区二区三区婷婷月 | 99国产精品白浆在线观看免费 | 久久综合色之久久综合 | 亚洲精品国产第一综合99久久 | 成人性做爰aaa片免费看不忠 | 国产精品99爱免费视频 | 亚洲一区二区三区播放 | 欧美性色19p | 麻豆蜜桃av蜜臀av色欲av | 99久久久无码国产aaa精品 | 亚洲精品一区三区三区在线观看 | 国产亚洲人成在线播放 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲の无码国产の无码步美 | 女人被男人躁得好爽免费视频 | 国产免费久久久久久无码 | 人妻少妇精品久久 | 国精产品一品二品国精品69xx | 秋霞特色aa大片 | 一本精品99久久精品77 | 在线精品国产一区二区三区 | 国产成人精品一区二区在线小狼 | 亚洲色无码一区二区三区 | 中文字幕色婷婷在线视频 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲综合无码一区二区三区 | 成人av无码一区二区三区 | 国产无av码在线观看 | 国产激情艳情在线看视频 | 国产综合在线观看 | 欧洲美熟女乱又伦 | 波多野结衣乳巨码无在线观看 | 熟女俱乐部五十路六十路av | 在线成人www免费观看视频 | 午夜嘿嘿嘿影院 | 日本xxxx色视频在线观看免费 | 亚洲国产欧美在线成人 | 亚洲日本一区二区三区在线 | 伊人久久大香线蕉午夜 | 色情久久久av熟女人妻网站 | www国产精品内射老师 | 国产av一区二区三区最新精品 | 67194成是人免费无码 | 国产在线精品一区二区三区直播 | 影音先锋中文字幕无码 | 国产69精品久久久久app下载 | 国产性生交xxxxx无码 | 亚洲无人区午夜福利码高清完整版 | 国产无遮挡吃胸膜奶免费看 | 国产精品第一国产精品 | 国产亚洲精品久久久久久大师 | 未满小14洗澡无码视频网站 | 波多野结衣aⅴ在线 | 精品少妇爆乳无码av无码专区 | 久久国产精品精品国产色婷婷 | 国色天香社区在线视频 | 亚洲 欧美 激情 小说 另类 | 欧美一区二区三区视频在线观看 | 国产99久久精品一区二区 | 久久无码中文字幕免费影院蜜桃 | 国产乱码精品一品二品 | 日韩成人一区二区三区在线观看 | 精品人妻中文字幕有码在线 | av无码久久久久不卡免费网站 | 久久亚洲中文字幕精品一区 | 国内精品久久久久久中文字幕 | 国产精华av午夜在线观看 | 亚洲成av人在线观看网址 | www一区二区www免费 | 精品无码一区二区三区的天堂 | 久久精品一区二区三区四区 | 日日碰狠狠躁久久躁蜜桃 | 亚洲中文字幕无码中文字在线 | 国产网红无码精品视频 | 无码帝国www无码专区色综合 | 对白脏话肉麻粗话av | 99久久精品日本一区二区免费 | 国产精品久久精品三级 | 少妇激情av一区二区 | 欧美xxxx黑人又粗又长 | 欧美精品无码一区二区三区 | 激情亚洲一区国产精品 | 老熟女重囗味hdxx69 | 爆乳一区二区三区无码 | 亚洲第一网站男人都懂 | 午夜福利一区二区三区在线观看 | 国产内射爽爽大片视频社区在线 | 日日噜噜噜噜夜夜爽亚洲精品 | 乱码av麻豆丝袜熟女系列 | 一本久久a久久精品亚洲 | 亚洲男人av香蕉爽爽爽爽 | 国产精品99久久精品爆乳 | 两性色午夜免费视频 | 精品无码成人片一区二区98 | 亚洲欧美综合区丁香五月小说 | 久久综合香蕉国产蜜臀av | 欧美日韩人成综合在线播放 | 人妻与老人中文字幕 | 图片小说视频一区二区 | 欧美国产亚洲日韩在线二区 | 国产人妻久久精品二区三区老狼 | 精品一区二区三区波多野结衣 | 少妇高潮喷潮久久久影院 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产香蕉尹人综合在线观看 | 老熟女乱子伦 | 日本乱偷人妻中文字幕 | 97久久超碰中文字幕 | 免费观看黄网站 | 在线视频网站www色 | 精品无人区无码乱码毛片国产 | 日本精品少妇一区二区三区 | 三上悠亚人妻中文字幕在线 | 国产在热线精品视频 | 亚洲一区二区三区含羞草 | 午夜精品久久久内射近拍高清 | 欧美性生交活xxxxxdddd | 亚洲精品综合一区二区三区在线 | 丰满人妻一区二区三区免费视频 | 又大又黄又粗又爽的免费视频 | 精品人妻人人做人人爽 | 一本久道高清无码视频 | 久久亚洲精品中文字幕无男同 | av无码久久久久不卡免费网站 | 欧美精品免费观看二区 | 日韩在线不卡免费视频一区 | 国产va免费精品观看 | 暴力强奷在线播放无码 | 日日摸天天摸爽爽狠狠97 | 宝宝好涨水快流出来免费视频 | 国产特级毛片aaaaaa高潮流水 | 欧美刺激性大交 | 夜先锋av资源网站 | 中文字幕乱码中文乱码51精品 | 无码人妻av免费一区二区三区 | 大肉大捧一进一出好爽视频 | 国产内射爽爽大片视频社区在线 | 国产午夜精品一区二区三区嫩草 | 少女韩国电视剧在线观看完整 | 精品无人国产偷自产在线 | 人妻无码αv中文字幕久久琪琪布 | 中文字幕乱码中文乱码51精品 | 色欲av亚洲一区无码少妇 | 又粗又大又硬又长又爽 | 97久久超碰中文字幕 | 亚洲天堂2017无码 | 久久久婷婷五月亚洲97号色 | 97人妻精品一区二区三区 | 任你躁国产自任一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 亚无码乱人伦一区二区 | 亚洲男人av香蕉爽爽爽爽 | 日本成熟视频免费视频 | 丰满人妻精品国产99aⅴ | 免费观看激色视频网站 | 国产亚洲人成a在线v网站 | 成人亚洲精品久久久久软件 | 国产激情艳情在线看视频 | 国产成人一区二区三区别 | 少妇愉情理伦片bd | 精品国产av色一区二区深夜久久 | 国产人妻精品一区二区三区不卡 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲熟妇自偷自拍另类 | 免费网站看v片在线18禁无码 | 国精产品一品二品国精品69xx | 日本精品人妻无码77777 天堂一区人妻无码 | 久久国产精品二国产精品 | 国产内射老熟女aaaa | 性色av无码免费一区二区三区 | 一二三四在线观看免费视频 | 男人的天堂2018无码 | 国语精品一区二区三区 | 天堂一区人妻无码 | 荫蒂被男人添的好舒服爽免费视频 | 国产无套内射久久久国产 | 国产精品国产自线拍免费软件 | 丝袜人妻一区二区三区 | 国产精品爱久久久久久久 | 亚洲a无码综合a国产av中文 | 色婷婷av一区二区三区之红樱桃 | 无码帝国www无码专区色综合 | 中文无码伦av中文字幕 | 无码人妻精品一区二区三区下载 | 国产亚洲精品精品国产亚洲综合 | 欧美 日韩 人妻 高清 中文 | 日本肉体xxxx裸交 | 性啪啪chinese东北女人 | 色一情一乱一伦一视频免费看 | 无码成人精品区在线观看 | 欧美 日韩 人妻 高清 中文 | 国产精品久久久久久亚洲毛片 | 131美女爱做视频 | 亚洲国产精品毛片av不卡在线 | 欧美国产日产一区二区 | 亚洲综合另类小说色区 | 男女超爽视频免费播放 | 人妻aⅴ无码一区二区三区 | 亚洲一区二区三区国产精华液 | 精品无码av一区二区三区 | 精品厕所偷拍各类美女tp嘘嘘 | 全黄性性激高免费视频 | 亚洲色成人中文字幕网站 | 国产明星裸体无码xxxx视频 | 爱做久久久久久 | 亚洲乱码中文字幕在线 | 日韩视频 中文字幕 视频一区 | 欧美成人高清在线播放 | 国产超级va在线观看视频 | 亚洲区欧美区综合区自拍区 | 日韩精品一区二区av在线 | 午夜性刺激在线视频免费 | 老司机亚洲精品影院 | 国产精品亚洲а∨无码播放麻豆 | 欧美freesex黑人又粗又大 | 性色欲情网站iwww九文堂 | 久久国产自偷自偷免费一区调 | 日本精品久久久久中文字幕 | 国内精品人妻无码久久久影院蜜桃 | 黑人粗大猛烈进出高潮视频 | 国产精品久久久一区二区三区 | 久久久久亚洲精品男人的天堂 | 亚洲日韩精品欧美一区二区 | 人妻天天爽夜夜爽一区二区 | 国产精品第一国产精品 | 久久亚洲日韩精品一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 日本精品人妻无码免费大全 | 色婷婷欧美在线播放内射 | 亚洲小说图区综合在线 | 久久久久久九九精品久 | 国产精品资源一区二区 | 日本一区二区三区免费高清 | 亚洲精品国偷拍自产在线观看蜜桃 | 香蕉久久久久久av成人 | 久久精品国产99精品亚洲 | 亚洲国产午夜精品理论片 | 久久天天躁夜夜躁狠狠 | 国产精品.xx视频.xxtv | 欧美猛少妇色xxxxx | 成在人线av无码免观看麻豆 | 国产超级va在线观看视频 | 蜜桃av抽搐高潮一区二区 | 久久久国产一区二区三区 | 午夜性刺激在线视频免费 | 麻豆蜜桃av蜜臀av色欲av | 国产成人无码午夜视频在线观看 | 成人亚洲精品久久久久 | 亚洲成a人片在线观看日本 | 全球成人中文在线 | 免费看男女做好爽好硬视频 | 免费观看的无遮挡av | 秋霞成人午夜鲁丝一区二区三区 | 大肉大捧一进一出好爽视频 | 色五月丁香五月综合五月 | 亚洲天堂2017无码 | 美女黄网站人色视频免费国产 | 亚洲熟妇色xxxxx亚洲 | av香港经典三级级 在线 | 国产无遮挡又黄又爽又色 | 亚洲色偷偷男人的天堂 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品成人av在线观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 久久久久免费看成人影片 | 婷婷五月综合激情中文字幕 | 久久久久久久久888 | 男女猛烈xx00免费视频试看 | 大地资源网第二页免费观看 | 综合网日日天干夜夜久久 | 午夜熟女插插xx免费视频 | 台湾无码一区二区 | 久久精品人人做人人综合试看 | 无遮无挡爽爽免费视频 | 激情内射亚州一区二区三区爱妻 | 免费中文字幕日韩欧美 | 国产精品18久久久久久麻辣 | 成人动漫在线观看 | 九九在线中文字幕无码 | av小次郎收藏 | 无码精品人妻一区二区三区av | 欧洲欧美人成视频在线 | 久久人人爽人人爽人人片ⅴ | 成人亚洲精品久久久久 | 日日夜夜撸啊撸 | 无套内谢老熟女 | 正在播放老肥熟妇露脸 | 国产一区二区三区精品视频 | 久久久久久亚洲精品a片成人 | 国产又爽又猛又粗的视频a片 | 亚洲精品国产a久久久久久 | 久久五月精品中文字幕 | 久久国产36精品色熟妇 | 日韩人妻少妇一区二区三区 | 午夜福利不卡在线视频 | 又大又硬又爽免费视频 | 久久久亚洲欧洲日产国码αv | 国产精品第一国产精品 | 久久熟妇人妻午夜寂寞影院 | 波多野结衣aⅴ在线 | 久久综合香蕉国产蜜臀av | 中文亚洲成a人片在线观看 | 日本在线高清不卡免费播放 | 青青青手机频在线观看 | 野狼第一精品社区 | 国产 精品 自在自线 | 国产麻豆精品一区二区三区v视界 | 亚洲精品一区三区三区在线观看 | 国产激情一区二区三区 | 国产激情一区二区三区 | 亚洲 高清 成人 动漫 | 丰满人妻精品国产99aⅴ | 国内精品一区二区三区不卡 | 精品欧洲av无码一区二区三区 | 精品亚洲成av人在线观看 | 色一情一乱一伦一视频免费看 | 网友自拍区视频精品 | 蜜桃av抽搐高潮一区二区 | 伊人久久大香线焦av综合影院 | 图片小说视频一区二区 | 成人精品视频一区二区 | 色欲久久久天天天综合网精品 | 国精产品一区二区三区 | 亚洲熟熟妇xxxx | 性欧美牲交xxxxx视频 | 狠狠色丁香久久婷婷综合五月 | 男女爱爱好爽视频免费看 | 无码国产乱人伦偷精品视频 | 一本精品99久久精品77 | 久久无码人妻影院 | 亚洲日韩精品欧美一区二区 | 牲欲强的熟妇农村老妇女视频 | 98国产精品综合一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 夜先锋av资源网站 | 亚洲精品国产品国语在线观看 | 99riav国产精品视频 | 美女张开腿让人桶 | 国产亚洲人成a在线v网站 | 网友自拍区视频精品 | 亚洲一区二区三区香蕉 | 亚洲熟悉妇女xxx妇女av | 亚洲综合另类小说色区 | 国产香蕉尹人视频在线 | 99久久久无码国产aaa精品 | 伊人久久大香线焦av综合影院 | 国产成人无码一二三区视频 | 久久久无码中文字幕久... | 久久久久久a亚洲欧洲av冫 | 精品国产福利一区二区 | 久久午夜无码鲁丝片 | 最新版天堂资源中文官网 | 久久99久久99精品中文字幕 | 久久精品一区二区三区四区 | 乌克兰少妇xxxx做受 | 国内精品一区二区三区不卡 | 18黄暴禁片在线观看 | 日本大乳高潮视频在线观看 | www成人国产高清内射 | 国模大胆一区二区三区 | 久久午夜无码鲁丝片午夜精品 | 大屁股大乳丰满人妻 | 纯爱无遮挡h肉动漫在线播放 | av在线亚洲欧洲日产一区二区 | 纯爱无遮挡h肉动漫在线播放 | 未满小14洗澡无码视频网站 | 波多野结衣高清一区二区三区 | 国产高清av在线播放 | 四虎4hu永久免费 | 久久成人a毛片免费观看网站 | 国产一区二区不卡老阿姨 | 国产特级毛片aaaaaa高潮流水 | 99久久精品无码一区二区毛片 | 精品久久综合1区2区3区激情 | 啦啦啦www在线观看免费视频 | www国产精品内射老师 | 丝袜 中出 制服 人妻 美腿 | 强辱丰满人妻hd中文字幕 | 午夜无码人妻av大片色欲 | 国产亚洲精品久久久久久国模美 | 国产综合色产在线精品 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 97精品人妻一区二区三区香蕉 | 亚洲色偷偷男人的天堂 | 最近的中文字幕在线看视频 | 午夜福利试看120秒体验区 | 乌克兰少妇xxxx做受 | 国产成人无码av片在线观看不卡 | 国产内射老熟女aaaa | 东京热无码av男人的天堂 | 强伦人妻一区二区三区视频18 | 国产乱子伦视频在线播放 | 亚洲国产精品无码久久久久高潮 | 欧美丰满熟妇xxxx | 又黄又爽又色的视频 | 亚洲欧美日韩国产精品一区二区 | 日本一本二本三区免费 | 精品国产福利一区二区 | 亚洲国产精品毛片av不卡在线 | 亚洲欧美中文字幕5发布 | 国产精品永久免费视频 | 国产综合久久久久鬼色 | 狂野欧美激情性xxxx | 特级做a爰片毛片免费69 | 国产色xx群视频射精 | 久久久久av无码免费网 | 国产三级久久久精品麻豆三级 | 一二三四社区在线中文视频 | 在教室伦流澡到高潮hnp视频 | 欧洲欧美人成视频在线 | 在线成人www免费观看视频 | 成人欧美一区二区三区黑人免费 | 丰满少妇女裸体bbw | 久久久久久国产精品无码下载 | 永久免费观看美女裸体的网站 | 中文字幕久久久久人妻 | 粉嫩少妇内射浓精videos | 熟女体下毛毛黑森林 | 99久久精品国产一区二区蜜芽 | 国产乡下妇女做爰 | 亚洲熟熟妇xxxx | 中文字幕日产无线码一区 | 国产真实伦对白全集 | 青草青草久热国产精品 | 国产艳妇av在线观看果冻传媒 | 久久亚洲精品中文字幕无男同 | 亚洲国产精品一区二区第一页 | 欧美丰满老熟妇xxxxx性 | 永久黄网站色视频免费直播 | 亚洲成a人片在线观看无码 | 欧美性生交活xxxxxdddd | 欧美怡红院免费全部视频 | 动漫av一区二区在线观看 | 亚洲国产精品无码久久久久高潮 | 日本饥渴人妻欲求不满 | 中文字幕无码av波多野吉衣 | 2019nv天堂香蕉在线观看 | 欧美性猛交内射兽交老熟妇 | 少妇厨房愉情理9仑片视频 | 国产成人无码午夜视频在线观看 | 1000部夫妻午夜免费 | 日韩精品一区二区av在线 | 国产免费久久精品国产传媒 | 久久人妻内射无码一区三区 | 久久精品丝袜高跟鞋 | 欧美肥老太牲交大战 | 亚洲狠狠婷婷综合久久 | 少妇愉情理伦片bd | 一二三四社区在线中文视频 | 精品欧洲av无码一区二区三区 | 亚洲狠狠色丁香婷婷综合 | 亚洲娇小与黑人巨大交 | 成人性做爰aaa片免费看 | 成人三级无码视频在线观看 | 一本色道久久综合狠狠躁 | 欧美怡红院免费全部视频 | 亚洲欧美日韩综合久久久 | 亚洲中文字幕成人无码 | 人妻少妇被猛烈进入中文字幕 | 亚洲中文字幕无码中文字在线 | 2020久久香蕉国产线看观看 | 任你躁国产自任一区二区三区 | 色五月丁香五月综合五月 | 国内精品一区二区三区不卡 | 国内揄拍国内精品少妇国语 | 国产在线无码精品电影网 | 人人爽人人爽人人片av亚洲 | 国产做国产爱免费视频 | 成人无码精品一区二区三区 | 成年美女黄网站色大免费全看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 综合激情五月综合激情五月激情1 | 亚洲aⅴ无码成人网站国产app | 国产精品手机免费 | 欧美精品无码一区二区三区 | 亚洲成a人片在线观看日本 | 中文字幕无码av波多野吉衣 | 国产福利视频一区二区 | 亚洲日韩av一区二区三区四区 | 欧美日韩视频无码一区二区三 | 亲嘴扒胸摸屁股激烈网站 | 波多野结衣高清一区二区三区 | 久久99精品久久久久久动态图 | 狠狠亚洲超碰狼人久久 | 国产99久久精品一区二区 | 国产激情一区二区三区 | 日韩视频 中文字幕 视频一区 | 97精品国产97久久久久久免费 | 中文无码成人免费视频在线观看 | 无码精品人妻一区二区三区av | 一本久道久久综合狠狠爱 | 欧美一区二区三区 | 麻豆成人精品国产免费 | 亚洲天堂2017无码中文 | 久热国产vs视频在线观看 | 狂野欧美激情性xxxx | 精品久久久中文字幕人妻 | 亚洲一区二区三区偷拍女厕 | 国产卡一卡二卡三 | 成人无码精品一区二区三区 | 国产亚洲人成a在线v网站 | 无码人妻出轨黑人中文字幕 | 成人精品视频一区二区 | 久青草影院在线观看国产 | 精品人人妻人人澡人人爽人人 | 久久无码中文字幕免费影院蜜桃 | 精品久久久无码中文字幕 | 日日噜噜噜噜夜夜爽亚洲精品 | aa片在线观看视频在线播放 | 精品熟女少妇av免费观看 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲啪av永久无码精品放毛片 | 国产日产欧产精品精品app | 又色又爽又黄的美女裸体网站 | 亚洲综合久久一区二区 | 久久天天躁狠狠躁夜夜免费观看 | 又粗又大又硬毛片免费看 | 波多野结衣av一区二区全免费观看 | 日日橹狠狠爱欧美视频 | 女高中生第一次破苞av | 九九久久精品国产免费看小说 | 精品人妻人人做人人爽夜夜爽 | 国产女主播喷水视频在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 婷婷五月综合激情中文字幕 | 国产电影无码午夜在线播放 | 中文精品久久久久人妻不卡 | 国产在线精品一区二区高清不卡 | 欧美成人免费全部网站 | 亚洲呦女专区 | 欧美亚洲国产一区二区三区 | 欧美激情内射喷水高潮 | 久久国产自偷自偷免费一区调 | 午夜熟女插插xx免费视频 | 伊人久久大香线蕉av一区二区 | 97无码免费人妻超级碰碰夜夜 | 亚洲中文字幕无码一久久区 | 亚洲国产综合无码一区 | 丝袜人妻一区二区三区 | 四十如虎的丰满熟妇啪啪 | 国产两女互慰高潮视频在线观看 | 成人无码精品一区二区三区 | 亚洲成色www久久网站 | 日本大乳高潮视频在线观看 | 亚洲人亚洲人成电影网站色 | 中文字幕乱码亚洲无线三区 | 国内精品人妻无码久久久影院蜜桃 | 日日干夜夜干 | 国产av无码专区亚洲a∨毛片 | 99re在线播放 | 又大又黄又粗又爽的免费视频 | 丰满少妇女裸体bbw | 久久精品人人做人人综合试看 | 国产精品久久久久9999小说 | а√资源新版在线天堂 | 免费网站看v片在线18禁无码 | 精品aⅴ一区二区三区 | 人妻互换免费中文字幕 | 日本精品高清一区二区 | 天堂亚洲2017在线观看 | 亚洲阿v天堂在线 | 日本高清一区免费中文视频 | 最新国产麻豆aⅴ精品无码 | 日本精品久久久久中文字幕 | 日本一卡二卡不卡视频查询 | 正在播放老肥熟妇露脸 | 午夜精品久久久久久久 | av无码不卡在线观看免费 | 领导边摸边吃奶边做爽在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 999久久久国产精品消防器材 | 兔费看少妇性l交大片免费 | 小泽玛莉亚一区二区视频在线 | 免费国产黄网站在线观看 | 无码人妻少妇伦在线电影 | 色欲人妻aaaaaaa无码 | 国产午夜福利100集发布 | 精品成人av一区二区三区 | 中文字幕乱码亚洲无线三区 | 日韩精品一区二区av在线 | 欧美 日韩 人妻 高清 中文 | 欧美丰满熟妇xxxx性ppx人交 | 国产午夜精品一区二区三区嫩草 | 国产成人精品三级麻豆 | 精品偷拍一区二区三区在线看 | 中文字幕色婷婷在线视频 | 亚洲综合色区中文字幕 | 久久婷婷五月综合色国产香蕉 | 亚洲色无码一区二区三区 | 欧美黑人巨大xxxxx | 在线精品国产一区二区三区 | 又大又紧又粉嫩18p少妇 | 精品日本一区二区三区在线观看 | 美女张开腿让人桶 | 欧美性黑人极品hd | 亚洲热妇无码av在线播放 | 亚洲国产日韩a在线播放 | 日本护士毛茸茸高潮 | 日韩精品无码一区二区中文字幕 | 亚洲阿v天堂在线 | 国产xxx69麻豆国语对白 | 夜夜夜高潮夜夜爽夜夜爰爰 | 成熟妇人a片免费看网站 | 成人精品视频一区二区 | 欧美35页视频在线观看 | 1000部啪啪未满十八勿入下载 | 永久免费观看国产裸体美女 | 熟妇人妻中文av无码 | 国产9 9在线 | 中文 | 国产激情无码一区二区app | 亚洲国产午夜精品理论片 | 蜜桃臀无码内射一区二区三区 | 中文字幕精品av一区二区五区 | 99久久99久久免费精品蜜桃 | 天堂无码人妻精品一区二区三区 | 国产97在线 | 亚洲 | 妺妺窝人体色www婷婷 | 国产成人综合美国十次 | 日本肉体xxxx裸交 | 国产美女极度色诱视频www | 国产香蕉尹人综合在线观看 | 精品国偷自产在线 | 欧美黑人巨大xxxxx | 国产精品无码成人午夜电影 | 亚洲国产精品成人久久蜜臀 | 丝袜美腿亚洲一区二区 | 精品人妻人人做人人爽夜夜爽 | 欧美 丝袜 自拍 制服 另类 | 国产成人精品无码播放 | 国产精品内射视频免费 | 内射巨臀欧美在线视频 | 国产人妻人伦精品1国产丝袜 | 大地资源中文第3页 | 日日摸天天摸爽爽狠狠97 | 妺妺窝人体色www婷婷 | 亚洲国产一区二区三区在线观看 | 麻豆蜜桃av蜜臀av色欲av | 蜜桃视频插满18在线观看 | 国产熟妇另类久久久久 | 日日躁夜夜躁狠狠躁 | 日本免费一区二区三区最新 | 国内精品久久毛片一区二区 | 色情久久久av熟女人妻网站 | 天堂а√在线中文在线 | 亚洲午夜久久久影院 | 成人精品视频一区二区 | 伊人久久婷婷五月综合97色 | 欧美肥老太牲交大战 | 在教室伦流澡到高潮hnp视频 | 久久午夜夜伦鲁鲁片无码免费 | 国产农村乱对白刺激视频 | 久久久久久久人妻无码中文字幕爆 | 人妻少妇被猛烈进入中文字幕 | 纯爱无遮挡h肉动漫在线播放 | 亚洲乱码国产乱码精品精 | 日本高清一区免费中文视频 | 日韩人妻少妇一区二区三区 | 黄网在线观看免费网站 | 亚洲色www成人永久网址 | 粗大的内捧猛烈进出视频 | 国产精品视频免费播放 | 国产乱人无码伦av在线a | 中文字幕无码日韩专区 | 国产在线精品一区二区三区直播 | 狠狠色丁香久久婷婷综合五月 | 99er热精品视频 | 成年女人永久免费看片 | 在线观看欧美一区二区三区 | 丰满人妻被黑人猛烈进入 | 好屌草这里只有精品 | 一本加勒比波多野结衣 | 久久精品国产99久久6动漫 | 国产精品视频免费播放 | 久久久无码中文字幕久... | 精品无码国产自产拍在线观看蜜 | 激情五月综合色婷婷一区二区 | 国产午夜亚洲精品不卡下载 | 麻豆国产丝袜白领秘书在线观看 | 亚洲一区二区三区在线观看网站 | 国产亚洲精品久久久久久大师 | 又大又黄又粗又爽的免费视频 | 大肉大捧一进一出视频出来呀 | 久久精品女人天堂av免费观看 | 亚洲中文字幕成人无码 | 亚洲の无码国产の无码影院 | 老熟妇乱子伦牲交视频 | 亚洲人成人无码网www国产 | 天干天干啦夜天干天2017 | 欧美日韩综合一区二区三区 | 亚洲自偷精品视频自拍 | 夜夜高潮次次欢爽av女 | 极品尤物被啪到呻吟喷水 | 午夜免费福利小电影 | 亚洲一区二区三区四区 | 日本精品人妻无码77777 天堂一区人妻无码 | 宝宝好涨水快流出来免费视频 | 性啪啪chinese东北女人 | 老熟妇仑乱视频一区二区 | 一本加勒比波多野结衣 | 国产真实伦对白全集 | 中文字幕av日韩精品一区二区 | 亚洲爆乳大丰满无码专区 | 国产国产精品人在线视 | 色一情一乱一伦 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲午夜福利在线观看 | 97精品人妻一区二区三区香蕉 | 97无码免费人妻超级碰碰夜夜 | 国产又粗又硬又大爽黄老大爷视 | 久久精品成人欧美大片 | 99国产精品白浆在线观看免费 | 无遮挡啪啪摇乳动态图 | 欧美人与物videos另类 | 亚洲色www成人永久网址 | 亚洲日韩av片在线观看 | 人人妻人人澡人人爽欧美精品 | 一本大道久久东京热无码av | 窝窝午夜理论片影院 | 国产内射爽爽大片视频社区在线 | 久久久精品成人免费观看 | 未满小14洗澡无码视频网站 | 亚洲一区二区三区四区 | 对白脏话肉麻粗话av | 中文字幕人妻丝袜二区 | 久久久久成人精品免费播放动漫 | 中文字幕乱码中文乱码51精品 | 国产成人人人97超碰超爽8 | 国产猛烈高潮尖叫视频免费 | 欧美肥老太牲交大战 | 伊人久久大香线蕉午夜 | 久久亚洲精品成人无码 | 免费人成网站视频在线观看 | 日日碰狠狠躁久久躁蜜桃 | 18精品久久久无码午夜福利 | 少妇久久久久久人妻无码 | 伊人久久婷婷五月综合97色 | 日韩精品一区二区av在线 | 国产熟女一区二区三区四区五区 | 国产人妻人伦精品 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 成熟妇人a片免费看网站 | 在线精品国产一区二区三区 | 国产熟妇另类久久久久 | 高清国产亚洲精品自在久久 | 亚洲成av人片在线观看无码不卡 | 久久99精品久久久久久 | 久久久久国色av免费观看性色 | 欧美性猛交内射兽交老熟妇 | 久久99精品国产.久久久久 | 国产色精品久久人妻 | 国产在热线精品视频 | 欧美日韩在线亚洲综合国产人 | 国产亚洲tv在线观看 | 婷婷丁香六月激情综合啪 | 国内精品人妻无码久久久影院 | 在教室伦流澡到高潮hnp视频 | 午夜男女很黄的视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲第一无码av无码专区 | 久久亚洲精品成人无码 | 日日鲁鲁鲁夜夜爽爽狠狠 | 无码国产色欲xxxxx视频 | 成人免费无码大片a毛片 | 日本精品久久久久中文字幕 | 成人精品一区二区三区中文字幕 | 精品国产福利一区二区 | 精品久久8x国产免费观看 | 中文字幕日产无线码一区 | 中文字幕无码乱人伦 | 熟妇人妻中文av无码 | 蜜臀aⅴ国产精品久久久国产老师 | 欧美 亚洲 国产 另类 | 欧美熟妇另类久久久久久不卡 | 国产综合久久久久鬼色 | 国产精品嫩草久久久久 | 又大又紧又粉嫩18p少妇 | 日本一区二区三区免费高清 | 国产精品自产拍在线观看 | 亚洲国产午夜精品理论片 | 日韩精品无码一本二本三本色 | 成人性做爰aaa片免费看不忠 | 西西人体www44rt大胆高清 | 无码人妻少妇伦在线电影 | 岛国片人妻三上悠亚 | 国产黄在线观看免费观看不卡 | 久久无码中文字幕免费影院蜜桃 | 欧美日韩一区二区免费视频 | 在线欧美精品一区二区三区 | 一本大道久久东京热无码av | 正在播放老肥熟妇露脸 | 曰本女人与公拘交酡免费视频 | 十八禁视频网站在线观看 | 国产精品国产三级国产专播 | 又粗又大又硬又长又爽 | 乱人伦中文视频在线观看 | 无码人妻久久一区二区三区不卡 | 久久久久人妻一区精品色欧美 | 欧洲极品少妇 | 免费乱码人妻系列无码专区 | 欧美 日韩 人妻 高清 中文 | 欧美日本免费一区二区三区 | 成人免费视频视频在线观看 免费 | 亚洲综合无码一区二区三区 | 国色天香社区在线视频 | 国产农村妇女高潮大叫 | 亚洲精品国偷拍自产在线麻豆 | 亚洲色成人中文字幕网站 | 伊人久久大香线蕉av一区二区 | 国产绳艺sm调教室论坛 | 亚洲国产精品无码久久久久高潮 | 亚洲国产av美女网站 | 久久久久久亚洲精品a片成人 | 日日摸天天摸爽爽狠狠97 | 国精产品一品二品国精品69xx | 蜜臀av无码人妻精品 | 久久久久亚洲精品中文字幕 | 荫蒂被男人添的好舒服爽免费视频 | ass日本丰满熟妇pics | 国产午夜精品一区二区三区嫩草 | 18无码粉嫩小泬无套在线观看 | 高潮毛片无遮挡高清免费视频 | 久久久国产一区二区三区 | 中文字幕人妻无码一夲道 | 精品人妻人人做人人爽夜夜爽 | 国产97人人超碰caoprom | 在线播放无码字幕亚洲 | 中文字幕乱码亚洲无线三区 | 久久人妻内射无码一区三区 | 一本一道久久综合久久 | 四虎影视成人永久免费观看视频 | 欧美亚洲日韩国产人成在线播放 | 国产又粗又硬又大爽黄老大爷视 | 日日摸夜夜摸狠狠摸婷婷 | 国产人妻精品一区二区三区 | 一二三四在线观看免费视频 | 女人被爽到呻吟gif动态图视看 | 亚洲中文字幕成人无码 | 波多野结衣乳巨码无在线观看 | 亚洲日韩中文字幕在线播放 | 欧美丰满老熟妇xxxxx性 | 国产精品亚洲lv粉色 | 亚洲色偷偷男人的天堂 | 九九热爱视频精品 | 亚洲色欲久久久综合网东京热 | 动漫av一区二区在线观看 | 亚洲色大成网站www国产 | 国产麻豆精品精东影业av网站 | 午夜福利电影 | 日本又色又爽又黄的a片18禁 | 粉嫩少妇内射浓精videos | 亚洲国产精品美女久久久久 | 亚洲精品国产第一综合99久久 | 亚欧洲精品在线视频免费观看 | 色综合久久久无码网中文 | 国产乱人无码伦av在线a | 日本大乳高潮视频在线观看 | 两性色午夜视频免费播放 | 亚洲成av人在线观看网址 | 免费无码午夜福利片69 | 色欲综合久久中文字幕网 | 日本在线高清不卡免费播放 | 色婷婷香蕉在线一区二区 | 亚洲日本va中文字幕 | 牲交欧美兽交欧美 | 日韩av无码一区二区三区 | 久久精品中文字幕一区 | 无码播放一区二区三区 | 久久99精品国产麻豆蜜芽 | 亚洲成在人网站无码天堂 | 午夜性刺激在线视频免费 | 成人无码精品1区2区3区免费看 | 丝袜人妻一区二区三区 | 日韩精品一区二区av在线 | 在线播放无码字幕亚洲 | 欧美日韩一区二区免费视频 | 成人无码视频免费播放 | 波多野结衣高清一区二区三区 | 久久国产自偷自偷免费一区调 | 狂野欧美激情性xxxx | 国产xxx69麻豆国语对白 | 少妇无码一区二区二三区 | 国产一区二区三区影院 | 亚洲春色在线视频 | 色老头在线一区二区三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 成人无码精品一区二区三区 | a国产一区二区免费入口 | 又黄又爽又色的视频 | 成人一区二区免费视频 | 久久久久av无码免费网 | 亚洲人成网站免费播放 | 爱做久久久久久 | 乱人伦人妻中文字幕无码久久网 | 人妻aⅴ无码一区二区三区 | 成人免费无码大片a毛片 | 久久久成人毛片无码 | 国产成人无码av片在线观看不卡 | 久久zyz资源站无码中文动漫 | 无码午夜成人1000部免费视频 | 国内综合精品午夜久久资源 | 国产特级毛片aaaaaaa高清 | 未满成年国产在线观看 | 成人欧美一区二区三区 | 荫蒂添的好舒服视频囗交 | 中国女人内谢69xxxx | 亚洲乱码日产精品bd | 熟妇人妻无乱码中文字幕 | av无码不卡在线观看免费 | 久久久国产一区二区三区 | 东京无码熟妇人妻av在线网址 | www一区二区www免费 | 国产麻豆精品一区二区三区v视界 | 无码av最新清无码专区吞精 | 99精品视频在线观看免费 | 久久精品国产大片免费观看 | 亚洲欧美国产精品久久 | 亚洲熟熟妇xxxx | 精品人人妻人人澡人人爽人人 | 久久久中文字幕日本无吗 | 又紧又大又爽精品一区二区 | 4hu四虎永久在线观看 | 久久99精品国产麻豆蜜芽 | 老太婆性杂交欧美肥老太 | 国产美女精品一区二区三区 | 中文字幕+乱码+中文字幕一区 | 欧洲欧美人成视频在线 | 欧美精品国产综合久久 | 天干天干啦夜天干天2017 | 老熟女重囗味hdxx69 | 午夜精品一区二区三区的区别 | 无码人妻出轨黑人中文字幕 | 99久久人妻精品免费二区 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲综合色区中文字幕 | 亚洲熟妇色xxxxx亚洲 | 全黄性性激高免费视频 | 亚洲国产日韩a在线播放 | 无码纯肉视频在线观看 | 少妇人妻大乳在线视频 | 精品一区二区三区无码免费视频 | 精品亚洲韩国一区二区三区 | 伊人久久婷婷五月综合97色 | 纯爱无遮挡h肉动漫在线播放 | 国产绳艺sm调教室论坛 | 免费网站看v片在线18禁无码 | 亚洲男人av天堂午夜在 | 中文亚洲成a人片在线观看 | 国产电影无码午夜在线播放 | 国产熟女一区二区三区四区五区 | 亚洲欧美日韩综合久久久 | 国产两女互慰高潮视频在线观看 | 无码人妻黑人中文字幕 | 一本色道久久综合狠狠躁 | 亚洲中文字幕乱码av波多ji | 日韩精品无码免费一区二区三区 | 日韩av激情在线观看 | 国产真实乱对白精彩久久 | 欧美丰满少妇xxxx性 | 乱码av麻豆丝袜熟女系列 | 精品人妻av区 | 国产午夜无码视频在线观看 | 国产一区二区三区日韩精品 | 熟女俱乐部五十路六十路av | 人人妻人人澡人人爽精品欧美 | 扒开双腿吃奶呻吟做受视频 | 久久国产精品精品国产色婷婷 | 丁香啪啪综合成人亚洲 | 疯狂三人交性欧美 | 小泽玛莉亚一区二区视频在线 | 久久天天躁狠狠躁夜夜免费观看 | 骚片av蜜桃精品一区 | 99精品国产综合久久久久五月天 | 国产成人无码a区在线观看视频app | 午夜丰满少妇性开放视频 | 任你躁国产自任一区二区三区 | 国产手机在线αⅴ片无码观看 | 又大又硬又爽免费视频 | 蜜桃无码一区二区三区 | 欧美怡红院免费全部视频 | 国产精品嫩草久久久久 | 伊人色综合久久天天小片 | 国产成人无码午夜视频在线观看 | 强伦人妻一区二区三区视频18 | 激情综合激情五月俺也去 | 麻豆人妻少妇精品无码专区 | 欧美性黑人极品hd | 97人妻精品一区二区三区 | 精品国偷自产在线视频 | 国产又爽又猛又粗的视频a片 | 无码人妻av免费一区二区三区 | 4hu四虎永久在线观看 | 无码国产色欲xxxxx视频 | 国产色视频一区二区三区 | 国产成人精品久久亚洲高清不卡 | 青春草在线视频免费观看 | 狠狠色噜噜狠狠狠7777奇米 | 日韩精品久久久肉伦网站 | 国产美女精品一区二区三区 | 成人一在线视频日韩国产 | 日本护士毛茸茸高潮 | 国产欧美熟妇另类久久久 | 大色综合色综合网站 | 国产精品美女久久久 | 亚洲一区二区三区在线观看网站 | 人人爽人人爽人人片av亚洲 | 波多野结衣一区二区三区av免费 | 婷婷丁香五月天综合东京热 | 日日天日日夜日日摸 | 亚洲日韩av片在线观看 | 久久这里只有精品视频9 | 亚洲伊人久久精品影院 | 久久久久久亚洲精品a片成人 | 300部国产真实乱 | av无码电影一区二区三区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 日本精品人妻无码77777 天堂一区人妻无码 | 兔费看少妇性l交大片免费 | 黄网在线观看免费网站 | 美女张开腿让人桶 | 色五月五月丁香亚洲综合网 | av香港经典三级级 在线 | 免费观看又污又黄的网站 | 天天做天天爱天天爽综合网 | 国产美女精品一区二区三区 | 精品无码av一区二区三区 | 波多野结衣av一区二区全免费观看 | 亚洲日韩中文字幕在线播放 | 亚洲a无码综合a国产av中文 | 中文字幕 人妻熟女 | 久久人人爽人人爽人人片ⅴ | av无码电影一区二区三区 | 日韩精品成人一区二区三区 | 中文无码伦av中文字幕 | 国内综合精品午夜久久资源 | 在线亚洲高清揄拍自拍一品区 | 精品国产精品久久一区免费式 | 欧美亚洲日韩国产人成在线播放 | 一本色道久久综合亚洲精品不卡 | 极品嫩模高潮叫床 | 玩弄少妇高潮ⅹxxxyw | 国产欧美精品一区二区三区 | 亚洲 激情 小说 另类 欧美 | 精品国偷自产在线视频 | 黑人巨大精品欧美一区二区 | 欧美 亚洲 国产 另类 | 日韩人妻少妇一区二区三区 | 亚洲人成影院在线无码按摩店 | 夜先锋av资源网站 | 国产成人无码av一区二区 | 中文字幕中文有码在线 | 国内精品人妻无码久久久影院蜜桃 | 久久精品人妻少妇一区二区三区 | 国产在线aaa片一区二区99 | 精品国产麻豆免费人成网站 | 亚洲伊人久久精品影院 | 天堂а√在线中文在线 | 中文字幕人成乱码熟女app | 亚洲熟妇色xxxxx欧美老妇y | 免费播放一区二区三区 | 欧洲vodafone精品性 | 亚洲精品美女久久久久久久 | 免费人成在线观看网站 | 国产麻豆精品精东影业av网站 | 国产成人一区二区三区别 | 成熟妇人a片免费看网站 | 亚洲成av人影院在线观看 | 中文亚洲成a人片在线观看 | 亚洲成av人综合在线观看 | 成人欧美一区二区三区 | 亚洲色在线无码国产精品不卡 | 少妇性l交大片欧洲热妇乱xxx | 精品水蜜桃久久久久久久 | 国内少妇偷人精品视频免费 | 亚洲精品一区二区三区在线观看 | 欧洲美熟女乱又伦 | 丁香啪啪综合成人亚洲 | 午夜成人1000部免费视频 | 亚洲精品国产精品乱码视色 | 国产精品无码一区二区三区不卡 | 国产精品视频免费播放 | 在线欧美精品一区二区三区 | 日本熟妇乱子伦xxxx | 国产在线精品一区二区高清不卡 | 亚洲国产精华液网站w | 性啪啪chinese东北女人 | 一本久久伊人热热精品中文字幕 | 国产人妻人伦精品 | 国产精品久久久久久久9999 | 日本熟妇人妻xxxxx人hd | 精品国产青草久久久久福利 | 曰本女人与公拘交酡免费视频 | 精品久久综合1区2区3区激情 | 免费人成在线视频无码 | 亚洲高清偷拍一区二区三区 | 未满小14洗澡无码视频网站 | 国产美女极度色诱视频www | 亚洲综合精品香蕉久久网 | 午夜理论片yy44880影院 | 在线欧美精品一区二区三区 | 天海翼激烈高潮到腰振不止 | 97人妻精品一区二区三区 | 国产超碰人人爽人人做人人添 | 久久久久亚洲精品男人的天堂 | 久久97精品久久久久久久不卡 | 一个人看的www免费视频在线观看 | 日日夜夜撸啊撸 | 欧美成人午夜精品久久久 | 国产精品美女久久久网av | 国产美女极度色诱视频www | 装睡被陌生人摸出水好爽 | www一区二区www免费 | 一本久久伊人热热精品中文字幕 | 日本精品人妻无码免费大全 | 99精品久久毛片a片 | 国产97在线 | 亚洲 | 国产精品va在线播放 | 人人超人人超碰超国产 | 精品人妻av区 | ass日本丰满熟妇pics | 在线播放亚洲第一字幕 | 国产深夜福利视频在线 | 国产成人综合美国十次 | 无码精品国产va在线观看dvd | 欧美亚洲日韩国产人成在线播放 | 男人的天堂2018无码 | 少妇被粗大的猛进出69影院 | 女人和拘做爰正片视频 | 久久久久久a亚洲欧洲av冫 | 国内精品一区二区三区不卡 | 亚洲国产精品无码久久久久高潮 | 熟女俱乐部五十路六十路av | 强奷人妻日本中文字幕 | 99久久精品午夜一区二区 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲男女内射在线播放 | 两性色午夜免费视频 | 亚洲人成网站色7799 | 久久午夜无码鲁丝片秋霞 | 国产欧美精品一区二区三区 | 国产精品18久久久久久麻辣 | 毛片内射-百度 | 嫩b人妻精品一区二区三区 | 男人扒开女人内裤强吻桶进去 | 亚洲熟妇色xxxxx欧美老妇 | 精品无人国产偷自产在线 | 亚洲日本在线电影 | 亚洲精品无码人妻无码 | 扒开双腿疯狂进出爽爽爽视频 | 午夜精品一区二区三区在线观看 | 夜夜影院未满十八勿进 | 熟妇人妻中文av无码 | 露脸叫床粗话东北少妇 | 呦交小u女精品视频 | 久久久久99精品国产片 | 亚洲精品一区二区三区四区五区 | 欧美国产日韩久久mv | 无码帝国www无码专区色综合 | av小次郎收藏 | 免费人成在线观看网站 | 国产精品亚洲а∨无码播放麻豆 | 欧美黑人巨大xxxxx | 国产福利视频一区二区 | 色综合久久久无码中文字幕 | 久久综合网欧美色妞网 | 日日摸天天摸爽爽狠狠97 | 精品一二三区久久aaa片 | 亚洲国产欧美国产综合一区 | 夜夜影院未满十八勿进 | 国产9 9在线 | 中文 | 狠狠躁日日躁夜夜躁2020 | 久激情内射婷内射蜜桃人妖 | 亚欧洲精品在线视频免费观看 | 久久无码专区国产精品s | 欧美精品免费观看二区 | 亚洲成av人片天堂网无码】 | 九月婷婷人人澡人人添人人爽 | 日韩精品无码免费一区二区三区 | 国产亚洲美女精品久久久2020 | 欧美真人作爱免费视频 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲精品久久久久中文第一幕 | 国产午夜无码视频在线观看 | 国产人妻精品午夜福利免费 | 国产舌乚八伦偷品w中 | 精品成在人线av无码免费看 | 六十路熟妇乱子伦 | 99久久精品无码一区二区毛片 | 无码一区二区三区在线 | 狠狠色色综合网站 | 国产激情无码一区二区 | aa片在线观看视频在线播放 | 国产成人一区二区三区在线观看 | 人人妻在人人 | 377p欧洲日本亚洲大胆 | 夜精品a片一区二区三区无码白浆 | 国产熟妇另类久久久久 | 午夜成人1000部免费视频 | 久久精品国产一区二区三区 | 亚洲国产精品毛片av不卡在线 | 成人无码视频在线观看网站 | 在线播放免费人成毛片乱码 | 亚洲色无码一区二区三区 | 欧美日韩视频无码一区二区三 | 强奷人妻日本中文字幕 | 麻花豆传媒剧国产免费mv在线 | 国产精品国产自线拍免费软件 | 亚洲欧美精品aaaaaa片 | 国产精品久久久久久久影院 | 美女张开腿让人桶 | 精品久久8x国产免费观看 | 免费无码午夜福利片69 | 在线播放免费人成毛片乱码 | 国产精品久久久久久亚洲影视内衣 | 成人无码视频免费播放 | 国产精品亚洲综合色区韩国 | 国色天香社区在线视频 | 天天躁日日躁狠狠躁免费麻豆 | 国产精品va在线播放 | 精品水蜜桃久久久久久久 | 国产在线无码精品电影网 | 蜜桃视频韩日免费播放 | 无人区乱码一区二区三区 | 天干天干啦夜天干天2017 | 欧美黑人巨大xxxxx | 亚洲另类伦春色综合小说 | 一本久道久久综合婷婷五月 | 久久精品中文字幕大胸 | 99久久精品国产一区二区蜜芽 | 国内精品九九久久久精品 | 亚洲一区二区三区在线观看网站 | 色综合视频一区二区三区 | 亚洲精品国偷拍自产在线麻豆 | 欧美性生交活xxxxxdddd | 亚洲一区二区三区在线观看网站 | 亚洲乱码国产乱码精品精 | 内射老妇bbwx0c0ck | 在线成人www免费观看视频 | 久久精品女人的天堂av | 成人试看120秒体验区 | 欧美熟妇另类久久久久久多毛 | 人人妻人人澡人人爽欧美一区九九 | 波多野结衣av在线观看 | 少妇被粗大的猛进出69影院 | 久久久久99精品成人片 | 国产人妻人伦精品 | 中文字幕色婷婷在线视频 | 乌克兰少妇xxxx做受 | 久久久精品国产sm最大网站 | 亚洲精品国偷拍自产在线观看蜜桃 | av无码不卡在线观看免费 | 婷婷综合久久中文字幕蜜桃三电影 | 午夜熟女插插xx免费视频 | 久久人人爽人人人人片 | 乌克兰少妇性做爰 | 国内丰满熟女出轨videos | 欧美激情综合亚洲一二区 | 国产精品.xx视频.xxtv | 国产精品二区一区二区aⅴ污介绍 | 久久久中文久久久无码 | av无码久久久久不卡免费网站 | 亚洲精品国偷拍自产在线麻豆 | 国内精品久久毛片一区二区 | 樱花草在线播放免费中文 | 久久99精品国产麻豆 | 狠狠噜狠狠狠狠丁香五月 | 久久综合九色综合欧美狠狠 | 亚洲 高清 成人 动漫 | 人人超人人超碰超国产 | 人妻无码久久精品人妻 | 国产成人无码一二三区视频 | 领导边摸边吃奶边做爽在线观看 | av无码久久久久不卡免费网站 | 亚洲中文字幕在线无码一区二区 | 中文字幕+乱码+中文字幕一区 | 国产色在线 | 国产 | 久久久久久亚洲精品a片成人 | 亚洲色欲色欲欲www在线 | 亚洲色无码一区二区三区 | 亚洲大尺度无码无码专区 | 国产精品人妻一区二区三区四 | 国产熟女一区二区三区四区五区 | 综合激情五月综合激情五月激情1 | 久久久久免费精品国产 | 天堂а√在线中文在线 | 爆乳一区二区三区无码 | 内射后入在线观看一区 | 中文亚洲成a人片在线观看 | 激情亚洲一区国产精品 | 国产女主播喷水视频在线观看 | 国产人妻精品一区二区三区 | 亚洲 高清 成人 动漫 | 99久久婷婷国产综合精品青草免费 | 清纯唯美经典一区二区 | 亚洲成av人综合在线观看 | 麻豆md0077饥渴少妇 | 国产亚洲人成在线播放 | 久久久中文久久久无码 | 精品熟女少妇av免费观看 | 国产色xx群视频射精 | 天天躁夜夜躁狠狠是什么心态 | 少妇愉情理伦片bd | 亚洲精品综合五月久久小说 | 国产三级久久久精品麻豆三级 | 人妻少妇被猛烈进入中文字幕 | 学生妹亚洲一区二区 | 亚洲欧洲无卡二区视頻 | 久久zyz资源站无码中文动漫 | 精品一二三区久久aaa片 | 国产精品久久久久7777 | 亚洲国产精品一区二区美利坚 | 伊人久久婷婷五月综合97色 | 久久综合久久自在自线精品自 | 天堂一区人妻无码 | 国产精品第一国产精品 | 水蜜桃亚洲一二三四在线 | 久久综合香蕉国产蜜臀av | 性欧美大战久久久久久久 | 成人免费视频视频在线观看 免费 | 青春草在线视频免费观看 | 国内精品九九久久久精品 | 欧美老熟妇乱xxxxx | 粗大的内捧猛烈进出视频 | 人妻少妇精品久久 | 无码人妻丰满熟妇区毛片18 | 亚洲精品久久久久久一区二区 | 野外少妇愉情中文字幕 | 国产精品久久福利网站 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲 高清 成人 动漫 | av无码不卡在线观看免费 | 久久久久成人精品免费播放动漫 | 中文字幕人成乱码熟女app | 亚洲成av人片在线观看无码不卡 | 黑人大群体交免费视频 | 国产精品久久久久久无码 | 欧美熟妇另类久久久久久不卡 | 久久人妻内射无码一区三区 | 欧美精品在线观看 | 亚洲自偷自拍另类第1页 | 亚洲综合色区中文字幕 | 国产超碰人人爽人人做人人添 | 亚洲精品成人av在线 | 狠狠亚洲超碰狼人久久 | 日韩精品一区二区av在线 | 日韩欧美中文字幕在线三区 | 少妇愉情理伦片bd | 小鲜肉自慰网站xnxx | 欧美日本精品一区二区三区 | 美女黄网站人色视频免费国产 | 清纯唯美经典一区二区 | 亚洲乱亚洲乱妇50p | 国产婷婷色一区二区三区在线 | 欧美亚洲日韩国产人成在线播放 | 岛国片人妻三上悠亚 | 日本精品久久久久中文字幕 | 国产 精品 自在自线 | 久久精品中文字幕一区 | 高清国产亚洲精品自在久久 | 中文字幕无码日韩专区 | 亚洲性无码av中文字幕 | 鲁一鲁av2019在线 | 亚洲国产欧美国产综合一区 | 久久综合香蕉国产蜜臀av | 亚洲一区二区三区无码久久 | 亚洲中文字幕无码中字 | 老子影院午夜精品无码 | 色婷婷香蕉在线一区二区 | 亚洲一区二区三区偷拍女厕 | 无码人妻精品一区二区三区不卡 | 熟女体下毛毛黑森林 | 国产一区二区三区四区五区加勒比 | 成人免费视频视频在线观看 免费 | 久久人人爽人人爽人人片av高清 | 亚洲成在人网站无码天堂 | 国产激情无码一区二区app | 免费无码午夜福利片69 | 特黄特色大片免费播放器图片 | 国产亚洲精品久久久久久国模美 | 亚洲精品国产品国语在线观看 | 18禁止看的免费污网站 | 国产成人精品优优av | 日韩亚洲欧美精品综合 | 亚洲爆乳无码专区 | 牲欲强的熟妇农村老妇女视频 | 亚洲中文字幕成人无码 | 亚洲精品一区二区三区四区五区 | 性开放的女人aaa片 | 中文字幕无码日韩欧毛 | 一二三四社区在线中文视频 | 亚洲区欧美区综合区自拍区 | 欧美激情一区二区三区成人 | 国模大胆一区二区三区 | 性欧美牲交在线视频 | 少妇性荡欲午夜性开放视频剧场 | 久久久久亚洲精品中文字幕 | 国内丰满熟女出轨videos | 狠狠色欧美亚洲狠狠色www | 亚洲日韩中文字幕在线播放 | 无套内谢的新婚少妇国语播放 | 久久精品国产大片免费观看 | 国产精品免费大片 | 少妇无码av无码专区在线观看 | 蜜臀aⅴ国产精品久久久国产老师 | 西西人体www44rt大胆高清 | 粉嫩少妇内射浓精videos | 亚洲人成影院在线无码按摩店 | 人妻夜夜爽天天爽三区 | 无套内谢的新婚少妇国语播放 | 欧美猛少妇色xxxxx | 亚洲国产高清在线观看视频 | 午夜福利一区二区三区在线观看 | 亚洲色www成人永久网址 | 欧美精品国产综合久久 | 蜜桃臀无码内射一区二区三区 | 亚洲理论电影在线观看 | 精品乱子伦一区二区三区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 午夜福利电影 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲熟熟妇xxxx | 少妇愉情理伦片bd | 国产国语老龄妇女a片 | 人妻与老人中文字幕 | 无码毛片视频一区二区本码 | 精品国产青草久久久久福利 | 正在播放老肥熟妇露脸 | 久久久久免费精品国产 | 亚洲自偷自拍另类第1页 | 99er热精品视频 | 国产免费久久久久久无码 | 7777奇米四色成人眼影 | 国产美女极度色诱视频www | 日韩精品无码一本二本三本色 | 精品久久久中文字幕人妻 | 精品乱码久久久久久久 | 成人性做爰aaa片免费看不忠 | 18禁止看的免费污网站 | 国产精品久久久午夜夜伦鲁鲁 | 国产国产精品人在线视 | 国产精品无码一区二区三区不卡 | 狠狠色色综合网站 | 无码播放一区二区三区 | 精品国精品国产自在久国产87 | 亚洲国产精品久久人人爱 | 欧美野外疯狂做受xxxx高潮 | 成人性做爰aaa片免费看 | 一本加勒比波多野结衣 | 国产色在线 | 国产 | 女人被男人爽到呻吟的视频 | 日本精品少妇一区二区三区 | 日本xxxx色视频在线观看免费 | 1000部夫妻午夜免费 | 精品国产av色一区二区深夜久久 | 亚洲欧洲日本无在线码 | 熟女体下毛毛黑森林 | 粗大的内捧猛烈进出视频 | 国产真实夫妇视频 | 无码成人精品区在线观看 | 亚洲自偷精品视频自拍 | 熟妇女人妻丰满少妇中文字幕 | 免费国产黄网站在线观看 | 亚洲aⅴ无码成人网站国产app | 噜噜噜亚洲色成人网站 | 亚洲成在人网站无码天堂 | 亚洲熟悉妇女xxx妇女av | 88国产精品欧美一区二区三区 | 欧美精品无码一区二区三区 | 国产成人无码午夜视频在线观看 | 国产免费无码一区二区视频 | 日产国产精品亚洲系列 | a片免费视频在线观看 | 国产做国产爱免费视频 | 日韩成人一区二区三区在线观看 | 国产精品多人p群无码 | 欧美日韩视频无码一区二区三 | 亚洲精品一区二区三区在线 | 中文字幕日产无线码一区 | 国产在线精品一区二区三区直播 | 国产精品亚洲专区无码不卡 | 18精品久久久无码午夜福利 | 女高中生第一次破苞av | 中文字幕无码av激情不卡 | 天天爽夜夜爽夜夜爽 | 婷婷丁香五月天综合东京热 | 天天拍夜夜添久久精品大 | 国产精品久久久久7777 | 综合网日日天干夜夜久久 | 精品无人国产偷自产在线 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲精品一区二区三区大桥未久 | 亚洲日韩中文字幕在线播放 | 国产电影无码午夜在线播放 | 天下第一社区视频www日本 | 内射白嫩少妇超碰 | a片在线免费观看 | 沈阳熟女露脸对白视频 | 国产人妻精品午夜福利免费 | 久久亚洲精品成人无码 | 国产亚洲人成在线播放 | 国内精品久久久久久中文字幕 | 中文字幕无码免费久久99 | 午夜熟女插插xx免费视频 | 国产精品高潮呻吟av久久 | 国产做国产爱免费视频 | 国产精品久免费的黄网站 | 综合激情五月综合激情五月激情1 | 久久99精品国产麻豆 | 国产亚洲美女精品久久久2020 | 大地资源中文第3页 | 综合人妻久久一区二区精品 | 99久久人妻精品免费二区 | 无码人妻精品一区二区三区不卡 | 日本高清一区免费中文视频 | 国产精品久免费的黄网站 | 少妇高潮喷潮久久久影院 | 婷婷五月综合缴情在线视频 | 人妻少妇精品无码专区二区 | 波多野结衣乳巨码无在线观看 | 精品成在人线av无码免费看 | 国产又爽又黄又刺激的视频 | 欧美大屁股xxxxhd黑色 | 人妻少妇精品无码专区动漫 | 三上悠亚人妻中文字幕在线 | 亚洲国产欧美日韩精品一区二区三区 | 熟女少妇在线视频播放 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产成人精品三级麻豆 | 人妻少妇被猛烈进入中文字幕 | 亚洲爆乳大丰满无码专区 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 久久精品国产亚洲精品 | 久精品国产欧美亚洲色aⅴ大片 | 国产精品无码一区二区桃花视频 | 久久久久久a亚洲欧洲av冫 | 亚洲午夜久久久影院 | 丰满人妻翻云覆雨呻吟视频 | 午夜丰满少妇性开放视频 | 国产香蕉尹人视频在线 | 亚洲区欧美区综合区自拍区 | 初尝人妻少妇中文字幕 | 在线视频网站www色 | 精品欧美一区二区三区久久久 | 黄网在线观看免费网站 | 亚洲一区二区三区四区 | 亚洲精品欧美二区三区中文字幕 | 国内精品久久毛片一区二区 | 鲁鲁鲁爽爽爽在线视频观看 | 国产办公室秘书无码精品99 | 久久精品人人做人人综合 | 欧美野外疯狂做受xxxx高潮 | 国产一区二区不卡老阿姨 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国内揄拍国内精品少妇国语 | 亚洲国产av美女网站 | 日韩成人一区二区三区在线观看 | 婷婷六月久久综合丁香 | 久久久久亚洲精品男人的天堂 | 成人无码精品1区2区3区免费看 | 岛国片人妻三上悠亚 | 亚洲中文字幕乱码av波多ji | 东北女人啪啪对白 | 日本大乳高潮视频在线观看 | 色欲人妻aaaaaaa无码 | 日本熟妇乱子伦xxxx | 亚洲熟悉妇女xxx妇女av | 中文字幕乱码中文乱码51精品 | 亚洲中文字幕成人无码 | 精品国产福利一区二区 | 领导边摸边吃奶边做爽在线观看 | 狠狠色丁香久久婷婷综合五月 | 国精产品一区二区三区 | 中文字幕无码日韩欧毛 | 午夜男女很黄的视频 | 欧美成人家庭影院 | 亚洲综合无码一区二区三区 | 成人亚洲精品久久久久软件 | 久久熟妇人妻午夜寂寞影院 | 国产精品无码一区二区桃花视频 | 亚洲综合无码一区二区三区 | 亚洲精品一区二区三区大桥未久 | 强伦人妻一区二区三区视频18 | 色五月丁香五月综合五月 | 无码成人精品区在线观看 | 三上悠亚人妻中文字幕在线 | 色五月五月丁香亚洲综合网 | 国产绳艺sm调教室论坛 | 国产精品久久久久9999小说 | 99久久亚洲精品无码毛片 | 欧美人妻一区二区三区 | 亚洲一区二区三区播放 | 亚洲综合另类小说色区 | 中文字幕日产无线码一区 | 熟妇人妻中文av无码 | 精品偷自拍另类在线观看 | 欧美黑人乱大交 | 97色伦图片97综合影院 | 丝袜 中出 制服 人妻 美腿 | 熟妇人妻无码xxx视频 | 黑人大群体交免费视频 | 国产精品美女久久久网av | 精品亚洲韩国一区二区三区 | 国产乱人伦av在线无码 | 日本大香伊一区二区三区 | 又粗又大又硬又长又爽 | 麻花豆传媒剧国产免费mv在线 | 国产亚洲精品久久久久久国模美 |