SWF and FLV File Format Specification (Version 9)發佈囉~
AVM2全新的bytecode現在完全交由DoABC tag來定義了~ 如果想瞭解這些bytecode的話,請參考ActionScript Virtual Machine 2 (AVM2) Overview。
BTW, the ABC means ActionScript Byte Code.
blog.Ring.idv.tw
In Flash
SWF and FLV File Format Specification (Version 9)發佈囉~
AVM2全新的bytecode現在完全交由DoABC tag來定義了~ 如果想瞭解這些bytecode的話,請參考ActionScript Virtual Machine 2 (AVM2) Overview。
BTW, the ABC means ActionScript Byte Code.
2007-07-27 14:50:02 | Add Comment
In Flash, Open Source
Gnash是一個採用GPL授權的Flash Movie Player,主要的開發者為Rob Savoye,目前最新釋出的版本為0.8.0 (June 9,2007),且大多支援Flash v7的功能與特色,如果你是Linux的使用者,我想對它應該不會過於陌生,而且在Ubuntu 7.10就將被列為預設安裝的項目之一。
當然如果你想在Win32平臺上測試的話,可以來此下載:
Gnash原始碼:
Gnash執行方式(Win32)
先將底下的一些DLL、Gnash.exe檔複製到「C:\Windows\System32」底下,並在命令列下輸入:
gnash C:\test\xxx.swf
相關介紹:
2007-07-27 10:34:51 | Add Comment
In Flash, ActionScript
在一個Flash動畫上點選右鍵時,它通常會出現如下圖所示的選單:
然而,倘若我們想要自訂一個屬於自己的選單列,那該如何達成呢?幸好在Flash Player 7之後,它為我們提供了一個「ContextMenu」,得以讓我們自訂屬於自己的右鍵選單,而這一切均需仰賴著「ContextMenu」來幫助我們達成這樣的效果。
隱藏內建的選單列
假設你只想要隱藏內建的選單列,只要透過呼叫「hideBuiltInItems()」即可隱藏內建的選單列,不過最後記得將「_leve0」這個「MovieClip」的屬性值「menu」指向我們所建立的「ContextMenu」即可:
程式一
var my_cm = new ContextMenu(); my_cm.hideBuiltInItems(); _root.menu = my_cm;
結果:
自訂一個屬於自己的選單列
程式二
var my_cm = new ContextMenu(); my_cm.hideBuiltInItems(); my_cm.customItems.push(new ContextMenuItem("sayHello",hello)); function hello(obj, menuItem) { trace(obj); trace(menuItem.caption); hello_txt.text = "Hello!"; } _root.menu = my_cm;
結果:
_level0 sayHello
不僅只有「MovieClip」可以有自訂的「ContextMenu」,包含「Button」和「TextField」都可以有自己的「ContextMenu」,例如你可以自訂一個「TextField」包含「copy」的選單項目,而經由執行這個選單項目會幫你複製「TextField」裡頭的字串等等,諸如此類的應用就自由發揮囉!
2007-07-22 19:01:17 | Add Comment
In Flash, ActionScript
在這篇「loadVariables」vs.「LoadVars」(一)我們曾提及「loadVariables」vs.「LoadVars」資料傳送的差異,那我們該如何得知資料已載入完成了呢?是否有相對應的事件可以來協助我們呢?
「LoadVars」事件處理
利用「LoadVars」要得知資料是否已載入完成,其實是相當容易且直覺的,它提供了一個「onLoad」事件處理器來協助我們來達成實現,然而此事件是隸屬於系統事件(System Event),也就是它無法透過使用者來加以觸發的事件,而是仰賴Flash Player來觸發的,相反地,若是「onClick」等等之類的事件,則稱之為使用者事件(User Event),底下我們先來看此事件的描述:
onLoad Event Handler
public onLoad = function(success:Boolean) {}
此事件會在呼叫「LoadVars.load()」或「LoadVars.sendAndLoad()」結束時,才會由系統來加以觸發的事件,而系統會傳遞一個success參數作為判斷載入成功或失敗的變數。
範例如下:(data.txt是一個約1.8mb的文字資料,裡頭包含了「var0 ~ var99999」的變數資料,以及一個ok變數)
程式一
var data_lv:LoadVars = new LoadVars(); data_lv.onLoad = function(success) { if(success) { trace("Loaded!"); trace(this.ok); }else{ trace("Failed!"); } } data_lv.load("data.txt");
結果:
Loaded! 1
此「onLoad」事件的確只會在「LoadVars.load()」或「LoadVars.sendAndLoad()」結束時才會觸發的事件。
「loadVariables」事件處理
相較於「LoadVars」來說,要判斷「loadVariables」是否已完成載入資料,便顯得較為煩瑣些,雖然使用「loadVariables」會觸發「MovieClip.onData」事件,但值得注意的是並不是只有「loadVariables」才會觸發此事件,「loadMovie」也會觸發此一事件,而且還必須作些手腳來達成判斷資料是否已「完全」載入,我們先看下述這個範例:
程式二
this.loadVariables("data.txt"); this.onData = function() { if(this.ok == undefined) { trace("Loading..."); }else{ trace("Loaded!"); trace(this.ok); } }
結果:
Loading... Loaded! 1
從執行的結果上來觀察,我們可以知道「onData」這個事件至少被系統呼叫了「兩」次,這也就是為何筆者需要加上一個「ok」變數資料在「data.txt」文件上,那是否還有額外的方式可以處理呢?其實我們也可以利用「MovieClip.onEnterFrame」來做個輪詢的方式來偵測資料是否已載入完成,或是利用「setInterval」來協助我們達成,底下是個別的作法:
setInterval
this.loadVariables("data.txt"); function checkParamsLoaded() { if(_root.ok == undefined) { trace("Loading..."); }else{ trace("Loaded!"); trace(_root.ok); clearInterval(param_interval); } } var param_interval = setInterval(checkParamsLoaded, 100);
結果:
Loading... Loaded! 1
MovieClip.onEnterFrame
this.loadVariables("data.txt"); this.onEnterFrame = function() { if(this.ok == undefined) { trace("Loading..."); }else{ trace("Loaded!"); trace(this.ok); delete this.onEnterFrame; } }
結果:(根據你的FPS而定,筆者環境FPS=30)
Loading... Loading... Loaded! 1
本文若有任何謬誤,希望請不吝地賜教,若能指正不勝感激。
2007-07-18 22:32:23 | Add Comment
In Flash, ActionScript
在Flash Player 6之前,當我們要傳送或接收外部的資料,或者欲整合後端的程式進行溝通時,我們無非是經由「loadVariables」或「loadVariablesNum」來協助我們達成這樣的工作,那為何還需要「LoadVars」呢?當然事出必有因,而原因不外乎利用「loadVariables」進行後端程式的溝通時,若稍有不慎,可是會將整個「MovieClip」的實體變數都傳送至後端程式,或是你想偵測目前下載的進度時,那「loadVariables」也將不敷使用,基於這些原因「LoadVars」也就此誕生。
「loadVariables」vs.「LoadVars」資料傳送
我們剛剛有提到過使用「loadVariables」進行後端程式的溝通時,會將整個「MovieClip」的實體變數都傳送至後端程式,倘若當此「MovieClip」擁有大量的實體變數時,那可會伴隨著這些變數一併都傳送至後端程式,試想這樣會多有效率呢?底下我們用了「loadVariables」和「LoadVars」來做驗證:
程式一
var foo = 10; var bar = 20; this.loadVariables("http://localhost/loadVariables.jsp","GET"); var data_lv:LoadVars = new LoadVars(); data_lv.foo = 10; data_lv.sendAndLoad("http://localhost/LoadVars.jsp",data_lv,"GET");
結果:
Error opening URL 'http://localhost/loadVariables.jsp?foo=10&bar=20' Error opening URL 'http://localhost/LoadVars.jsp?foo=10'
從錯誤訊息中,我們就可以驗證「loadVariables」會將所擁有全部的實體變數傳送出去(不包含$version),而我們利用「LoadVars」則僅會將我們所定義在此實體的變數值傳送而已(data_lv.foo),所以既然了解「loadVariables」有此特性,所以我們必然要使用較佳的方案來達成:
程式二
var foo = 10; var bar = 20; this.createEmptyMovieClip("data_mc",1); data_mc.foo = 30; data_mc.loadVariables("http://localhost/loadVariables.jsp","GET");
結果:
Error opening URL 'http://localhost/loadVariables.jsp?foo=30'
從結果上來看,若是需要利用「loadVariables」來進行資料交換的話,上述程式會是較好的作法,畢竟獨立一個「MovieClip」會較容易拿捏與掌握它。
本文若有任何謬誤,希望請不吝地賜教,若能指正不勝感激。
2007-07-18 18:13:06 | Add Comment