在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ JS 與 C++ 的交互 2——JS 與 C++ 的“函數(shù)重載”問題
cocos2d-x for js 中的繼承
JS 與 C++ 的交互 1——JS 代碼調(diào)用 C++ 代碼
迎接腳本時代的到來
解決在 vs 中修改 js 源文件無效
JS 腳本語言的優(yōu)勢與一些問題
注冊函數(shù)
回調(diào)函數(shù) 2
cxx-generator JS 綁定工具
使用 cocos2d-console 工具轉(zhuǎn)換腳本為字節(jié)碼
hybrid 開發(fā)模式
JS 與 C++ 的交互 2——JS 與 C++ 的“函數(shù)重載”問題
回調(diào)函數(shù)1——按鍵回調(diào)
Google 的繼承寫法解析
John Resiq 的繼承寫法解析
JS 與 C++ 的交互 3——C++ 和 JS 類型轉(zhuǎn)換
傀儡構(gòu)造函數(shù)

JS 與 C++ 的交互 2——JS 與 C++ 的“函數(shù)重載”問題

對于 C++ 來說,存在函數(shù)重載,例如:

void CCNode::setScale(float scale)
void CCNode::setScale(float scaleX,float scaleY)

這兩個函數(shù)的函數(shù)名是一樣的,但是參數(shù)表不同。最終在編譯器編譯后的函數(shù)簽名不一樣。

但是在 JavaScript 中并沒有這種機制。怎么破?存在兩種情況:

第一種、JS 需要調(diào)用重載的 C++ 函數(shù)接口 我們就以上面的函數(shù)為例,來看看在 cxx-generator 的自動生成代碼中,函數(shù)重載是如何處理的。打開 jsb_cocos2dx_auto.cpp,找到如下代碼:

JSBool js_cocos2dx_Node_setScale(JSContext *cx, uint32_t argc, jsval *vp)
{
    jsval *argv = JS_ARGV(cx, vp);
    JSBool ok = JS_TRUE;
    JSObject *obj = NULL;
    cocos2d::Node* cobj = NULL;
    obj = JS_THIS_OBJECT(cx, vp);
    js_proxy_t *proxy = jsb_get_js_proxy(obj);
    cobj = (cocos2d::Node *)(proxy ? proxy->ptr : NULL);
    JSB_PRECONDITION2( cobj, cx, JS_FALSE, "js_cocos2dx_Node_setScale : Invalid Native Object");
    do {
        if (argc == 2) {
            double arg0;
            ok &= JS_ValueToNumber(cx, argv[0], &arg0);
            if (!ok) { ok = JS_TRUE; break; }
            double arg1;
            ok &= JS_ValueToNumber(cx, argv[1], &arg1);
            if (!ok) { ok = JS_TRUE; break; }
            cobj->setScale(arg0, arg1);
            JS_SET_RVAL(cx, vp, JSVAL_VOID);
            return JS_TRUE;
        }
    } while(0);
    do {
        if (argc == 1) {
            double arg0;
            ok &= JS_ValueToNumber(cx, argv[0], &arg0);
            if (!ok) { ok = JS_TRUE; break; }
            cobj->setScale(arg0);
            JS_SET_RVAL(cx, vp, JSVAL_VOID);
            return JS_TRUE;
        }
    } while(0);
    JS_ReportError(cx, "js_cocos2dx_Node_setScale : wrong number of arguments");
    return JS_FALSE;
}

只是通過 argc 參數(shù)簡單判斷了一下參數(shù)個數(shù),然后就執(zhí)行對應(yīng)的分支代碼就好了。但是如果遇到參數(shù)個數(shù)相同,而類型不同的情況呢?尚不得而知。

第二種、不需要調(diào)用 C++ 函數(shù)接口,直接在 JS 層代碼中模擬一下函數(shù)重載。這個就要利用 JS 語言的一些特性了。我們直接看 Cocos2d-html5 中的對應(yīng)代碼。哦,no,因為 html5 里面關(guān)于 CCNode::setScale 函數(shù)寫了一點雜技代碼。所以我們改成看 setPosition 函數(shù)吧。也是一樣的。

setPosition:function (newPosOrxValue, yValue) {
    var locPosition = this._position;
    if (arguments.length == 2) {
        locPosition._x = newPosOrxValue;
        locPosition._y = yValue;
    } else if (arguments.length == 1) {
        locPosition._x = newPosOrxValue.x;
        locPosition._y = newPosOrxValue.y;
    }
    this.setNodeDirty();
},

可以看到,該代碼使用了 JS 的 arguments 來判斷參數(shù)個數(shù),然后執(zhí)行對應(yīng)的分支代碼。

好了,重載就說道這里,下篇繼續(xù)~