关于cocos2d-js的事件注册和响应(有代码),请大神看看是否bug。

这里定义了一个菜单层,给按钮配了事件,但调试时响应不正常,点击屏幕的任何地方都打印日志“JS: 启动规则界面”。
请大家帮忙看看代码哪里有问题?

/**

  • 显示菜单
    */
    var MenuLayer = cc.Layer.extend({

    ctor : function () {
    this._super();

     //开始按钮
     var btn_start = new cc.Sprite(res.start_png);
     btn_start.x = cc.winSize.width/2;
     btn_start.y = cc.winSize.height/2 + 100;
     this.addChild(btn_start, 10);        
     cc.eventManager.addListener({
         event: cc.EventListener.TOUCH_ONE_BY_ONE,//单击
         swallowTouches: true,
         onTouchBegan: function(touch, event) {
             cc.log("启动主界面");
             //mainctrl.doMain();
             return true;
         }            
     }, btn_start);
     
     //规则按钮
     var btn_order = new cc.Sprite(res.order_png);
     btn_order.x = cc.winSize.width/2;
     btn_order.y = cc.winSize.height/2;
     this.addChild(btn_order, 20);
     cc.eventManager.addListener({
         event: cc.EventListener.TOUCH_ONE_BY_ONE,//单击
         swallowTouches: true,
         onTouchBegan: function(touch, event) {
             cc.log("启动规则界面");
             //mainctrl.doOrder();
             return true;
         }
     }, btn_order);
     
     //退出按钮
     var exit = new cc.Sprite(res.exit_png);
     exit.x = cc.winSize.width/2;
     exit.y = cc.winSize.height/2 - 150;
     this.addChild(exit);
    

    },

    onEnter : function () {
    this._super();
    //注册事件,全局的
    cc.eventManager.addListener({
    event: cc.EventListener.TOUCH_ONE_BY_ONE,//单击
    swallowTouches: true,
    onTouchEnded: function (touch, event) {
    cc.log(“点的不是按钮”);
    return true;
    }
    }, this);

    }
    });

    var btn_play= cc.MenuItemSprite.create(
        cc.Sprite.create(G.imgs.start_n),
        cc.Sprite.create(G.imgs.start_s),
        function(){

        }, this);

感谢1楼沙发的回答,我这里确实没有用菜单按钮的方法实现。
我的问题是事件的响应控制不知道存在什么异常,为啥这个类里边有三个事件,但只有一个能响应,而且它还变成全局的了,整个屏幕无论按哪里都响应。
请大家帮我查查到底啥问题?

触摸事件的时候要判断target

to 3楼, 这个应该不是答案。在游戏场景里边这么做比较合理,只需要把一个点击事件绑在层上即可,但这个应该不是我的问题所要关注的,我考虑的是多个对象的点击事件如何区分。

这个文档中的例子类似,我把代码拷贝到我的程序略作改动,也是同样的错误,拖动第二个图形的时候,第三个会跟着一起动。
http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/html5/v3/eventManager/zh.md

代码如下:
/**

  • 显示菜单
    */
    var MenuLayer = BaseViewLayer.extend({

    ctor : function () {
    this._super();

     var sprite1 = cc.Sprite.create(res.start_png);
     sprite1.x = cc.winSize.width/2 - 80;
     sprite1.y = cc.winSize.height/2 + 80;
     this.addChild(sprite1, 10);
    
     var sprite2 = cc.Sprite.create(res.order_png);
     sprite2.x = cc.winSize.width/2;
     sprite2.y = cc.winSize.height/2;
     this.addChild(sprite2, 20);
    
     var sprite3 = cc.Sprite.create(res.exit_png);
     sprite3.x = 0;
     sprite3.y = 0;
     sprite2.addChild(sprite3, 30);
     
     
     // 创建一个事件监听器 OneByOne 为单点触摸
     var listener1 = cc.EventListener.create({
         event: cc.EventListener.TOUCH_ONE_BY_ONE,
         swallowTouches: true,                        // 设置是否吞没事件,在 onTouchBegan 方法返回 true 时吞没
         onTouchBegan: function (touch, event) {        //实现 onTouchBegan 事件回调函数
             var target = event.getCurrentTarget();    // 获取事件所绑定的 target
    
             // 获取当前点击点所在相对按钮的位置坐标
             var locationInNode = target.convertToNodeSpace(touch.getLocation());   
             var s = target.getContentSize();
             var rect = cc.rect(0, 0, s.width, s.height);
    
             if (cc.rectContainsPoint(rect, locationInNode)) {        // 点击范围判断检测
                 cc.log("sprite began... x = " + locationInNode.x + ", y = " + locationInNode.y);
                 target.opacity = 180;
                 return true;
             }
             return false;
         },
         onTouchMoved: function (touch, event) {            // 触摸移动时触发
             // 移动当前按钮精灵的坐标位置
             var target = event.getCurrentTarget();
             var delta = touch.getDelta();
             target.x += delta.x;
             target.y += delta.y;
         },
         onTouchEnded: function (touch, event) {            // 点击事件结束处理
             var target = event.getCurrentTarget();
             cc.log("sprite onTouchesEnded.. ");
             target.setOpacity(255);
             if (target == sprite2) {                    // 重新设置 ZOrder,显示的前后顺序将会改变
                 sprite1.setLocalZOrder(100);
             } else if (target == sprite1) {
                 sprite1.setLocalZOrder(0);
             }
         }
     });
     
     cc.eventManager.addListener(listener1, sprite1);
     cc.eventManager.addListener(listener1.clone(), sprite2);
     cc.eventManager.addListener(listener1.clone(), sprite3);
    

    },

    onEnter : function () {
    this._super();
    }
    });

纠结中。。。。。。。。。。。。。。。

暂时的解决方法是按hellokittyer 兄类似的建议,全部给打包成菜单处理了。

过段时间回头再看看有没有跟好的解决。

    var mnui_start = cc.MenuItemImage.create(
            res.start_png,
            res.start_png,
            function () {
                cc.log("start!");
            },this);
    mnui_start.attr({
        x : cc.winSize.width/2,
        y : cc.winSize.height/2 + 100  //,
        //anchorX: 0.5,
        //anchorY: 0.5
    });
    var menu_start = cc.Menu.create(mnui_start);
    menu_start.x = 0;
    menu_start.y = 0;
    this.addChild(menu_start, 1);

感觉代码臃肿了不少。

感谢你!等过段时间经验再丰富点,再回头考虑考虑看看是否有办法。

用Button不行么?一定要用Sprite么?
var button = ccui.Button.create();
button.setTouchEnabled(true);
button.loadTextures(res.start_png, res.start_png, res.start_png);
button.addTouchEventListener(this.touchEvent, this);

touchEvent: function (sender, type) {
    switch (type)
    {
    case ccui.Widget.TOUCH_ENDED:

你有没有遇到过,在浏览器里调试,侦听事件就能响应,但是使用code IDE的 Cocos JSBinding运行,就怎么点也都没有任何反应,甚至连侦听的方法都进不去?

请问楼主 现在问题解决了吗, 我遇到了同样的问题