最近開始需要用到物理引擎
網路上有好幾套 Flash 物理引擎
比較多人用、資料比較豐富的似乎是從 C 移植過來的 Box2D
同樣是移植過來的版本居然還有分兩種
Box2D Flash AS3Box2D Alchemy WCK
Box2D Flash AS3 整個是純 AS3 寫成的
Box2D Alchemy WCK 是直接拿 Box2D C 程式,透過 Alchemy 編譯為 Flash SWC
然後加上其它 AS3 Wrapper Class 來的
兩種版本大略使用過之後發現 Box2D Alchemy WCK 有許多優點

  • 執行效能較佳
  • 與 Box2D 原版 API 接近,假如原版更新了,也可以自己架設 Alchemy 更新到 Flash 版
  • 提供了很多輔助類別可以使用,譬如能夠作到各種形狀重力場等
  • 與 Flash IDE 完美整合在一起,甚至只要用拖拉的方式就可以建立好需要的物理場景

唯一的缺點只有檔案較大,沒有提供單一打包好的 SWC,導致編譯速度太慢問題
用了之後一定會占掉 300kb 左右大小,這或許也不算很大
不過編譯速度太慢真的很傷腦筋
所以本篇文章的目的就是要把整個 Project 打包為單一 SWC
如此一來,編譯速度就會大幅提升,也能很容易的拿到 Flash Builder 內使用

當我實際開始著手這樣工作之後,才發現遇到很多問題
也懶得一一解釋原因了
主要的步驟如下:

  1. 開一個空白的 Flex Library Project – Box2DAlchemyLib
  2. 將 Box2D.swc 加入到 lib path
  3. 將所有的 AS3 Class 放置到 Flex Lib src 下,修正未宣告型別、存取修飾子等語法問題
  4. e.g. /src/wck/WavesEffect.as -> /src/extra/WavesEffect.as

  5. 於空的 Package 下放置空白 Dummy Class
  6. e.g. /src/Box2DAS/Cls.as

以上就能產生出可以同時給 Flash/Flex 用的 SWC 類別庫了
假如想要把 Demo.fla 套用新的 SWC 類別庫
修改步驟如下:

  1. 修改 fla AS3 Setting,path 加入 Box2DAlchemyLib.swc,並取消發布 SWC
  2. 修改 MovieClip 設定
  3. GravityCapsule Symbol
    Class: GravityCapsule
    Base Class: gravity.GravityCapsule

    GravityLinear Symbol
    Class: GravityLinear
    Base Class: gravity.GravityLinear

    GravityRadial Symbol
    Class: GravityRadial
    Base Class: gravity.GravityRadial

    GravitySine Symbol
    Class: GravitySine
    Base Class: gravity.GravitySine

修改完之後,編譯時間從原本 30 秒大幅縮短到 9 秒呢
這是我修改完之後的 Box2D WCK Library Project,從 2011-06-15 那版改的