cocos2d-js 事件

1. 鼠标事件

使用cc.eventManager.addListener监听鼠标事件

cc.eventManager.addListener({
    event:cc.EventListener.MOUSE,  // 表示监听鼠标事件
    onMouseDown:function (event) {     // 监听鼠标按下
    },
    onMouseMove:function (event) {    // 鼠标移动
    },
    onMouseUp:function (event) {     //  鼠标弹起
    }
},node);

addListener接收两个参数,第一个参数是监听信息对象,第二个是监听的节点

判断当前平台是否有鼠标事件
'mouse' in cc.sys.capabilities;

var MouseEventLayer = cc.Layer.extend({
   ctor:function () {
       this._super();

       if('mouse' in cc.sys.capabilities) {
           cc.eventManager.addListener({
               event: cc.EventListener.MOUSE,
               onMouseDown:function(event){
                   var pos = event.getLocation();
                   var target = event.getCurrentTarget();
                   if(event.getButton() === cc.EventMouse.BUTTON_LEFT) {
                       console.log("LEFT BUTTON click at : " + pos.x+":"+pos.y);
                   } else if(event.getButton() === cc.EventMouse.BUTTON_RIGHT) {
                       console.log("RIGHT BUTTON click at : " + pos.x+":"+pos.y);
                   } else if(event.getButton() === cc.EventMouse.BUTTON_MIDDLE) {
                       console.log("MIDDLE BUTTON click at : " + pos.x+":"+pos.y);
                   } else if(event.getButton() === cc.EventMouse.BUTTON_4) {
                       console.log("MIDDLE 4 click at : " + pos.x+":"+pos.y);
                   } else if(event.getButton() === cc.EventMouse.BUTTON_5) {
                       console.log("MIDDLE 5 click at : " + pos.x+":"+pos.y);
                   } else if(event.getButton() === cc.EventMouse.BUTTON_6) {
                       console.log("MIDDLE 6 click at : " + pos.x+":"+pos.y);
                   } else if(event.getButton() === cc.EventMouse.BUTTON_7) {
                       console.log("MIDDLE 7 click at : " + pos.x+":"+pos.y);
                   } else if(event.getButton() === cc.EventMouse.BUTTON_8) {
                       console.log("MIDDLE 8 click at : " + pos.x+":"+pos.y);
                   }
               },
               onMouseMove : function (event) {
                   var pos = event.getLocation();
                   var target = event.getCurrentTarget();
                   console.log("Moving at : " + pos.x+":"+pos.y);
               },
               onMouseUp : function (event) {
                   var pos = event.getLocation();
                   var target = event.getCurrentTarget();
                   console.log("Up at : " + pos.x+":"+pos.y);
               }
           },this);
       } else {
           console.log("当前平台不支持鼠标");
       }
       return true;
   }
});

event参数是个对象,包含多个常用方法

  • event.getLocation : 获取事件发生的坐标
  • event.getLocationX/getLocationY : 获取一个值
  • event.getCurrentTarget: 获取当前处理鼠标事件的对象,也就是cc.eventManager.addListener传的第二个参数
  • event.getButton : 获取单击事件的键值
  • event.getDelta: 在onMouseMove事件处理函数中有效,获取本次移动的偏移值
  • event.getDeltaX/getDeltaY: 获取数值

2.触摸事件

1. 单点触摸

使用cc.eventManager.addListener监听单点触摸

var TouchEventLayer = cc.Layer.extend({
    ctor:function () {
        this._super();

        if('touches' in cc.sys.capabilities) {  //判断当前系统是否支持触摸
            cc.eventManager.addListener({
                event: cc.EventListener.TOUCH_ONE_BY_ONE,
                onTouchBegan:this.onTouchBegan,
                onTouchMoved : this.onTouchMoved,
                onTouchEnded :this.onTouchEnded,
                onTouchCancelled:this.onTouchCancelled
            },this);
        } else {
            console.log("当前平台不支持触摸");
        }

        return true;
    },
    onTouchBegan:function(touch,event){
        var pos = touch.getLocation();
        var id = touch.getID();
        console.log("onTouchBegan at : " + pos.x+":"+pos.y);
        var winSize = cc.director.getWinSize();
        if(pos.x < winSize/2){
            return true;   // 本次触摸是否生效,如果返回false,后续的moved和ended讲不再触发
        }
        return false;
    },
    onTouchMoved : function (touch,event) { // touch表示触摸对象
        var pos = touch.getLocation();
        var id = touch.getID();
        console.log("onTouchMoved at : " + pos.x+":"+pos.y);
    },
    onTouchEnded : function (touch,event) {
        var pos = touch.getLocation();
        var id = touch.getID();
        console.log("onTouchEnded at : " + pos.x+":"+pos.y);
    },
    onTouchCancelled:function (touch,event) {
        var pos = touch.getLocation();
        var id = touch.getID();
        console.log("onTouchCancelled at : " + pos.x+":"+pos.y);
    }
})

2.多点触摸

cc.eventManager.addListener({
    event:cc.EventListener.TOUCH_ALL_AT_ONCE,  // 表示监听多点事件
    onTouchesBegan : function(touches,event) {     // 触摸开始
    },
    onTouchesMoved : function(touches,event) {    // 触摸移动
    },
    onTouchEnded : function (touches,event) {     //  触摸结束
    },
    onTouchCancelled : function(touches,event){  // 触摸取消
    }
},node);

touches对象是一个数组,每个数组元素是一个touch对象
onTouchBegan不需要返回true/false,无法控制是否接触受本次触摸

3. 键盘事件

var KeyboardEventLayer = cc.Layer.extend({
    ctor:function () {
        this._super();
        if('keyboard' in cc.sys.capabilities) {
            cc.eventManager.addListener({
                event:cc.EventListener.KEYBOARD,
                onKeyReleased : function (keyCode,event) {
                    console.log("release " + keyCode);
                },
                onKeyPressed : function (keyCode,event) {
                    console.log("press "+ keyCode);
                }
            },this);
        } else {
            console.log("当前平台不支持键盘");
        }
    }
})

onKeyReleased 表示按下放开
onKeyPressed 表示按下
keyCode是一个数字

cc.KEY = {
    none:0,

    // android
    back:6,
    menu:18,

    // desktop
    backspace:8,
    tab:9,

    enter:13,

    shift:16, //should use shiftkey instead
    ctrl:17, //should use ctrlkey
    alt:18, //should use altkey
    pause:19,
    capslock:20,

    escape:27,
    space:32,
    pageup:33,
    pagedown:34,
    end:35,
    home:36,
    left:37,
    up:38,
    right:39,
    down:40,
    select:41,

    insert:45,
    Delete:46,
    0:48,
    1:49,
    2:50,
    3:51,
    4:52,
    5:53,
    6:54,
    7:55,
    8:56,
    9:57,
    a:65,
    b:66,
    c:67,
    d:68,
    e:69,
    f:70,
    g:71,
    h:72,
    i:73,
    j:74,
    k:75,
    l:76,
    m:77,
    n:78,
    o:79,
    p:80,
    q:81,
    r:82,
    s:83,
    t:84,
    u:85,
    v:86,
    w:87,
    x:88,
    y:89,
    z:90,

    num0:96,
    num1:97,
    num2:98,
    num3:99,
    num4:100,
    num5:101,
    num6:102,
    num7:103,
    num8:104,
    num9:105,
    '*':106,
    '+':107,
    '-':109,
    'numdel':110,
    '/':111,
    f1:112, //f1-f12 don't work on ie
    f2:113,
    f3:114,
    f4:115,
    f5:116,
    f6:117,
    f7:118,
    f8:119,
    f9:120,
    f10:121,
    f11:122,
    f12:123,

    numlock:144,
    scrolllock:145,

    ';':186,
    semicolon:186,
    equal:187,
    '=':187,
    ',':188,
    comma:188,
    dash:189,
    '.':190,
    period:190,
    forwardslash:191,
    grave:192,
    '[':219,
    openbracket:219,
    backslash:220,
    ']':221,
    closebracket:221,
    quote:222,

    // gamepad control
    dpadLeft:1000,
    dpadRight:1001,
    dpadUp:1003,
    dpadDown:1004,
    dpadCenter:1005
};

4.重力感应事件

var AccelerometerLayer = cc.Layer.extend({
    ctor:function () {
        this._super();
        var winSize = cc.director.getWinSize();

        if('accelerometer' in cc.sys.capabilities){
            cc.inputManager.setAccelerometerInterval(1/30); //设置重力感应的频率
            cc.inputManager.setAccelerometerEnabled(true);
            cc.eventManager.addListener({
                event:cc.EventListener.ACCELERATION,
                callback:function (accelerometerInfo,event) {
                    var target = event.getCurrentTarget();
                    console.log("x:"+accelerometerInfo.x+" y:"+accelerometerInfo.y + " z:"+accelerometerInfo.z);

                    var w = winSize.width;
                    var h = winSize.height;

                    var x = w*accelerometerInfo.x + w/2;
                    var y = h*accelerometerInfo.y + h/2;

                    x = x*0.2 + target.prevX*0.8; //小球慢慢移动到目标位置
                    y = y*0.2 + target.prevY*0.8;

                    target.prevX = x;
                    target.prevY = y;
                    target.sprite.x = x;
                    target.sprite.y = y;
                }
            },this);

            var sprite = this.sprite = new cc.sprite("res/item_2.png");
            this.addChild(sprite);
            sprite.x = winSize.width/2;
            sprite.y = winSize.height/2;

            this.prevX = 0;
            this.prevY = 0;

        } else {
            console.log("当前平台不支持重力感应");
        }
    }
})

5. 游戏进入后台/恢复显示事件

cc.eventManager.addCustomListener(cc.game.EVENT_HIDE,function () {
            //游戏进入后台
        });
        cc.eventManager.addCustomListener(cc.game.EVENT_SHOW,function () {
            //游戏恢复显示
        });

参考资料 Cocos2d-JS开发之旅 郑高强著 电子工业出版社

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,340评论 0 17
  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 56,472评论 51 597
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 5,985评论 4 26
  • 前言:世界太喧嚣,真实太稀少。每天的学习、交谈、行动中总有一些新的东西“冲击”我们的认知,我们会为此而惊呼:原来是...
    自作声阅读 3,296评论 0 3
  • 夏天如期而至,隔着窗户,外面晴空万里,在太阳的照射下,一切都光亮了起来。而玻璃这边的我,双手熟练的敲打着键盘...
    傅卷卷阅读 215评论 0 0