cocos2d第五篇--用戶事件

在移動平臺中用戶輸入的方式有觸摸屏幕周荐,鍵盤輸入和各種傳感器城丧。這些用戶輸入被封裝成為事件宛篇,列如,在iOS平臺有觸摸事件和加速度事件等跌捆,在Android和windows phone平臺有觸摸事件徽职,鍵盤事件和加速度事件等

事件

事件類是Event,類圖如下:
屏幕快照 2018-01-08 上午11.07.28.png
  • EventTouch(觸摸事件)
  • EventMouse(鼠標(biāo)事件)
  • EventKeyboard(鍵盤事件)
  • EventAcceleration(加速度事件)
  • EventCustom(自定義事件)
    事件源是cocos2d中的精靈佩厚,層姆钉,菜單等節(jié)點(diǎn)對象

事件處理者

Cocos2d-x中的事件處理者是事件監(jiān)聽器類EventListener,它的類圖如下圖:
屏幕快照 2018-01-08 上午11.10.56.png
  • EventListenerTouchOneByOne(單點(diǎn)觸摸事件監(jiān)聽器)
  • EventListenerTouchAllAtOnce(多點(diǎn)觸摸事件監(jiān)聽器)
  • EventListenerKeyboard (鍵盤事件監(jiān)聽器)
  • EventListenerMouse(鼠標(biāo)事件監(jiān)聽器)
  • EventListenerAcceration(加速度事件監(jiān)聽器)

事件分發(fā)器

從前面的類圖和命名上可以看出事件監(jiān)聽器與事件具有對應(yīng)關(guān)系可款。例如育韩,鍵盤事件(EventKeyboard)只能由鍵盤事件監(jiān)聽器處理(EventListenerKeyboard),他們之間需要在程序中建立關(guān)系,這種關(guān)系的建立過程被稱為“注冊監(jiān)聽器”闺鲸。cocos2d-x提供一個(gè)事件分發(fā)器負(fù)責(zé)管理這種關(guān)系筋讨。
EventDispatcher類采用單例設(shè)計(jì)模式通過:Director::getInstance()->getEventDispatcher()語句獲得事件分發(fā)器對象。

EventDispatcher類中注冊事件監(jiān)聽器到事件分發(fā)器函數(shù)如下:

  • 1)void addEventListenerWithFixedPriority(EventListener *listener摸恍,int fixedPriority)悉罕。指定固定的時(shí)間優(yōu)先級注冊監(jiān)聽器赤屋,事件優(yōu)先級決定事件響應(yīng)的優(yōu)先級別,值越小優(yōu)先級越高

  • 2)void addEventListenerWithSceneGraphPriority(EventListener *listener壁袄,Node *node)类早。把精靈顯示優(yōu)先級作為事件優(yōu)先級,

當(dāng)不再進(jìn)行事件響應(yīng)時(shí)嗜逻,應(yīng)該注銷事件監(jiān)聽器涩僻,主要的注銷函數(shù)如下:

  • 1)void removeEventListener(EventListener *listener).注銷指定的事件監(jiān)聽器。
  • 2)void removeCustomEventListeners(const std::string & customEventName).注銷自定義事件監(jiān)聽器栈顷。
  • 3)void removeAllEventListeners().注銷所有的事件監(jiān)聽器逆日,需要注意的是,使用該函數(shù)后萄凤,菜單也不能響應(yīng)事件了室抽,因?yàn)樗残枰邮苡|摸事件。

觸摸事件

觸摸事件有兩個(gè)事件監(jiān)聽器:EventListenerTouchOneByOneEventListenerTouchAllAtOnce靡努,分別對應(yīng)單點(diǎn)觸摸和多點(diǎn)觸摸坪圾。這些監(jiān)聽器有一些觸摸事件響應(yīng)屬性,這些屬性對應(yīng)著觸摸事件不同階段惑朦。通過設(shè)置這些屬性能夠?qū)崿F(xiàn)事件與事件處理者函數(shù)的關(guān)聯(lián)兽泄。EventListenerTouchOneByOne中觸摸事件響應(yīng)屬性:
1)std::function<bool(Touch *,Event *)>onTouchBegan。當(dāng)一個(gè)手指觸碰屏幕時(shí)回調(diào)該屬性所指定的函數(shù)行嗤。如果函數(shù)返回值為true,則可以回調(diào)后面的兩個(gè)屬性(onTouchMoved和onTouchEnded)所指定的函數(shù)已日,否則不回調(diào)垛耳。

2)std::function<void(Touch *,Event *)>onTouchMoved栅屏。當(dāng)一個(gè)手指在屏幕移動時(shí)回調(diào)該屬性所指定的函數(shù)

3)std::function<void(Touch *,Event *)>onTouchEnded。當(dāng)一個(gè)手指離開屏幕時(shí)回調(diào)該屬性所指定的函數(shù)堂鲜。

4)std::function<void(Touch *,Event *)>onTouchCancelled栈雳。當(dāng)單點(diǎn)觸摸事件被取消時(shí)回調(diào)該屬性所指定的函數(shù)。

EventListenerTouchAllAtOnce中觸摸事件響應(yīng)屬性:
1)std::function<void(const std::vector<Touch *>&,Event)>onTouchesBegan缔莲。當(dāng)多個(gè)手指觸碰屏幕時(shí)回調(diào)該屬性所指定的函數(shù)
2)std::function<void(const std::vector<Touch *>&,Event *)onTouchesMoved哥纫。當(dāng)多個(gè)手指在屏幕上移動時(shí)回調(diào)該屬性所指定的函數(shù)。
3)std::function<void(const std::vector<Touch *>&,Event *)>onTouchesEnded痴奏。當(dāng)多個(gè)手指離開屏幕時(shí)回調(diào)該屬性所指定的函數(shù)蛀骇。
4)std::function<void(const std::vector<Touch *>&,Event *)>onTouchesCancelled。當(dāng)多點(diǎn)觸摸事件被取消時(shí)回調(diào)該屬性所指定的函數(shù)读拆。
使用這些屬性的代碼片段演示了它們的使用;

  auto listener = EventListenerTouchOneByOne::create();
  listener -> onTouchBegan = CC_CALLBACK_2(HelloWorld::touchBegan,this);

bool HelloWorld::touchBegan(Touch *touch,Event *event)
{
        return false;
}

首先需要使用EventListenerTouchOneByOne::create()來創(chuàng)建單獨(dú)觸摸事件監(jiān)聽器對象擅憔。然后設(shè)置它的listener -> onTouchBegan屬性,其中CC_CALLBACK_2是使用CC_CALLBACK_2宏綁定回調(diào)函數(shù)檐晕,該函數(shù)是下面定義的bool HelloWorld::touchBegan(Touch *touch,Event *event)函數(shù)暑诸。

觸摸事件的空間方面

空間方面就是每個(gè)觸摸點(diǎn)對象包括了當(dāng)前位置信息蚌讼,以及之前的位置信息(如果有的話)下面的函數(shù)是可以獲得觸摸點(diǎn)之前的位置信息:

Vec2 getPreviousLocationInView()//UI坐標(biāo)
Vec2 getPreviousLocation()//OpenGL坐標(biāo)

下面的函數(shù)是可以獲得觸摸點(diǎn)當(dāng)前的位置信息。

Vec2 getLocationInView()//UI坐標(biāo)
Vec2 getLocation()//OpenGL坐標(biāo)

單點(diǎn)觸摸事件

下面以一個(gè)拖動一個(gè)精靈對象來實(shí)現(xiàn)單點(diǎn)觸摸事件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末个榕,一起剝皮案震驚了整個(gè)濱河市篡石,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌西采,老刑警劉巖凰萨,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異械馆,居然都是意外死亡沟蔑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門狱杰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來底燎,“玉大人,你說我怎么就攤上這事硼被∧琶龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵错沽,是天一觀的道長簿晓。 經(jīng)常有香客問我,道長千埃,這世上最難降的妖魔是什么憔儿? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮放可,結(jié)果婚禮上谒臼,老公的妹妹穿的比我還像新娘。我一直安慰自己耀里,他們只是感情好蜈缤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冯挎,像睡著了一般底哥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上房官,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天趾徽,我揣著相機(jī)與錄音,去河邊找鬼翰守。 笑死孵奶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潦俺。 我是一名探鬼主播拒课,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼徐勃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了早像?” 一聲冷哼從身側(cè)響起僻肖,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卢鹦,沒想到半個(gè)月后臀脏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冀自,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年揉稚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熬粗。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搀玖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驻呐,到底是詐尸還是另有隱情灌诅,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布含末,位于F島的核電站猜拾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏佣盒。R本人自食惡果不足惜挎袜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肥惭。 院中可真熱鬧盯仪,春花似錦、人聲如沸务豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笼沥。三九已至,卻和暖如春娶牌,著一層夾襖步出監(jiān)牢的瞬間奔浅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工诗良, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汹桦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓鉴裹,卻偏偏與公主長得像舞骆,于是被迫代替她去往敵國和親钥弯。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • -- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點(diǎn)觸摸的強(qiáng)大功能胧谈,喬布斯讓人們認(rèn)識到手機(jī)其實(shí)...
    翹楚iOS9閱讀 2,961評論 0 13
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程忆肾,因...
    小菜c閱讀 6,424評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)菱肖,斷路器客冈,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 在iOS開發(fā)中經(jīng)常會涉及到觸摸事件。本想自己總結(jié)一下稳强,但是遇到了這篇文章郊酒,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載键袱。作者:L...
    WQ_UESTC閱讀 6,010評論 4 26
  • 人生或許悲苦燎窘,但是請你足夠相信 在夢一般的年華里,卻要承受含淚的記憶蹄咖,這淚水不包含歡喜褐健,不代表留戀。不幸的人生澜汤,各...
    Lareine_6c39閱讀 326評論 0 0