Wda-lecture04

  • October 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Wda-lecture04 as PDF for free.

More details

  • Words: 502
  • Pages: 7
建立日期 2006/11/24

第四講 動態載入器與預載器製作

親民視傳系助理教授 陳弘正

經過期中考的洗禮,相信同學們對前三講所教的內容已有『深刻』的認識,接下 來,我們進到網頁製作最核心的概念-動態載入-的概念。此一概念可幫助我們 在建構大型網站時可將內容有效的『模組化』,並且加快網站載入的時間。 至於預載器的製作則常見於 Flash 網站中,相關的作法這一講亦會介紹。老規 矩,同學們一定要仔細研究老師給的範例,老師在這裏僅作重點提示及簡要說 明,其它部分請同學自行研究。 1. 網站規格與圖層安排 a. 這裏以老師自己製作的網站為例(只是示範啦!),一般來說,網站的規 格設定為中規中矩的 800*600;其中,置放網站 Logo 及導覽列的頂列區 塊(top block)大小為 800*70,而置放版權聲明列(copyright declaration)的底 部區塊(bottom block)則佔 800*30,剩下中間的部份,則全歸內容區塊 (content block)的範圍,共佔 800*500。

b. 接下來則是圖層安排,關於這部份,我們遵循上一講立定的慣例,亦即將 網站作成『單影格網站』,在此例中,我們一共用了七個圖層,由上至下 分別是 action, preLoader, content, menu, bottomBar, topBar 以及 bg 七個圖 層;其中,後六個圖層分別放置相應的影片片段,分別是 preLoader_mc, myLoader, menu_mc, bottomBar_mc, topBar_mc 以及 bg_mc 等影片片段。 值的注意的是,以上的 myLoader 並不屬於影片片段的類別,而是由 Loader (載入器)所實體化的一個元件,以下為其詳細介紹。 1

建立日期 2006/11/24

2. 動 態 載 入 技 巧 - 『 焦 不 離 孟 、 孟 不 離 焦 』 - 論 以 物 件 導 向 程 式 設 計 之 MovieClipLoader 與 Preloader a. 在 Flash 中,關於動態載入的方法有很多種,在以前 Flash MX 的時代,使 用的是 ActionScript 1.0 的 loadMovie 語法,該語法是將外部檔案(swf 檔或 jpeg 檔)載入空白影片片段元件中, (另還有 loadMovieNum 語法,則是載 入至階層中) ;該方法的好處當然是簡單明白,但有一好沒二好(忘了是誰 說的?好像是技安(胖虎)?),缺點則是在製作檔案載入時等待的『預載 器 (preloader)』時,方法頗為煩瑣。 (詳細請參考小正正第四章第三至四節) b. 還好,現在是 Flash 8 的時代,而 AS 也進步到 ActionScript 2.0 的時代,其 中,相關的語法乍看之下有些落落長,不過,多打些字的代價換來的卻是 相對語法上的便利與強大。待我細細說來~ c. 首先暫且不看其它圖層,我們先專注在 preLoader 和 content 這兩個圖層, 在 content 圖層中,我們先打開組件面版(Ctrl+F7),在 User Interface (UI)分 類下有一個 Loader 的組件,直接將其拖至場景中,並將其大小及位置調整 適當,如下圖所示,其中,該 Loader 組件亦類似影片片段元件一般需給定 實體名稱,在此稱之為 myLoader。

拉到場景上並調 整至 800*500

實體名稱 myLoader

2

建立日期 2006/11/24

d. 另外,當Loader組件加入場景的同時,你會發現元件庫(Ctrl+L)中會多出一 個”Loader”的元件,在其類型的欄位寫著『編譯後的影片片段 (complied movie clip』 。這代表我們所使用的Loader組件事實上就是一個影片片段;而 『編譯』一詞則代表此組件已經Flash事先作最佳化的處理,當我們呼叫它 來使用時,它會有最佳的效率。事實上,從Flash MX2004 版本以後,Flash 已大量增加各式各樣的組件,這意思是,未來各位在發展更大型的Flash 專 案時,可以多多倚賴好用的組件來拼湊成你要的成品。關於更多組件的使 用,我們會在下一學期更仔細的談到。 關於Loader的作用,簡單講,它扮演了一個『動態的』裝載外部swf檔 的角色,也就是說,當使用者點選時,相關的內容頁面(以獨立的swf呈現) 才 會 載 入 ( 伴 隨 著 preloader ), 如 此 可 有 效 降 低 主 檔 的 大 小 , 真 可 謂 Loader-On-Demand 1 (隨選載入)。 e. 接下來,在我們真正進入語法之前,很抱歉,我們在這裏必須先談一些預 備知識,主要是關於 Flash 8 中所使用的 ActionScript 2.0 中所使用的物件導 向程式設計 (Object-Oriented Program,簡稱 OOP)的概念。 在 OOP 設計的想法中,程式世界被想像成由一個一個屬於不同類別 (class)的物件(object)所構成的系統,每個物件在要使用前必需經過『類 別建構』的程序,這一點很像是生物體內的基因的建構,簡單講,不同的 生物擁有不同的基因,當造物主要創造不同的生物時,祂必定是先預備了 不同生物的基因,如此才能創造出不同的生物。而在 OOP 的領域裏,這個 『創造』的程序,以我們目前要使用的 Loader 組件來說,其語法如下: var mcLoader:MovieClipLoader = new MovieClipLoader();

(1)

其中,var 為變數宣告的關鍵字,mcLoader 為 MovieClipLoader 物件的名 稱;而第一個 MovieClipLoader (紅色字) 為類別宣告 (class declaration), 第二個草綠色 MovieClipLoader()則為建構子 (constructor),new 則為建構 子的先行關鍵語。簡單講,整句語法就是宣告有一個名為 mcLoader 的 MovieClipLoader 被建構出來了。 接下來,一旦 mcLoader 被建立後,我們就可以用這個物件來載入外部 影片片段(swf 檔),語法如下: mcLoader.loadClip("home2.swf", myLoader);

1

這個名詞(我自己講的)借用了目前很流行的一個名詞Movie-On-Demand (隨選視訊)。 3

(2)

建立日期 2006/11/24

其中,loadClip()為載入影片片段的方法,其中的第一個選項放入要載入的 MC,而第二個選項則是該 MC 載入的位置(此處為之前放進場景的 Loader 組件(其實體名稱為 myLoader)) 。 f. 乍看之下,應該寫到這裏,就可以順利載入外部影片了吧?但可惜的是, 由於 Flash 預設任何影片皆在網路環境下運作,因此,(2)式雖然作了載入 的動作,但到底真的載入影片了沒有,或者說到底載入了多少(百分比) 的影片,其實皆為未定之數。 在 Flash 中,它設計了另一種稱為『偵聽器(listener)』的物件來偵測 外部影片載入的比例(或進度) 。其建構方法與上述方法類似,唯其類別為 Object 而已。亦即: var myListener:Object = new Object();

(3a)

mcLoader.addListener(myListener);

(3b)

上列(3b)式,其作用為偵聽器(名字為 myListener)被加入 mcLoader 的物件中 (使用 addListener()方法) ,這樣的動作其實非常像醫生看病時把聽診器放 在病人胸口聽診一樣的動作。我們因此可以藉著該偵聽器的作用,即時的 偵測影片載入的進度。 g. 好,預備工作總算完成了, (2)式表示了外部影片片段被載入至 Loader 組 件中,而(3a), (3b)則表示偵聽器已放至 Loader 的『胸口』(很寫實吧?), 接下來,只要外部影片片段有任何動靜(被載入) ,都會忠實的回報,而這 個回報的方法就是附屬於偵聽器上的 onLoadProgress 方法,這個方法最強 的地方就是它會回報給我們外部影片片段被即時載入的檔案大小,其中, 一個是 bytesLoaded 變數,代表已被下載的檔案大小,而 bytesTotal 變數 則代表下載檔案的總大小,而 target_mc 目前則無作用。詳細用法,我附上 說明檔如下:

4

建立日期 2006/11/24

h. 在這裏我直接列出整段的語法如下:

仔細說明如下: (1).

第 11 行的作用是讓 preLoader_mc 恢復可被看見。 (關於 preLoader_mc 的製作,我們將其放於 preloader 的圖層,容後再敘;因為在第一行的 語 法 中 < 此 未 列 出 > , 我 們 先 設 定 preLoader 為 不 可 見 (preLoader_mc._visible=false)。

(2).

第 12 行我們定義一變數 pctLoad(pct 代表 percent,百分比的意思): var pctLoaded = Math.round(bytesLoaded/bytesTotal*100); 其 中 bytesLoaded/bytesTotal*100 為 下 載 的 百 分 比 ( 非 整 數 ), Math.round 則為取整數的函數。

(3).

接下來從第 13 行到 17 行為三種不同的 preloader 的作法,其共通點 為利用所計算得的 pctLoaded 的結果來作 preLoader,這裏列出我們用 5

建立日期 2006/11/24

模擬下載時所得的螢幕截圖。(至於為什麼這樣寫,請同學自己想想 囉!)

最後 18 行以後的 if 判斷式則決定了如果外部影片下載完畢,則

(4).

preLoader 會再次看不見。 3. 吁,好累,寫到這兒,我心裏不免想,同學們還跟上的有幾人?沒關係,老 師心裏想,我還是盡量寫,我相信對同學們而言,總是有用的,大家加油吧! 接下來,我把剩下其它比較旁枝末節的部分交待完,其他就交給同學們去努 力囉! a. 首先是關於 preLoader 的部分,請開啟 preLoader 圖層的 preLoader_mc 影 片片段。這裏我把三種不同的 preLoader 作在一起,只是給同學們參考, 希望大家還可以設計出更好的 preLoader 來。 一般 preLoader 的作法,就是利用上述的 pctLoaded 的變數的大小改變, 來變動(1)preLoader Bar 的長短或(2)下載百分比等。其中第 1 種作法是用 到 preLoaderBar_mc 的 xscale(水平長度) ,而第二種作法則是用動態文字 來反應 pctLoaded 的變化。(請同學們自行參閱範例) 另外一種作法是用影格的位置來作 preLoader,例如以下載進度為一百 分為例,我們可以在一百個影格內作一些動畫改變,如此一來,伴隨著下

6

建立日期 2006/11/24

載百分比的增加,動畫即會隨之變動了。

b. 至於其它的各圖層及其上的影片片段,相信同學們應該都能一目了然,老 師就不多費唇舌。最後,我們在 menu 圖層上一樣設計了不同的頁面,以 現在的作法,很簡單,就是作不同的按鈕在 menu 上,再寫相對應的按鈕 事件處理函式(onPress event handler)就能順利解決。語法如下:

關於主場景語法的部份,到這裏就算告一段落了,同學們辛苦了! 4. 等等,戲還沒演完!請回座!我們還沒交待要載入的影片片段咧?以老師附 的 home2.fla 為例,其寫法與第三講所提者大致相同,唯值得注意的是,在第 一影格語法中,原先_root 的部份都要改為 this,這是因為當 home2.swf 載入 主程式(intWeb01b.fla)的 Loader 時,原先所用的絕對路徑_root 已不適用,故 須改用相對路徑 this。簡單講,以後同學們製作分頁內容時,請一律用相對 路徑就對了。 5. 好了,大功總算告成了!接下來,同學們練習時間到囉! 7