zoukankan      html  css  js  c++  java
  • 在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.Director.getInstance().getTouchDispatcher().addTargetedDelegate(node, priority, true);


    整合版

    为了在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);
        }
    };


    好了,本文完结,标准代理和注销代理也是类似的处理方法,可以自己看。


  • 相关阅读:
    mysql 之 union 分类: database 测试 2014-02-12 11:59 218人阅读 评论(0) 收藏
    MySql模糊查询like通配符使用详细介绍 分类: database 测试 2014-02-12 10:19 6829人阅读 评论(1) 收藏
    sed(查找替换) 与awk(提取字段) 分类: ubuntu 测试 2014-02-11 12:08 4074人阅读 评论(0) 收藏
    Linux命令行uniq 分类: ubuntu 测试 2014-02-10 17:52 341人阅读 评论(0) 收藏
    n&1判断奇偶 分类: python基础学习 测试 2014-02-10 15:41 636人阅读 评论(0) 收藏
    vue-cli安装
    input事件
    Edusohu搭建
    Ngxin代理服务基本概述
    五种IO模型---转载
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3178036.html
Copyright © 2011-2022 走看看