跳到主要內容

Dictionary And Proxy

今天來介紹二個 AS3 新增的二個類別(AS2沒有這東西喔)
Dictionary
簡單來說跟 Object 和 Array 是做一樣的事。
是用來索引物件用的類別。
Array是用數字來當做 Key 值。
_array[0] = "字串1";
_array[1] = "字串2";

_array[0] = "字串3";
時, 本來的值就會被取代掉
trace(_array[0]) //得到 字串3

Object是使用String來當作 Key 值
_obj['key'] = "String1";
_obj['key2'] = "String2";
(或寫成_obj.key2 = "String2";)

_obj['key2'] = "String3";
本來的值也會被取
trace(_obj['key2']) //得到 String3

Dictionary
是把'物件', 當作索引值,
每個物件都是獨立單一的, 這樣就可以確保索引值是唯一的。
var _dic :Dictionary = new Dictionary();
var _mc:MovieClip = new MovieClip();
var _mc2:MovieClip = new MovieClip();
//建立二個MovieClip
_dic[_mc] = "Dictionary Value1";
_dic[_mc2] = "Dictionary Value2";
用for in 掃一下內容。
for (var d:* in _dic) {
trace(d, _dic[d])
}
// [object MovieClip] Dictionary Value1
// [object MovieClip] Dictionary Value2
就可以得到當初寫入的值了
, 記得, 不要時一定要delete掉, 否則物件的指派還在
就不會被記憶體回被器回收喔。
完整程式碼:

package  {  
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.utils.Dictionary;

public class DictionaryDemo extends Sprite {    
private var _obj :Object = { };
private var _dic :Dictionary = new Dictionary();
public function DictionaryDemo()  {   

//_obj[Key] = Value
//但 Object 的 Key 必需是字串
//所以有可能會發生 Key 值已經用掉的問題

var _mc:MovieClip = new MovieClip();
_obj[_mc] = "數值1";
//這樣寫就等於 _obj[_mc.toString()] = 值。

var _mc2:MovieClip = new MovieClip();
_obj[_mc2] = "數值2";

//使用 for in 來掃obj裡的變數
for (var a:String in _obj) {
trace(a, _obj[a]);
// [object MovieClip] 數值2     
}

_dic[_mc] = "Dictionary Value1";
_dic[_mc2] = "Dictionary Value2";
for (var d:* in _dic) {        
trace(d, _dic[d])  
// [object MovieClip] Dictionary Value1
// [object MovieClip] Dictionary Value2    
}
}  
} 
}

Proxy , 代理人
好比我們要載入一個xml
要先透過URLLoader載入
然後再用一個XML物件把載入後的結果存起來
有沒有辦法整合成一個呢, 這時 Proxy 就很好用了
理想
var _xxx:類別 = new 類別
_xxx.載入外部("xml");
_xxx.偵聽事件。
載入成功後。
直接用_xxx.xml裡的tag名稱, 直接就當成xml使用。
先準備一份要載入用的XML文件





 



 


撰寫XMLProxy.as類別,
因為 Flash 不充許多重繼成, 但可以透過 Interface 來做到類似的效果,
所以XMLProxy要先extneds Proxy類別, 同時實作IEventDispatcher
package {
import flash.utils.Proxy; 
import flash.events.Event; 
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest; 
import flash.utils.Proxy;
import flash.utils.flash_proxy; 
[Event(name = "complete", type = "flash.events.Event")]
//加入這組 tag , 是要給 FlashDevelop 或是 Flex 在編程式碼時能有事件提示。
dynamic public class XMLProxy extends Proxy implements IEventDispatcher {  
//extends Proxy 時, 一定要設定成 dunamic 類別
private var _eventDispatcher:EventDispatcher;  
private var _urlLoader  :URLLoader;
private var _xml   :XML;  
private var _isLoaded  :Boolean;

public function XMLProxy(){ 
_eventDispatcher = new EventDispatcher();   
_urlLoader = new URLLoader();
_urlLoader.addEventListener(Event.COMPLETE, xmlLoadedHandler);
}
private function xmlLoadedHandler(e:Event):void {
_xml = XML(_urlLoader.data); 
_isLoaded = true;
dispatchEvent(new Event(Event.COMPLETE, true, true));   
}
public function loadURL(url:String):void {
var urlRequest:URLRequest = new URLRequest(url);
_urlLoader.load(urlRequest);
}
flash_proxy override function getProperty(name:*):*{
var _name:String = String(name);
return _xml[_name];
}
//以下是因為 interface IEventDispatcher, 所以要實作一樣的 function 名稱。
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, weakRef:Boolean = false):void {
_eventDispatcher.addEventListener(type, listener, useCapture, priority, weakRef);
}
public function dispatchEvent(event:Event):Boolean {
return _eventDispatcher.dispatchEvent(event);
}
public function hasEventListener(type:String):Boolean {
return _eventDispatcher.hasEventListener(type);
}
public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
_eventDispatcher.removeEventListener(type, listener, useCapture);
}
public function willTrigger(type:String):Boolean {
return _eventDispatcher.willTrigger(type)
}  

public function get isLoaded():Boolean { return _isLoaded; }
}
}


完後成, 測試吧。
package  {  
import flash.display.Sprite;
import flash.events.Event;

public class XMLProxyDemo extends Sprite{  


private var _xmlProxy:XMLProxy = new XMLProxy();
//建構 XMLProxy 類別
public function XMLProxyDemo()  {   
_xmlProxy.addEventListener(Event.COMPLETE , _xmlCompleteHandler);
//偵聽事件, 因為實作了 IEventDispatcher , 所以也可以發送和偵聽。
_xmlProxy.loadURL("xml_data.xml");
//載入 xml。
}  

private function _xmlCompleteHandler(e:Event):void {   
//載入完成後, 當去使用_xmlProxy物件的屬性時,
//如果是 _xmlProxy 本身有定義的屬性, 就會去讀該屬性。
/* 而在 XMLProxy 裡定義的這行, 就是當屬性沒有定義時, 就去找指定的物件裡的屬性
* 方法也是可以這樣做。
* flash_proxy override function getProperty(name:*):*{
var _name:String = String(name);
return _xml[_name];
}*/

trace(_xmlProxy.isLoaded);
//.isLoaded 是定義好的屬性。

trace(_xmlProxy.item[0].img.@src);
//.item不是 _xmlProxy 裡一開始就定義好的屬性, 透過 Proxy 代理, 去找指定物件的屬性
//就好像真的是_xmlProxy物件的屬性一樣。
trace(_xmlProxy.item[1].label);   

}
} 
}

留言

Unknown寫道…
>Dictionary
>是把'物件', 當作索引值,
>每個物件都是獨立單一的, 這樣就可以確保索引值是唯一的。

不太了解這句話,哈哈。
milkmidi寫道…
var _mc:MovieClip = new MovieClip();
使用Object
_obj[_mc] = "值"。
//這樣是把_mc.toString()當成Key
//所以有可能會被蓋掉

_dic[_mc] = "值"。
是把物件本身當作Key值,
Unknown寫道…
老師請問一下,dispaychEvent(new Event(客製事件,ture,ture),這個客製事件業可以始用Event的公用常數?

你在XMLProxy這個範例的xmlLoadedHandler()函式,發出的事件EVENT.COMPLETE

請問用公用常數,作客製事件有什麼要小心的
milkmidi寫道…
dispaychEvent(new Event(客製事件,ture,ture)
此時的客製事件,只是一個字串
但就有可能會發生打錯字的問題
比較好的做方法自己寫一個類別來extends Event
同時定義const 的 static 字串

這個網誌中的熱門文章

奶綠茶新書上市_密技公怖_程式碼下載

奶綠茶第一本 Flash 書籍上市啦 博客來書籍館 Flash 3D 特效宅急便 - 商業範例隨學隨 把我對 Flash 的研究與熱愛, 全寫在其中 本書的前幾章, 特別安排 ActionScript3.0 的許多範例 好讓你一步步瞭解 as2 和 as3 的差別 再安排製作動畫不可缺少的 Tweener 類別和一些常用的數學動畫公式 最後當然就來到本書的重點 PV3D 啦 從 PV3D 的原理, 基本架構一點一點的介紹 再透過許多實用的範例, 從中瞭解 PV3D 製作的小技巧 有任何書籍相關的問題, 也請不吝指教 感謝一路走來, 幫助過我的前輩們, 邦邦、Ticore、神魂、Maso、Erin 旗標出版社 小編 Bready 米蘭數位所有夥伴 米蘭數位ActionScript Team:Jason,Ash,Mark 本書大鋼: 1.ActionScript3.0概論 分析AS3的概念與語法, 從基本的滑鼠事件、外部載入、氣泡事件介紹起 適合熟悉AS2, 想轉戰AS3的人員。 2.程式碼製作動畫 使用簡單的數學公式, 套用到程式裡, 脫離死版的影格動畫。 3.製作動畫的好夥伴:Tweener 除了套用數學公式外, Tweener類別也能加速我們開發出更多的動畫效果, 不需辛辛苦苦的找公式。 4.自定類別 AS3的精神, 是在於強大的物件導向, 當然也要熟悉類別的寫法與使用。 5.Flash3D - Papervison3D 如果在Flash玩轉3D效果, PV3D是最好學, 最快上手的3D Flash Engine, 從簡單的3D概念, PV3D類別, 事件等。 6 漫天飛舞的Paper3DWorld效果 7 迷你旋轉木馬式秀圖效果 8 最經典! CoverFlow 圖像展示效果 9 天旋地轉 TiltViewer效果 10 FlatWall3D電視牆效果 11 經典旋轉木馬 Carousel3D 秀圖效果 12 光源材質展示與簡易型的方塊彈跳效果 13 載入外部3D模型與動畫 14 超立體旋轉九宮格 Box3DWorld 15 空間感與透明感兼具的 SpaceGallery 16 螺旋式 SpiralCarouse 影像展示 17 Flash10 3D功能 18 Flash效

奶綠茶photoGalleryV3.5

奶小茶的photoGalleryV3.5原始檔 2007/12/30 更新小Bug,請重新下載 線上Demo: http://milkmidi.com/photogallery/galleryv3.html 1.支援SWFAddress,讓FLASH可以有上一頁下一頁和每張獨立網址的功能 2.圖片路徑圖說經由XML來設定 3.背景依據顯示圖片,自動變化成最接近的顏色 4.非商業用途,歡迎使用並修改(如果覺得我製作的好,也煩請加入我的logo) 5.可結合後端伺服器 00.art 相本集資料夾 com 奶綠茶的Class檔 swfaddress SWFAddress資料夾 swfobject swfobject資料夾 XML galleryV3.fla 原始檔 index.html 主檔html SWFAddress.as SWFaddressEvent.as Source Code Download 解壓密碼:回覆文章,即可看見Password

超好用的無限免費網頁空間,無廣告,無流量限制

大家好,我是奶綠茶 今天來教大家如何申請一個無限免費速度又快的網頁空間 1 首先到  https://github.com/ 申請帳號(一直下一步,下一步,下一步) 2 到你的個人頁,切換上方的 tab 到 Repositories, 按下右鍵的 new 3 Repository name 一定要是這樣的格式 username.github.io 我的 github 網址是 github.com/milkmidi 那就要輸入 milkmidi.github.io 選擇 public, 這樣別人才看的到 private 有其他用途, 而且要付費才能使用 完成後按下 Create repository 5 安裝 SourceTree github 並不支援 FTP 或是網頁上傳,一定要透過指令碼 在這我們選用有圖型介面的軟體,方便大家學習 https://www.sourcetreeapp.com/ 下載並安裝 啟動後登入你的 github 帳號 6 clone 你的 github io 專案 右上角有個 Clone or download 點選後 複製 https 連結(不要選到 ssh ) 7 將 https 的連結貼到 SourceTree 8 上傳 html 到本機 github.io 資料夾,放一個 index.html 切換到 SourceTree, 這時會看到 Unstaged files 的欄位 選擇 Stage All 9 git 要求每次的 Commit, 都一定要打說明文字(好習慣) 輸入完成後,按下右邊的 Commit 10 發佈(Push),這樣就完成啦 可以到你的 http://milkmidi.github.io/ 去查看檔案有沒有出來 其他 Commit 可以想像是做一個記錄,你可以很多的 Commit 最後再一次 Push 上去 github 原本是給程式設計師用的版本控管服務 免費版提供無限空間讓你放檔案,但一定要是 public 想要有私有的 Project ,就只能付費 github.io 只能放靜態檔案,php, aspx 服務並不支援。 祝大家學習愉快 轉載請註明出處 奶綠的 github.io S