在cocos2d-x jsb/html5中設置觸摸代理的方法

和官方的說明不同,js binding的很多api和ch5版是不一樣的。遇到不一樣的就需要我們努力去看源碼尋找了。

主要是以下幾個文件

cocos2d_specifics.cpp cocos2d_specifics.hpp ScriptingCore.cpp ScriptingCore.h

好了廢話不說,接下來說主題。

在ch5版本當中設置觸摸代理與jsb版本的api不一樣,這裏以目標代理爲例。

ch5版本的設置方法


cc.Director.getInstance().getTouchDispatcher().addTargetedDelegate(node, priority, true);

這樣就沒有問題了,沒什麼可說的

jsb版本的設置方法

上面那句要是放到jsb版本立馬報錯,告訴你這不是個function。於是我們怒看源碼。

搜索一下addTargetedDelegate,在cocos2d_specifics.cpp裏面找到了

void JSTouchDelegate::registerTargettedDelegate(int priority, bool swallowsTouches)
 { 
	CCDirector* pDirector = CCDirector::sharedDirector(); 
	pDirector->getTouchDispatcher()->addTargetedDelegate(this, priority, swallowsTouches);
 }

然後再看下哪裏調用了它。

JSBool js_cocos2dx_JSTouchDelegate_registerTargettedDelegate(JSContextcx, uint32_t argc, jsval vp) { 
    if (argc >= 1){ 
        jsval argv = JS_ARGV(cx, vp); 
	JSObject jsobj = NULL; 
	JSTouchDelegate *touch = new JSTouchDelegate(); touch->autorelease();
	touch->registerTargettedDelegate((argc >= 1 ? JSVAL_TO_INT(argv[0]) : 0), (argc >= 2 ? JSVAL_TO_BOOLEAN(argv[1]) : true));
	jsobj = (argc == 3 ? JSVAL_TO_OBJECT(argv[2]) : JSVAL_TO_OBJECT(JSVAL_VOID));
	touch->setJSObject(jsobj); JSTouchDelegate::setDelegateForJSObject(jsobj, touch);
	return JS_TRUE;
    }
    JS_ReportError(cx, “wrong number of arguments: %d, was expecting >=1”, argc);
    return JS_FALSE;
}


接下來再看哪裏註冊了js_cocos2dx_JSTouchDelegate_registerTargettedDelegate

是的,我們找到了

JS_DefineFunction(cx, ns, "registerTargettedDelegate", js_cocos2dx_JSTouchDelegate_registerTargettedDelegate, 1, JSPROP_READONLY | JSPROP_PERMANENT);

所以我們要使用的方法就是cc.registerTargettedDelegate()了。至於參數我們可以參照上面的js_cocos2dx_JSTouchDelegate_registerTargettedDelegate方法

最後的結論,在jsb下我們應該使用

cc.registerTargettedDelegate(priority, true, node);


整合版

爲了在ch5和jsb下同樣有效,我們就要在代碼中判斷當前平臺

var addTargetedDelegate = function (node, priority){
    if ("opengl" in sys.capabilities && "browser" != sys.platform){
        cc.registerTargettedDelegate(priority, true, node);
    }
    else {
        cc.Director.getInstance().getTouchDispatcher().addTargetedDelegate(node, priority, true);
    }
};


好了,標準代理和註銷代理也是類似的處理方法,可以自己看。

補充關於目標代理的觸摸範圍和

這個是屬於cocos2d-x的部分,不過在這裏就補充說明一下。

使用目標代理時觸摸的生效範圍並不只是獲得目標代理的node本身,而是增加了一整個觸摸有效的層(這個層並不實際存在,但是它卻接受觸摸。)而且這個層不會自動消失,必須在當整個層退出時註銷它。

因此有兩個問題是必須解決的。

使僅當觸摸範圍在node中時觸摸有效

分爲兩步

---

待續



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章