天天看點

loadMovie問題全解

使用loadMovie可以動态的載入外部檔案,進而減少主檔案的體積,有利于網上下載下傳,以及對各項子檔案的修改,更換。如果沒有做過FLASH網頁,可以看看這個FLASH網頁的基本組成情況,見圖2-2-1
 隻需要把圖中的主檔案和子檔案用比如ftp工具傳到自己的空間上,就可以輕松的實作隻下載下傳主檔案,如果需要浏覽的子檔案就可以單獨下載下傳,可以想想,如果你的整個FLASH網頁不分主次,全部統一個FLASH,做成了幾M甚至10多M,那麼有誰願意等着看你的網頁呢?除非你自己。
 于是使用loadMovie就顯得很重要了。現在就讓我們從基礎開頭,然後去分析使用loadMovie所涉及到的具體問題吧。使用loadMovie有兩種基本的方法:(一)将外部swf檔案載入到某一層上。(二)将外部swf檔案載入到時間軸的某個影片剪輯中。對這兩種方法的使用,用圖表示更加直覺些。見圖2-2-2
 第二種方法又可以這樣寫:_root.mc.loadMovie(“a1.swf”);如果a1的字尾名為 jpg那麼載入的是外部圖檔。載入圖檔與載入swf檔案的道理是一樣的,就不贅述。說到這裡還比較空洞,做一個執行個體來看看。
一、建立一個檔案夾,任意取一個名字 比如:mywangye
 二、做一個Flash釋出成swf檔案并且取名字為a1,儲存在mywangye這個目錄中,這個a1就是我們要載入的子檔案。
 三、然後做主檔案,由于我們是做最簡單的,是以什麼也不畫,就在這個主檔案的第一桢,寫 loadMovie(“a1.swf”,1) 同樣将這個檔案儲存在mywangye目錄中,取個名字叫index
四、測試效果,源檔案見本文後的打包中的01檔案夾
 然後用上面圖中的第2種文法,繼續做一個,注意了,第二種方法需要在舞台上放一個mc并且取一個執行個體名,或者建立一個空的MC。做了上面的小實驗後,我們可以總結些什麼結論呢?如果僅僅是得到可以加載外部檔案這麼一條結論的話,那麼就太膚淺了。可以讓我們想到:被加入進來的外部檔案的坐标問題;長寬問題;外部檔案比較大,造成的加載延時問題;如何通路被加載進來的swf的問題;不要加載了,解除安裝問題…..這些問題我們如果不研究下,真正在做網頁的時候,會遇到很多麻煩的。
 由上面的最簡單的加載我們可以得到這樣的結論:(1)如果采用加載到層上的,加載進來後預設注冊點是舞台的左上角;如果采用加載到mc裡面的,那麼預設注冊點是MC的注冊點。如果MC的注冊點是左上角,那麼被加載進來的SWF檔案就與MC的左上角對準;如果MC的注冊點是中心,那麼加載進來的SWF就把左上角與MC的中心對齊。(2)被加載進來的MC保留原來的長寬比例。
 問題一:如何控制被加載進來的SWF檔案的坐标和長寬比例大小?
控制被加載進來的SWF檔案控制其長寬要采用onEnterFrame,比如:
on (press) {
 loadMovie("a2.swf", "_root.mymc");
 onEnterFrame = function () {
 _root.mymc._x = 0;
 _root.mymc._y = 0;
 _root.mymc._width = 330;
 _root.mymc._height = 240;
 };
 }為什麼用 onEnterFrame呢?因為被加載進來的的過程中,有點延時,如果沒有onEnterFrame語句,那麼語句讀取一次就不讀取了,然而讀取了這一次之後,還沒有加載進來,是以就會導緻坐标大小設定無效。同樣,如果加載到層上,也是這樣的。
on (press) {
 loadMovie("a1.swf", 1);
 onEnterFrame = function () {
 _level1._x = 17;
 _level1._y = 30;
 _level1._width = 330;
 _level1._height = 240;
 };
 } 請注意這兩種方法,第一種,把外部的a2加載到mymc中,加在進來後,a2就自動的替換了mymc,我們直接設定mymc的屬性就設定了被加載進來的swf的屬性。第二種方法,_level是對于加載到時間軸上的電影的引用,加載到第2層就是_level2;加載到第3層就是_level3。
 問題之二:如何實作點選按鈕加載一個外部SWF檔案,并且要顯示加載的下載下傳進度呢?
 有兩個方法來實作這個效果,其一:把加載londing寫在主檔案中,其二,被加載的子SWF檔案有自己的londing。現在分别給予說明。
其一:在主檔案中寫londing
 外部子swf檔案名為a1,主檔案中有一個動态文本框名為loadText,一個按鈕名為bbt,現在把loadMovie和londing寫在桢上。
_root.bbt.onPress = function() {
 _root.createEmptyMovieClip("mc", 10);
 mc.loadMovie("a1.swf");
 mc._visible = false;
 _root.bbt.onEnterFrame = function() {
 var l = mc.getBytesLoaded();
 var t = mc.getBytesTotal();
 var getPercent = l/t;
 loadText = Math.round(getPercent*100)+"%";
 if (l>0 && l>=t) {
 mc._visible = true;
 delete this.onEnterFrame;
 }
 mc._x = 10;
 mc._y = 10;
 mc._width =440;
 mc._height = 320;
 };
 };其二:子檔案中有自己的londing
 這個寫法與前面說的londing一樣,隻是注意一個問題就是注意路徑的問題,比如這樣寫:
第一祯
loaded = getBytesLoaded();
 total = getBytesTotal();
 lts = Math.round((loaded/total)*100);
 wenben = lts+"%";第二祯
if (lts == 100) {
 gotoAndStop(3);
 } else {
 gotoAndPlay(1);
 } 和前面的londing中介紹的比較,看出不同之處沒有呢?僅僅是去掉了_root因為被加載後,外部SWF檔案就相當于主檔案中的一個MC 有了_root 就是指向主檔案的_root 了,當然會顯示錯誤。
 問題三:我想在舞台上畫一個螢幕,然後點選一個按鈕就載入一個外部swf進行播放該怎樣做呢?
 那麼我們就來一起做一個相冊吧。當主檔案載入後,單擊按鈕就載入一個外部swf 檔案,并且都有londing顯示。首先我們做好以下準備工作:(1)準備幾張圖檔,現在我們準備7張,6個子檔案一個一張,主檔案用一張。(2)主檔案舞台大小為了适應網頁的需要,設定為770*420。子檔案舞台大小設定為512*384,這樣就不需要載入後控制大小了,友善些(其實我們應當這樣,省去一些麻煩。
 一、制作子檔案。每個都用來顯示圖檔,第一和第二祯寫londing,第三祯~~二十祯根據自己的愛好做點亮度變化,以産生動感,最後一祯寫上stop()。第一和第二祯的londing如下
第一祯
loaded = getBytesLoaded();
 total = getBytesTotal();
 lts = Math.round((loaded/total)*100);
 wenben = "資料下載下傳中 "+lts+"%";第二祯
if (lts == 100) {
 gotoAndPlay(3);
 } else {
 gotoAndPlay(1);
 } 就這樣如法炮制的制作6個,分别命名為b1…..b6都釋出成swf檔案。儲存在一個檔案夾中。
二、制作主檔案
 第一祯用來寫londing,第2祯放一些像螢幕一樣的東西,和按鈕,為了增加效果,放一個音樂在時間軸上。
第一祯的londing//由于前面已經說得多了,就不贅述了
stop();
 i = 0; ,
 onEnterFrame = function () {
 // 使用不斷觸發的事件
 loaded = _root.getBytesLoaded();
 total = _root.getBytesTotal();
 var aa = Math.round((loaded/total)*100);
 _root.dongtai.wenbens = aa+"%";
 _root.dongtai._x = 188+aa*3;
 _root.bb._width = aa*3;
 if (aa>=100) {
 // 檢測到滿足條件就跳出來,否則繼續循環
 _root.gotoAndStop(2);
 delete this.onEnterFrame;
 // 使用delete的目的是當完成下載下傳後銷毀onEnterFrame事件,以節約資源的消耗。
 }
 };第2祯的按鈕上的AS
on (press) {
 _root.i++;
 if (i == 7) {
 i = 6;
 }
 loadMovie("b"+i+".swf", "_root.mc");
 _root.tishi = "第"+i+"張圖檔";
 } 偷點懶,就不詳細的贅述其含義,我們也可以用很長的語句來實作相同的效果,這種寫法是對AS的一種濃縮。
具體情況請參看原檔案。
 問題四:我想逐次載入多個外部檔案,當第一個載入播放完畢後,立即載入第2個,第二個播放完畢後,立即載入第3個,……,直到結束。怎麼辦?
 首先對這種提問,我們先要質問一下提問的人,這樣做有什麼意義?與其這樣,不如全部做到一個SWF中,因為每次調用一個外部SWF的時候,需要一定的時間來等待下載下傳。當然,如果你想制作一個連續劇,播放完了一個後,用londing下一集的londing畫面顯示“正在載入下集,請稍候”那麼還是可以的。
 方法很簡單:依照問題三的原檔案,稍微修改,去掉一個按鈕,用一個按鈕載入第一個,然後再第一個的最後一祯放個調用主檔案中的函數即可。
按鈕:
on (press) {
 loadMovie("b1.swf", "_root.mc");
 }主檔案定義的函數
function go2() {
 loadMovie("b2.swf", "_root.mc");
 }
 function go3() {
 loadMovie("b3.swf", "_root.mc");
 }
 function go4() {
 loadMovie("b4.swf", "_root.mc");
 }
 function go5() {
 loadMovie("b5.swf", "_root.mc");
 }
 function go6() {
 loadMovie("b6.swf", "_root.mc");
 }第一個b1 SWF的最後一祯_root. go2(),第二個外部SWF的最後一祯 _root.go3()………..