在cocos2d-x中, touch事件分为两种:一种是单点事件, 另一种是多点事件。

单点事件对应的代理方法是:

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
// optional
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

 

单击事件中touchBegan方法返回一个bool值, 如果为false, 则touchMoved, touchEnded, touchCancelled方法都将不会执行, 因为表示所在类不处理单击事件。

多点触屏对应的代理方法:

virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

 

多点触屏方法中传递参数不再是一个具体的touch对象, 而是集合。

那么CCLayer的触屏事件处理方法是这样的, 因为CCLayer继承于CCTouchDelegate, 这是个基类, 子类还有CCTargetedTouchDelegate(单点触屏), CCStandardTouchDelegate(多点触屏)。所以CCLayer是可以简单来处理触摸事件的。

1、开启触摸功能

setTouchEnabled(true);

 

2、设置触摸的类型, CCLayer默认是设置为多点触摸。

setTouchMode(kCCTouchesAllAtOnce);//多点触摸
setTouchMode(kCCTouchesOneByOne);//单点触摸

 

3、接下来就是对应覆盖上面的方法了, 方法里面做触摸处理就可以了。

这是比较简单的处理, 如果你想优先处理自己的触摸事件, 那么你就覆盖CCLayer的一个方法, 比如

void TestLayer::registerWithTouchDispatcher()
{
CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher(); if( m_eTouchMode == kCCTouchesAllAtOnce ) {
pDispatcher->addStandardDelegate(this, 0);
} else {
pDispatcher->addTargetedDelegate(this, 0, true);
}

add方法的第二个参数就是优先级, 你可以把你的优先级设置的较高一个。

如果是精灵处理触摸事件, 相对来说代码多一些, 因为CCSprite类是没有继承于CCTouchDelegate或者其子类, 而是由我们自己去继承。

下面是一个例子, 去掉了其他不相关的代码, 只保留触摸相关代码。

//TestSprite.h
class TestSprite : public CCSprite, public CCTargetedTouchDelegate {
public:
virtual void onEnter();
virtual void onExit(); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
};

 

//TestSprite.cpp
void TestSprite::onEnter()
{
CCSprite::onEnter(); // add targeted delegate
CCTouchDispatcher* dispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
dispatcher->addTargetedDelegate(this, 0, true);
} void TestSprite::onExit()
{
// remove targeted delegate
CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
pDispatcher->removeDelegate(this); CCSprite::onExit();
} bool TestSprite::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
//do something...
return false;
}

 

首先, 我们自己定义的精灵类需要继承于CCTouchDelegate或者其子类, 其次在onEnter和onExit方法中把自己的类加入和移除触摸分发管理类中, 这个添加和移除必须对应着, 然后覆盖触摸处理方法就可以了。上面的例子是处理单点触摸的, 多点触摸类似, 不赘述了。

在处理CCLayer的触摸的时候我们并没有手动移除delegate, 那是因为CCLayer帮我们做了这个事情。

cocos2d-x中的触摸处理方法就写到这里, 欢迎拍砖!

 

注: 本文由啸寒原著,请支持原著!转载请附上原文链接: http://www.cnblogs.com/xiaohan-wu/p/3187994.html

 

cocos2d-x中处理touch事件的更多相关文章

  1. 深入cocos2d-x中的touch事件

    深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...

  2. H5中的touch事件

    touch中共有touchstart.touchmove和touchend三个事件: touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结 ...

  3. javascript移动设备Web开发中对touch事件的封装实例

    在触屏设备上,一些比较基础的手势都需要通过对 touch 事件进行二次封装才能实现.zepto 是移动端上使用率比较高的一个类库,但是其 touch 模块模拟出来的一些事件存在一些兼容性问题,如 ta ...

  4. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  5. Android开发(二十)——Fragment中的touch事件

    问题: Fragment中没有提供监听touch事件的方法. 解决方案: Activity中能够监听touch事件. 于是在Activity中写一个接口,MyOnTouchListener,在需要监听 ...

  6. cocos2d-x中关于touch事件的响应

    原作者:有缘人  来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html 一.touch事件响应分为单点触摸响应和多点触摸响应. ...

  7. Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题

    之前写过关于HorizontalScrollView滑动和按钮事件触发问题,但是不能所有的情况,最近几天一直在想这个问题,今天有一个比较好的解决思路,最终应用在项目里面效果也很好,首先说明一下功能: ...

  8. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  9. Android touch 事件传递机制

    前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...

随机推荐

  1. xmind2013激活

    参考链接:http://blog.163.com/m15999573195_1/blog/static/248705063201542622112823/

  2. Mac下Charles Contents乱码解决办法

    用到Charles,下载最新的4.0.1版本,但是发生乱码问题.百度好久才找到个靠谱的,那些说什么在Info.plist文件加字符串的,都是假的,反正我是试了都没用,这里记下详细的操作步骤解决: 1. ...

  3. Hyperledger Fabric Read-Write set semantics——读写集

    Read-Write set semantics(读写集) 本文讨论了关于读写集当前实现的细节. Transaction simulation and read-write set(事务模拟和读写集) ...

  4. EL表达式遍历Map集合

    <% Map<String,String> map2 = new HashMap(); map2.put("a","hello world") ...

  5. ListCtrl控件

    一 CListCtrl类型 LVS_EDITLABELS LVS_OWNERDRAWFIXED LVS_REPORT LVS_SHOWSELALWAYS LVS_SINGLESEL LVS_SMALL ...

  6. android dialog弹出的情况下监听返回键

    view = LayoutInflater.from(getActivity()).inflate( R.layout.dialog_tips, null); title2 = (TextView) ...

  7. Android5.0新控件

    谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常用的新控件有下面5种.  1. CardView(卡片视图) CardView顾名思义是卡片视图,它继承FrameLay ...

  8. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  9. Struts2中拦截器的使用与配置

    一,拦截器是什么? 拦截器是在Action执行之前和之后执行的代码,是一个类似于过滤器的类: 二,拦截器的作用 拦截器拦截Action的请求,在Action之前或之后实现某项功能: 三,拦截器的特点 ...

  10. 使用autoc js生成文章目录(侧边)导航栏

    介绍: autocjs 是一个专门用来生成文章目录(Table of Contents)导航的工具.autocjs 会查找文章指定区域中的所有 h1~h6 的标签,并自动分析文章的层次结构,生成文章的 ...