2011年2月23日 星期三

淺談Flash傳值(二)

延續著上一篇 淺談Flash傳值(一) 分享到FB後的廣大迴響(2篇留言,2個讚),激起我強大的鬥志(大約4趴),決定接著繼續寫下去,對於記憶體只有2byte的我來說,延續上篇是困難的事情,於是找到了上次的範例檔研究了一下,想好了接下來要講的東西,沒錯,就是物件導向(上次明明說待續不是這個)
隨著年紀逐漸的增長,打開幾百行Code的as繼續完成變成一件比吃掉自己的頭還要困難的事情,所以身為一個專業的programer,一定要讓主要這支as精簡精簡再精簡(比如說叫同事幫你寫),所以我們邁向了物件導向的偉大旅程
甚麼是物件導向呢?簡單的我們可以找出四個定義:繼承(Inheritance) 、多載(Overloading)與重寫(Overriding) 、封裝(Encapsulation) 、資料抽象化/抽象資料型別(Data abstraction / Abstract Data Type) 看到這四個中英文交雜(我都還不太確定她是英文)的專有名詞之後,想必你也跟我一樣開始不想看下去了,所以我們把自己定下一個簡單註解,物件導向:半年後我打開上次寫的程式碼,我還想瞭解他啊!!!!!!!對,就是這股熱忱,我們可以開始做正事了

打開上次的範例檔可以發現,主要要做的事情就是,把東西丟給NPC,等NPC回來跟我靠北,接下來的30年寫Code生涯,我應該都會做重複的事情,那我就應該將這隻as做的動作寫成一支API
所以我們抓出這支as在做的事情,並自行定義一個類別,寫成另一支as
package as3.ac.net{
 import flash.display.*
 import flash.events.*
 import flash.net.*;
 public class InternetTransfer {
  public var url:String;//宣告這支as的公開變數url
  public var myRequest:URLRequest ;//宣告這支as的公開URLRequest
  public var variables:URLVariables;//宣告這支as的公開URLVariables
  private var loader:URLLoader//宣告這支as的私有URLLoader
  public function InternetTransfer() {
   myRequest= new URLRequest()//當新增一個自己定義的InternetTransfer即產生URLRequest
   loader = new URLLoader();//當新增一個自己定義的InternetTransfer即產生URLLoader
  }
  
  public function send($Target:String,$Variables:Object,$method:String="GET"){//定義一個公開函式send提供傳送變數出去
   url = $Target
   myRequest.url=url
   transVariables($Variables)//為了懶惰,要傳送的變數直接給Object,再透過function transVariables把她轉成給myRequest的URLVariables,就在第35行
   myRequest.data = variables
   myRequest.method=$method//傳送類型直接吃給這支as的method
   loader.load(myRequest);
  }
  public function load($Target:String,$method:String="GET"){//定義一個公開函式load提供單純的接受回傳參數
   url = $Target
   myRequest.url=url
   myRequest.method=$method
   loader.load(myRequest);
  }
  public function addEventListener($event:*,$function:Function) {//重寫一個監聽函式
   loader.addEventListener($event, $function);
  }
  public function removeEventListener($event:*,$function:Function) {//重寫一個移除監聽函式
   loader.removeEventListener($event, $function);
  }
  private function transVariables($target:Object) {
   variables=new URLVariables()
   for (var i in $target) {
    variables[i]=$target[i]
   }
  }
 }
}
這時候再改寫一下上次寫的as
package {
 import flash.display.*
 import flash.events.*
 import flash.net.*;
 import flash.text.*
 import flash.system.System
 import as3.ac.net.InternetTransfer//將剛剛寫好的API叫近來
 public class netTrans extends Sprite {
  public var _net:InternetTransfer//宣告一個新的自訂類別InternetTransfer
  public function netTrans() {
   addEventListener(Event.ADDED_TO_STAGE, addToStageHandeler)
  }
  private function addToStageHandeler(_e:Event) {
   removeEventListener(Event.ADDED_TO_STAGE, addToStageHandeler)
   preset()
  }
  private function preset() {
   System.useCodePage=true//因Google回傳的中文編碼關係,所以須設定
   _net = new InternetTransfer()//產生InternetTransfer實體
   _net.send("http://www.google.com.tw/ig/api",{weather:"Taipei"})
   _net.addEventListener(Event.COMPLETE, loadCompleteHandeler);//監聽收到回傳值時的Event
  }
  private function loadCompleteHandeler(_e:Event) {
   var __xml:XML=new XML((_e.target.data))//Google回傳的值為XML
   trace(__xml)//trace看看
  }
 }
}

當啷~~~~跟上一次一摸摸一樣樣的結果,但是我們不用再去記以後丟值給其他NPC要寫那些Code了,省下來的腦部空間又可以多記住一些星爺的經典台詞了,想起來我就覺得開心,有了拿到的XML接下來我們又可以做些色色的事情了...歐不是,是做些其他的事情了...............待續

範例檔下載

1 則留言:

  1. 讚!這樣應該可以增加你寫下一篇的戰鬥力吧(0.5啪??)
    期待~

    回覆刪除