cocos2d-x中处理touch事件
在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事件的更多相关文章
- 深入cocos2d-x中的touch事件
深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...
- H5中的touch事件
touch中共有touchstart.touchmove和touchend三个事件: touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结 ...
- javascript移动设备Web开发中对touch事件的封装实例
在触屏设备上,一些比较基础的手势都需要通过对 touch 事件进行二次封装才能实现.zepto 是移动端上使用率比较高的一个类库,但是其 touch 模块模拟出来的一些事件存在一些兼容性问题,如 ta ...
- Android中的Touch事件
Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...
- Android开发(二十)——Fragment中的touch事件
问题: Fragment中没有提供监听touch事件的方法. 解决方案: Activity中能够监听touch事件. 于是在Activity中写一个接口,MyOnTouchListener,在需要监听 ...
- cocos2d-x中关于touch事件的响应
原作者:有缘人 来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html 一.touch事件响应分为单点触摸响应和多点触摸响应. ...
- Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题
之前写过关于HorizontalScrollView滑动和按钮事件触发问题,但是不能所有的情况,最近几天一直在想这个问题,今天有一个比较好的解决思路,最终应用在项目里面效果也很好,首先说明一下功能: ...
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android touch 事件传递机制
前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...
随机推荐
- 【编程技巧】applicationContext.xml 里面可配置bean和数据库地址
<bean id="vendorManagerDao" class="com.active.vendor.dao.VendorManagerDaoImpl" ...
- 注入理解之APC注入
近期学习做了一个各种注入的MFC程序,把一些心得和体会每天分享一些 APC(Asynchronous procedure call)异步程序调用,在NT中,有两种类型的APCs:用户模式和内核模式.用 ...
- 从(0,0)到(m,n),每次走一步,只能向上或者向右走,有多少种路径走到(m,n)
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- mybatis-XML配置文件
<?xml version="1.0" encoding="UTF-8" ?><!--plugins在配置文件中的位置必须要符合要求,否则会报 ...
- webpack+vuecli打包生成资源相对引用路径与背景图片的正确引用
资源相对引用路径 问题描述 一般情况下,通过webpack+vuecli默认打包的css.js等资源,路径都是绝对的. 但当部署到带有文件夹的项目中,这种绝对路径就会出现问题,因为把配置的static ...
- Azure Powershell获取指定订阅下的虚拟机信息(ARM)
为方便Azure用户导出已创建虚拟机的相关信息,特编写如下脚本: 详情脚本: # 登陆Azure Account Add-AzureRmAccount -EnvironmentName AzureCh ...
- 【Java框架型项目从入门到装逼】第十二节 项目分层
这一节我们开始对项目进行分层,一般来说,一个web项目的层次结构如下图所示: controller层为我们的控制层,用来接收用户的请求,比如新增一个学生的信息,新增的请求最先就是走到这一层.contr ...
- Log4j扩展使用--日志记录器Logger
OK,现在我们认真的研究下Logger的配置,进行相关配置扩展. Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局).其中,Logger负责记录 ...
- Servlet--ServletConfig接口,GenericServlet类
ServletConfig接口 定义:public interface ServletConfig 这个接口定义了一个对象, 通过这个对象, Servlet 引擎配置一个 Servlet 并且允许 S ...
- 豹哥嵌入式讲堂:ARM知识概要杂辑(4)- Cortex-M处理器性能指标
1.处理器的性能指标 用于评价CPU的性能指标非常多,不同的性能侧重点下的测试标准可能得出的指标值不同,下面介绍嵌入式行业广泛使用的两个经典的测试标准. 1.1 Dhrystone标准 Dhrysto ...