在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. tp5 加载第三方扩展类库与手动加载的问题

    =============================================================== <?phpnamespace my; /*** 加载第三方类库*/ ...

  2. iOS enum 定义与使用

    枚举其实很重要,特别是在应用开发初期,服务器端数据格式需要更改得情况下,枚举和宏都能是程序简洁,并且改动小. 网上有个人写的言简意赅,适合初学 转自:http://blog.csdn.net/ysy4 ...

  3. jQuery.fn的作用是什么

    jQuery.fn的作用是什么:在自定义jQuery插件中,会经常见到jQuery.fn的身影,下面就简单介绍一下它的作用到底是什么.想要认识它的本质,最好的办法直接看jQuery的源码,否则一切都是 ...

  4. MYSQL优化派生表(子查询)在From语句中的

    Mysql 在5.6.3中,优化器更有效率地处理派生表(在from语句中的子查询): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化.这一举措提高了性能 ...

  5. 一次线上tomcat应用请求阻塞的排查经过

    今天早上,收到一个报警,有个服务器的http往返时延飙升,同时曝出大量404,很是折腾了一番,特记录下思考和排查经过. 1.这是单纯的时延增大,还是有什么其他情况还未掌握? 因为不知道是只有时延变大而 ...

  6. 解决前端页面a标签嵌套a标签bug

    在前端页面中,一般二级导航栏会出现a嵌套a标签出现重复的父元素a标签bug 比如: <nav class="nav"> <ul> <li> &l ...

  7. Python--socketserve源码分析(一)

    class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass 实现原理: s =socketserver.ThreadingTCPServer(参 ...

  8. Linux指令--chmod

    chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...

  9. 豹哥嵌入式讲堂:ARM知识概要杂辑(2)- 第一款Cortex-M处理器

    1.天生荣耀:ARM Cortex-M处理器由来 ARM公司自2004年推出ARMv7内核架构时,摒弃了以往"ARM+数字"这种处理器命名方法(ARM11之前的处理器统称经典处理器 ...

  10. 端口扫描命令nmap

    转:http://www.osyunwei.com/archives/2004.html 下面教大家在CentOS中用nmap查看主机端口: 一.安装nmap yum install nmap -y ...