cocos2dx 3.2 触摸机制
来源:互联网 发布:赵公明 知乎 编辑:程序博客网 时间:2024/06/11 17:59
在cocos2dx 3.2版本中,废弃了以往2.x版本的写法,我们先来看一下Layer.h中的一段代码
//单点触摸
virtual bool onTouchBegan(Touch *touch, Event *unused_event);
virtual
void
onTouchMoved(Touch *touch, Event *unused_event);
virtual
void
onTouchEnded(Touch *touch, Event *unused_event);
virtual
void
onTouchCancelled(Touch *touch, Event *unused_event);
//多点触摸
virtual
void
onTouchesBegan(
const
std::vector<touch*>& touches, Event *unused_event);
virtual
void
onTouchesMoved(
const
std::vector<touch*>& touches, Event *unused_event);
virtual
void
onTouchesEnded(
const
std::vector<touch*>& touches, Event *unused_event);
virtual
void
onTouchesCancelled(
const
std::vector<touch*>&touches, Event *unused_event);</touch*></touch*></touch*></touch*>
单点触摸:(即只有注册的Layer才能接收触摸事件)
onTouchBegan:如果返回true: 本层的后续Touch事件可以被触发,并阻挡向后层传递
如果返回false, 本层的后续Touch事件不能被触发,并向后传递
简单点来说, 如果
1.Layer 只有一层的情况:
virtual bool onTouchBegan( CCTouch *pTouch, CCEvent *pEvent);a.返回false,则ccTouchMoved(),ccTouchEnded()不会再接收到消息
b.返回true,则ccTouchMoved(),ccTouchEnded()可以接收到消息
2.Layer 有多层的情况:
virtual bool onTouchBegan( CCTouch *pTouch, CCEvent *pEvent);
a.返回false,则本层的onTouchMoved(),onTouchEnded()不会再接收到消息,但是本层之下的其它层会接收到消息
b.返回true,则本层的onTouchMoved(),onTouchEnded()可以接收到消息,但是本层之下的其它层不能再接收到消息
单点触摸简单用法:
在Layer中添加如下代码, 重写onTouchxxx函数
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan,
this
);
listener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved,
this
);
listener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded,
this
);
listener->setSwallowTouches(
true
);
//不向下传递触摸
dispatcher->addEventListenerWithSceneGraphPriority(listener,
this
);
listener->setSwallowTouches(true),不向下触摸,简单点来说,比如有两个sprite ,A 和 B,A在上B在下(位置重叠),触摸A的时候,B不会受到影响
listener->setSwallowTouches(false)反之,向下传递触摸,触摸A也等于触摸了B
多点触摸点单用法(多个Layer获取屏幕事件):
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto listener1 = EventListenerTouchAllAtOnce::create();
listener1->onTouchesBegan = CC_CALLBACK_2(GameLayer::onTouchesBegan,
this
);
listener1->onTouchesMoved = CC_CALLBACK_2(GameLayer::onTouchesMoved,
this
);
listener1->onTouchesEnded = CC_CALLBACK_2(GameLayer::onTouchesEnded,
this
);
dispatcher->addEventListenerWithSceneGraphPriority(listener1,
this
);
关于eventDispatcher:
获取方法:
- 1
auto dispatcher = Director::getInstance()->getEventDispatcher();
事件监听器包含以下几种:
- 触摸事件 (EventListenerTouch)
- 键盘响应事件 (EventListenerKeyboard)
- 加速记录事件 (EventListenerAcceleration)
- 鼠标响应事件 (EventListenerMouse)
- 自定义事件 (EventListenerCustom)
以上事件监听器统一由
_eventDispatcher
来进行管理。
优先权:1.优先级越低,越先响应事件
2.如果优先级相同,则上层的(z轴)先接收触摸事件
有两种方式将 事件监听器 listener1 添加到 事件调度器_eventDispatcher 中:
代码展开一下:12void
EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)
void
EventDispatcher::addEventListenerWithFixedPriority(EventListener* listener,
int
fixedPriority)
1234567891011121314void
EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)
{
CCASSERT(listener && node,
"Invalid parameters."
);
CCASSERT(!listener->isRegistered(),
"The listener has been registered."
);
if
(!listener->checkAvailable())
return
;
listener->setSceneGraphPriority(node);
listener->setFixedPriority(
0
);
listener->setRegistered(
true
);
addEventListener(listener);
}
12345678910111213141516void
EventDispatcher::addEventListenerWithFixedPriority(EventListener* listener,
int
fixedPriority)
{
CCASSERT(listener,
"Invalid parameters."
);
CCASSERT(!listener->isRegistered(),
"The listener has been registered."
);
CCASSERT(fixedPriority !=
0
,
"0 priority is forbidden for fixed priority since it's used for scene graph based priority."
);
if
(!listener->checkAvailable())
return
;
listener->setSceneGraphPriority(nullptr);
listener->setFixedPriority(fixedPriority);
listener->setRegistered(
true
);
listener->setPaused(
false
);
addEventListener(listener);
}
(1)addEventListenerWithSceneGraphPriority 的事件监听器优先级是0, 而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的。
(2)另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。
移除方法:1dispatcher->removeEventListener(listener);
- cocos2dx 3.2 触摸机制
- cocos2dx 3.2中的触摸机制
- cocos2dx 3.0 触摸机制
- cocos2dx 3.0 触摸机制
- Cocos2dx 3.0 触摸机制
- Cocos2dx 3.0 触摸机制
- cocos2dx 3.0 触摸机制
- cocos2dx 3.0 触摸机制
- cocos2dx 3.0的触摸机制
- cocos2dx 3.2 触摸
- cocos2dx触摸
- Cocos2dx 3.0 过渡篇(三) 触摸机制
- Cocos2dx 3.0 过渡篇(三) 触摸机制
- Cocos2dx 3.0 过渡篇(三) 触摸机制
- Cocos2dx 3.0 过渡篇(三) 触摸机制
- Cocos2dx 3.0 过渡篇(三) 触摸机制
- cocos2dx学习之路----第八篇(初识触摸机制中的单点触摸)
- 触摸机制
- Vim使用技巧
- Cocos2d-x扣血飘字特效用完你就消失--之游戏开发
- hostapd源代码分析(一):网络接口和BSS的初始化
- POJ2386 Lake Counting 图DFS
- 高效使用你的Xcode
- cocos2dx 3.2 触摸机制
- init.rc的执行顺序
- java编程思想-异常处理-学习摘要
- key-value数据库
- poj3233矩阵的幂的和
- Thrift 介绍及java实例
- cocos2d-x中的父类和子类之间的继承关系
- 【javascript】使用window.open()实现弹出广告框
- android studio导入android studio工程小记--持续更