cocos2dx 3.x触屏时间分为单点触摸和多点触摸:
单点触摸:(即只有注册的Layer才能接收触摸事件)
多点触摸点单用法(多个Layer获取屏幕事件):
1、单点触摸
1.1 基本函数
如果返回true:本层的后续Touch事件可以被触发,并阻挡向后层传递
如果返回false,本层的后续Touch事件不能被触发,并向后传递,也就是不会调用
1
|
virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
|
a.返回false,则ccTouchMoved(),ccTouchEnded()不会再接收到消息
b.返回true,则ccTouchMoved(),ccTouchEnded()可以接收到消息
1
|
virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
|
a.返回false,则本层的onTouchMoved(),onTouchEnded()不会再接收到消息,但是本层之下的其它层会接收到消息
b.返回true,则本层的onTouchMoved(),onTouchEnded()可以接收到消息,但是本层之下的其它层不能再接收到消息
1.2 使用示例
在Layer中添加如下代码,并重载onTouchxxx函数
ps:
listener->setSwallowTouches(true),不向下触摸,简单点来说,比如有两个sprite ,A 和 B,A在上B在下(位置重叠),触摸A的时候,B不会受到影响;
listener->setSwallowTouches(false)反之,向下传递触摸,触摸A也等于触摸了B;
Cocos2dx Lua 单点触摸事件
local BaseMap=class("BaseMap",function()
return cc.Layer:create()
end)
BaseMap.init=function(self)
self._size=cc.Director:getInstance():getVisibleSize()
self._mapres=""
self._level=0
end
BaseMap.setTouchEnable=function(self,enable)
local function onTouchBegin(touch, event)
self:onTouchBegin(touch:getLocation())
end
local function onTouchEnd(touch, event)
self:onTouchEnd(touch:getLocation())
end
if enable == true then
local listener = cc.EventListenerTouchOneByOne:create()
listener:registerScriptHandler(onTouchBegin,cc.Handler.EVENT_TOUCH_BEGAN )
listener:registerScriptHandler(onTouchEnd,cc.Handler.EVENT_TOUCH_ENDED )
local eventDispatcher = self:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, self)
end
end
BaseMap.onTouchBegin=function(self,touch)
end
BaseMap.onTouchEnd=function(self,touch)
end
return BaseMap
2、多点触摸
注意:
多点触摸,onTouchsBegan函数的参数和返回值与单点触摸的参数和返回值的差异
3、eventDispatcher
_eventDispatcher 是 Node 的属性,通过它管理当前节点(如 场景 、层、精灵等 )的所有事件分发情况。但是它本身是一个单例模式值的引用,在 Node 构造函数中,通过 "Director::getInstance()>getEventDispatcher();" 获取,有了这个属性,我们能更为方便的调用。
3.1 获取方法
3.2 事件监听类型
事件监听器包含以下几种:
- 触摸事件 (EventListenerTouch)
- 键盘响应事件 (EventListenerKeyboard)
- 加速记录事件 (EventListenerAcceleration)
- 鼠标响应事件 (EventListenerMouse)
- 自定义事件 (EventListenerCustom)
以上事件监听器统一由 _eventDispatcher 来进行管理。
3.3 优先权
1.优先级越低,越先响应事件
2.如果优先级相同,则上层的(z轴)先接收触摸事件
有两种方式将 事件监听器 listener 添加到 事件调度器_eventDispatcher 中:
addEventListenerWithSceneGraphPriority实现:
addEventListenerWithFixedPriority实现:
注意:
(1)addEventListenerWithSceneGraphPriority 的事件监听器优先级是0,而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的。这里当我们再次使用 listener 的时候,需要使用 clone() 方法创建一个新的克隆,因为在使用 addEventListenerWithSceneGraphPriority 或者 addEventListenerWithFixedPriority 方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。
clone实现:
(2)另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。
addEventListenerWithFixedPriority listener 移除方法:
1
|
dispatcher->removeEventListener(listener);
|
|
请发表评论