在cocos2d-x jsb/html5中设置触摸代理的方法
来源:互联网 发布:python字典 key为元组 编辑:程序博客网 时间:2024/06/04 18:45
和官方的说明不同,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中时触摸有效
分为两步
---
待续
- 在cocos2d-x jsb/html5中设置触摸代理的方法
- cocos2d-x jsb 防止触摸事件传递
- 记录cocos2d-html5与cocosd-x jsb中遇到的坑
- 使用COCOS2D-X JSB开发,在js页面中设置iOS键盘模式
- cocos2d-html5 打包后JSB不支持的方法汇总
- cocos2d-html5 和 cocos2d-jsb的区别
- cocos2d-x js binding tips 1 使用cocosbuilder导入jsb后无法响应触摸的问题
- Cocos2d-x jsb + Cocos2d-html5 跨平台游戏开发(二)—— 遇到的坑
- Cocos2d-x jsb + Cocos2d-html5 跨平台游戏开发(二)—— 遇到的坑
- 设置触摸代理的方法
- Cocos2d-x JSB + cocos2d-html5 跨平台游戏开发
- Cocos2d-x中jsb结构剖析
- JSB Cocos2d-x Javascript
- COCOS2d-x JSB 使用cc.LabelTTF在Andoird上闪退
- Cocos2d-x中触摸事件
- cocos2d-x 2.2.2 在lua中使用触摸机制
- cocos2d-x 3.2 |如何在Layer中实现用户触摸
- 关于Cocos2d-x中触摸事件的setSwallowTouches 方法的解析
- 解决dsoframer 在X86和X64系统上的使用问题
- WPF写入剪切板时报异常
- poj 1837 Balance
- Windows 8安装NetFx3出错
- MFC网络编程总结
- 在cocos2d-x jsb/html5中设置触摸代理的方法
- Myeclipse中的Maven命令解释
- javascript cookies 存、取、删除实例
- PHP 分页代码
- 让MYSQL支持INNODB的方法
- 一个实际例子看漏测的严重后果
- 学习记录(coursera)
- Ext3 学习(3) -- 表单验证
- sqlite的使用方法《主要怕自己忘记了,特意总结下,以后会继续补充》