因為蘋果不允許 App 下載可執行代碼,所以用動態連結庫構建外掛式引擎並透過網路下載在 iOS 上無法實現。但有一種方式是在引擎內部整合一個腳本解譯器,然後將腳本作為資源下載(腳本是加密的),以此繞過蘋果的審核條款。這種方式稱為 Hybrid(混合模式)。雖然這樣做無法做到完全不留痕跡,但深層原因在於 Hybrid 牽涉利益太大,蘋果也算睜一隻眼閉一隻眼。
在 cocos2d 引擎的諸多分支中,cocos2d-x 的開發以 C++ 為核心。cocos2d-x 引擎正是透過 Hybrid 方式來執行 JS 代碼。為了執行 JS 代碼,引擎本身需要一個腳本解譯器,引擎整合的腳本解譯器叫做:SpiderMonkey。
SpiderMonkey 是一個歷史悠久的基於 C/C++ 編寫的 JS 腳本解譯器,由 Mozilla 提供,知名的 Firefox 和 Thunderbird 都在使用。cocos2d-x 整合 SpiderMonkey 的開源協議是 MPL 2.0,沒有什麼限制,可以放心使用。
在 AppDelegate::applicationDidFinishLaunching() 函式中,可以找到啟動腳本引擎的代碼:
- ScriptingCore* sc = ScriptingCore::getInstance();
- sc->addRegisterCallback(register_all_cocos2dx);
- sc->addRegisterCallback(register_cocos2dx_js_extensions);
- sc->addRegisterCallback(register_CCBuilderReader);
- sc->addRegisterCallback(jsb_register_chipmunk);
- sc->start();
- CCScriptEngineProtocol *pEngine = ScriptingCore::getInstance();
- CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
- ScriptingCore::getInstance()->runScript("MoonWarriors-jsb.js");
ScriptCore 是腳本的核心,也就是我們說的 JS 解譯器。cocos2d-x 將 SpiderMonkey 的解譯器進行了封裝,以提供對 cocos2d-x 引擎的相關支援,並簡化相應的呼叫介面。
addRegisterCallback 介面用於新增註冊函式,註冊函式用於在引擎執行時,綁定相應的代碼從 JS 往 C++ 的映射代碼。每一個註冊函式對應一個庫。目前 cocos2d-x 提供了四個庫支援,分別是 cocos2d-x 核心庫、cocos2d-x 擴充庫、CocosBuilder 支援庫、Chipmunk 物理引擎庫。未來你可以在這裡新增註冊自己實現的 JS 綁定庫,來直接擴充這個 JS 引擎。
start 啟動腳本引擎。
CCScriptEngineManager::sharedManager()->setScriptEngine 這句是將腳本引擎綁定到引擎管理器上,引擎管理器提供對腳本引擎的一個全域存取點,並負責對腳本引擎的卸載。
最後就是執行遊戲的主腳本了:ScriptingCore::getInstance()->runScript("MoonWarriors-jsb.js");