在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中时触摸有效

分为两步

---

待续



你可能感兴趣的:(cocos2dx,cocos2d-x,js-binding)