91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【cocos2d-x從c++到js】10:JS與C++的交互2——JS與C++的“函數重載”問題

發布時間:2020-06-12 16:23:20 來源:網絡 閱讀:3712 作者:老G 欄目:游戲開發

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


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

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


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


第一種、JS需要調用重載的C++函數接口

我們就以上面的函數為例,來看看在cxx-generator的自動生成代碼中,函數重載是如何處理的。打開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參數簡單判斷了一下參數個數,然后就執行對應的分支代碼就好了。但是如果遇到參數個數相同,而類型不同的情況呢?尚不得而知。


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

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來判斷參數個數,然后執行對應的分支代碼。


好了,重載就說道這里,下篇繼續~

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灯塔市| 盐池县| 吉木萨尔县| 河北省| 平谷区| 延津县| 会宁县| 中方县| 循化| 微博| 马公市| 元氏县| 高清| 册亨县| 沅陵县| 英德市| 平果县| 垦利县| 奉新县| 称多县| 安岳县| 蕉岭县| 阿拉善盟| 密云县| 普宁市| 崇义县| 凤山市| 长岛县| 兰州市| 方城县| 马龙县| 张家港市| 九寨沟县| 湘乡市| 南充市| 合川市| 阿克苏市| 绥化市| 老河口市| 米林县| 呈贡县|