在移動平臺中用戶輸入的方式有觸摸屏幕周荐,鍵盤輸入和各種傳感器城丧。這些用戶輸入被封裝成為事件宛篇,列如,在iOS平臺有觸摸事件和加速度事件等跌捆,在Android和windows phone平臺有觸摸事件徽职,鍵盤事件和加速度事件等
事件
事件類是Event,類圖如下:-
EventTouch
(觸摸事件) -
EventMouse
(鼠標(biāo)事件) -
EventKeyboard
(鍵盤事件) -
EventAcceleration
(加速度事件) -
EventCustom
(自定義事件)
事件源是cocos2d中的精靈佩厚,層姆钉,菜單等節(jié)點(diǎn)對象
事件處理者
Cocos2d-x中的事件處理者是事件監(jiān)聽器類EventListener,它的類圖如下圖:-
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)聽器:EventListenerTouchOneByOne
和EventListenerTouchAllAtOnce
靡努,分別對應(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)觸摸事件