zoukankan      html  css  js  c++  java
  • cocos2d-x中关于touch事件的响应

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

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

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

      virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

      virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);

      virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

      virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

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

      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的代理

     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系列方法

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

    当touchMode为kCCTouchesOneByOne 时,调用的是addTargetedDelegate方法;当touchMode为kCCTouchesAllAtOnce时,调用的是addStandardDelegate方法

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

    欢迎关注关东升新浪微博@tony_关东升。

    关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息

                           

    更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com

    智捷课堂论坛网站:http://51work6.com/forum.php

  • 相关阅读:
    CF div2 325 C
    CF div2 325 B
    CF div2 325 A
    CF div2 322 C
    CF div2 322 B
    CF div2 322 A
    Sudoku Solver POJ 2676 LightOJ 1397
    逆序数(归并排序 )
    RMQ算法
    Socket编程:listen()函数英文翻译
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/4762915.html
Copyright © 2011-2022 走看看