AS3-網路遊戲製作- 封包講解(1)

flash網路遊戲已遍佈世界各角落,技術再也不是隱藏且困難的事,
早已應該將其詳細內容解說,一直拖至今日終於有時間整理出給
各位網友參考,希望可以利用其技術發展更多的應用與創意多媒體遊戲!


封包的拆解與學習 , 是網路遊戲製作前必要的基礎,你可以不必了解太深
但基本原理一定要透徹瞭解,再第二篇教學時才可以學習其原理,自己加以
變化其中結構變成自己的東西!


封包的傳遞在網路間是以微小的 bit (單位)在做傳送, 再組合成更大的單位
1 bytes(8bits),而且在傳送時是連續不停的發送,連續的bytes傳送給接收者
,然而 以flash例子來說 , 雖然 as3可以處理uint(bit)資訊,但後續應用與
處理上相當的麻煩,當然也是有人利用bit來做處理資料,以加快傳輸速度,下面
透過一些圖可以幫助更加瞭解!


事實上網路遊戲整體控制,有著  Server(伺服器端) 與  Client(客戶端) 互相溝通
訊息而完成動作,Client端只負責接收數據,呈現其效果,重要的商業邏輯驗證都會
在伺服器端完成,以防止駭客或資料被竄改



Server 將內容送給 Client 端時,接收的 Client 端會收到一個一個byte的形式數據
然而我們會不知到這些一連串的bytes , 隱藏的結構內容是如何
, 如下左圖

所謂隱藏的結構內容,假設我們設計者可以預先知道(當然如果是hack就必須自行拆解)
假設我們以下右圖為例,預先知道其結構是byte , short , int , string(5)

那麼,我們在解封包時,便可以依照不同型態的長度來解開封包內容!




上面我們可以看到封包旁的紅色數字,

第一個結構型態是byte所以我們將第1個接收到的封包拆解(讀成byte型態),
第二個結構型態是short,short占 2bytes, 所以我們將接收到的第2到第3byte讀成short
第三個結構型態是int, int占 4bytes , 接收到的第4到7讀成int.
第四個結構型態是string , string是字串,字串的長度不定,假設我們這裡預先知道它長
度是 5 ,那麼我們在接string時可以依語言寫法填上5的長度值


型態有許多種,各位網友可以參考adobe as3可以閱讀的型態種類
http://help.adobe.com/zh_TW/FlashPlatform/reference/actionscript/3/flash/utils/ByteArray.html#readDouble%28%29

(32位元長度 表示4bytes , 64位元就是8bytes , 裡面的 double 就是占8bytes )

註:這裡的表示型態是以flash為基準,舉例在C語言傳送一個char型態,對flash來說就等於是一個byte
   不同語言,各型態之間的對應,都是需要注意的地方!




最後各位注意到圖最左邊畫了bit , 1 bytes = 8 bits , 假設我們將數據塞進 bit 來
做為傳送解讀的依據,可以大大的減少封包傳送的流量,因為1bytes就可以裝載
8個數據,不必再使用8bytes來裝
( 當然只有在特定情況 , 且使用維護上不易 )


AS3 - 事件發怖 dispatchEvent

事件發怖應用層面非常廣泛 , 其應用的方法也依個人喜好
寫法而大不相同 , 但觀念都是一樣 !~

簡單說 ,事件發怖就是像你一般as3 看到的事件 寫法一般

addEventListener ( MouseEvent.CLICK

只不過 , 後面的名稱由我們來制定!

基本的結構 如下 : this.dispatchEvent( new Event( "ABC" , true , false) );

this.addEventListener(  "ABC" , abc_fun )
再進階的應用寫法 , 有些人甚至將事件名稱 化做為一個 class
當你將事件名稱化為做 class 時 , 你就可以將其當成物件 , 包夾其
參數至事件其中 , 將其傳遞 !

下面這個例子參考 :

this.dispatchEvent( new Event( ZH.ABC , true , false) );
ZH 就是一個 class , 裡面有宣告 object , 因此你在發怖該事件時
就可以 連同 ZH 夾帶 object 相關參數 一起帶至目標地!


那麼事件發怖有什麼好處用處呢 ?

1. 系統化及邏輯化整體程式結構

2. A 外載 B , 要監聽 B 做完某些事 , A 才會去觸發時



記住你可以依照你的習慣用任何方法去達到目的
事件發怖便是其中一個不錯的選擇

AS3 - 強制拔除清除記憶體 Resource Management

 
在任何語言中 , 效能是甚為重要其中一環 ,
而在  flash 中若您已使用  removeChild , 或是一些基本的措施
object = null , clear() , cose() ; unload 等等 ....


另外還有網路上使用的hack不正規方法來利用連續執行兩次錯誤
造成強制垃圾回收 GC  ( Garbage collected )

注意此方法經測試只能在 flash debug player 下運作

           try{
                new LocalConnection().connect("foo");
                new LocalConnection().connect("foo");
                System.gc();

            }catch(e:Error){}


參考文章
Resource Management
http://gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html