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閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,483評論 0 17
  • 好奇觸摸事件是如何從屏幕轉移到APP內的?困惑于Cell怎么突然不能點擊了?糾結于如何實現這個奇葩響應需求?亦或是...
    Lotheve閱讀 57,650評論 51 601
  • 在iOS開發中經常會涉及到觸摸事件。本想自己總結一下,但是遇到了這篇文章,感覺總結的已經很到位,特此轉載。作者:L...
    WQ_UESTC閱讀 6,060評論 4 26
  • 前言:世界太喧囂,真實太稀少。每天的學習、交談、行動中總有一些新的東西“沖擊”我們的認知,我們會為此而驚呼:原來是...
    自作聲閱讀 3,372評論 0 3
  • 夏天如期而至,隔著窗戶,外面晴空萬里,在太陽的照射下,一切都光亮了起來。而玻璃這邊的我,雙手熟練的敲打著鍵盤...
    傅卷卷閱讀 221評論 0 0