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

简介: <div style="top: 0px;"></div><span style="font-family:宋体;font-size:14px;"></span><p align="left" style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size:14px;"><span style="font-fam


原作者:有缘人  来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html

 


一、touch事件响应分为单点触摸响应和多点触摸响应。

    单点触摸响应需要重载的方法:

  virtual boolccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

  virtual voidccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);

  virtual voidccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

  virtual voidccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

    多点触摸需要重载的方法:

  virtual voidccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);

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

  virtual voidccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);

  virtual voidccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

二、单点触摸本质上需要调用的方法,即设置touch的代理

 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-129,true);

    多点触摸本质上需要调用的方法

 CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,-129);

所以,只要调用了以上方法,就可以实现触摸响应,就不再需要调用setTouchEnabled(true);

三、setTouchEnabled的方法实现

void CCLayer::setTouchEnabled(bool enabled)

{

    if (m_bTouchEnabled != enabled)

    {

        m_bTouchEnabled = enabled;

        if (m_bRunning)

        {

            if (enabled)

            {

                this->registerWithTouchDispatcher();

            }

            else

            {

                // have problems?

                CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);

            }

        }

    }

}

这段代码最主要的一句this->registerWithTouchDispatcher();

这个方法中就是调用第二点中提到的两个delegate添加方法。

所以,咱们实现touch响应的话,需要重载 registerWithTouchDispatcher()方法,并在这个方法中添加实现

void HelloWorld::registerWithTouchDispatcher()

{

   CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,-129);

   //CDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-129,true);

}

由此,实现touch事件响应需要做的操作:

1.重载registerWithTouchDispatcher()并实现

2.setTouchEnabled(true)

3.重载touch或者touches系列方法

四、在CCLayerregisterWithTouchDispatcher()中有关于m_eTouchMode的判断,并且有setTouchMode()方法,参数有两种:kCCTouchesOneByOne kCCTouchesAllAtOnce,分别代表单点触摸和多点触摸

touchModekCCTouchesOneByOne 时,调用的是addTargetedDelegate方法;当touchModekCCTouchesAllAtOnce时,调用的是addStandardDelegate方法

所以,“重载registerWithTouchDispatcher()并实现”可以由setTouchMode()方法来替换

 

 

目录
相关文章
|
5月前
|
XML Java Android开发
Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)
Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)
94 0
Cocos2dx Touch事件原理剖析
Cocos2dx Touch事件原理剖析
166 0
|
C#
WPF响应长按事件
原文:WPF响应长按事件 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lwwl12/article/details/78983140 ...
1477 0
|
C# 数据可视化 容器
WPF触屏Touch事件在嵌套控件中的响应问题
原文:WPF触屏Touch事件在嵌套控件中的响应问题 前几天遇到个touch事件的坑,记录下来以增强理解。 具体是 想把一个listview嵌套到另一个listview,这时候如果list view(子listview)的内容过多超过容器高度,它是不会出现滚动条压缩内容区域的,反而会将滚动区域转移到外面的list view(父listview),这个无可争议,但这个问题开始没留意,为待会的坑埋下伏笔。
1024 0