blog.Ring.idv.tw

Flash

SWF and FLV File Format Specification (Version 9)發佈了~

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

Gnash - GNU Flash Movie Player

Gnash是一個採用GPL授權的Flash Movie Player,主要的開發者為Rob Savoye,目前最新釋出的版本為0.8.0 (June 9,2007),且大多支援Flash v7的功能與特色,如果你是Linux的使用者,我想對它應該不會過於陌生,而且在Ubuntu 7.10就將被列為預設安裝的項目之一。

當然如果你想在Win32平臺上測試的話,可以來此下載:

Gnash for win32(executable)

Gnash原始碼:

Gnash Source Code

Gnash執行方式(Win32)

先將底下的一些DLL、Gnash.exe檔複製到「C:\Windows\System32」底下,並在命令列下輸入:

gnash C:\test\xxx.swf

相關介紹:

Gnash - Wikipedia

GameSWF

2007-07-27 10:34:51 | Add Comment

自訂你的右鍵選單-「ContextMenu」

在一個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

「loadVariables」vs.「LoadVars」(二)

在這篇「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

「loadVariables」vs.「LoadVars」(一)

在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

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment