zoukankan      html  css  js  c++  java
  • COCOS2DX3.0的3种触摸响应机制

    第一种是采用函数回调,主要是用于MenuItem

    1. // a selector callback  
    2. void menuCloseCallback(Object* pSender);  
    3.   
    4. auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",  
    5.                         CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));  
    6.   
    7. void HelloWorld::menuCloseCallback(Object* pSender)  
    8. {  
    9.     Director::getInstance()->end();  
    10.   
    11. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)  
    12.     exit(0);  
    13. #endif  
    14. }  

    从上面的代码也可以看得到3.0的一些改变

    用CC_CALLBACK_x代替了 按钮的 menu_selector(),update的 schedule_selector 回调接口,其中最后一个x代表着回调函数的参数有几个,0表示0个,1表示1个,2表示2个,上面的例子是1个参数,所以用CC_CALLBACK_1



    第二种方法我也不是很明白,TouchEvent响应

          这是新加入的响应方式。它主要是使用在UIWidget上的。可以将其看做是函数回调的一个扩展,为更多的响应处理提供可能。使用方法大致是:

    1. //声明  
    2. void touchButton(Object* object,TouchEventType type);  
    3.   
    4. //挂接到控件上  
    5. uiButton->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));  
    6.   
    7. //实现  
    8. void HelloWorld::touchButton(Object* object,TouchEventType type)  
    9. {  
    10.     LabelTTF* label;  
    11.     switch (type)  
    12.     {  
    13.     case TouchEventType::TOUCH_EVENT_BEGAN:  
    14.         label = static_cast(getChildByTag(11));  
    15.         label->setString("按下按钮");  
    16.         break;  
    17.     case TouchEventType::TOUCH_EVENT_MOVED:  
    18.         label = static_cast(getChildByTag(11));  
    19.         label->setString("按下按钮移动");  
    20.         break;  
    21.     case TouchEventType::TOUCH_EVENT_ENDED:  
    22.         label = static_cast(getChildByTag(11));  
    23.         label->setString("放开按钮");  
    24.         break;  
    25.     case TouchEventType::TOUCH_EVENT_CANCELED:  
    26.         label = static_cast(getChildByTag(11));  
    27.         label->setString("取消点击");  
    28.         break;  
    29.     default:  
    30.         break;  
    31.     }  
    32. }  


    因为所有的UIWidget都要添加到UILayer上,而UILayer通常都会在最上层,所以可以“基本上”认为这种使用方式会优先于其他方式处理点击消息。因为UILayer也会有层级的改变,比如它和MenuItem之间的关系。所以说“基本上”。

    第三种 触摸监听绑定

    我觉得这种方法相当方便,不仅可以绑定在精灵上,还可以绑定在层上,触摸函数也可以用lambda来写。下面是方法

      1. auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听    
      2. listener1->setSwallowTouches(true);//设置是否想下传递触摸    
      3.   
      4. Rect rect = Rect(qipanPoint.x,qipanPoint.y  
      5.     ,qipanSize.width,qipanSize.height);  
      6. //3.0 后可以直接在touchBegan后添加它的实现代码,而不用特意去写一个touchBegan的函数  
      7. listener1->onTouchBegan = [rect,this](Touch* touch, Event* event){ //[]中间的是传入的参数  
      8.     auto target = static_cast(event->getCurrentTarget());//获取的当前触摸的目标  
      9.   
      10.     Point locationInNode = target->convertToNodeSpace(touch->getLocation());  
      11.     Size s = target->getContentSize();  
      12.   
      13.     if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内  
      14.     {"white-space:pre"//以下是我自定义的一些操作  
      15.         //创建锁定精灵  
      16.         auto lockSprite = Sprite::create("lock.png");  
      17.         lockSprite->setPosition(GetQiziPoint(locationInNode,rect));  
      18.         lockSprite->setTag(99);  
      19.         this->addChild(lockSprite);  
      20.         return true;  
      21.     }else  
      22.         return false;  
      23. };  
      24.   
      25. //拖动精灵移动  
      26. listener1->onTouchMoved = [rect,this](Touch* touch, Event* event){  
      27.     auto target = static_cast(event->getCurrentTarget());//获取的当前触摸的目标  
      28.   
      29.     Point locationInNode = target->convertToNodeSpace(touch->getLocation());  
      30.     Size s = target->getContentSize();  
      31.   
      32.     if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内  
      33.     {  
      34.         //锁定精灵移动  
      35.         Sprite *lockSprite = (Sprite*)this->getChildByTag(99);  
      36.         lockSprite->setPosition(GetQiziPoint(locationInNode,rect));  
      37.     }  
      38. };  
      39.   
      40. listener1->onTouchEnded = [=](Touch* touch, Event* event){ // =在c++11里面代表这个lambda表达式中能使用外面的变量  
      41.     this->removeChildByTag(99);//移除锁定精灵  
      42. };  
      43. //将触摸监听添加到eventDispacher中去  
      44. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1 ,layer); 
    年轻不是你玩的理由,而是你奋斗的资本
  • 相关阅读:
    Codeforces 1105C Ayoub and Lost Array
    绍兴市acm竞赛
    CodeForces#520 div2 1062B
    CodeForces#520 div2 1062A
    1067A
    测试MathJax
    BZOJ1010 玩具装箱toy
    停止
    秽翼
    爆零
  • 原文地址:https://www.cnblogs.com/lyaxx1314/p/3644968.html
Copyright © 2011-2022 走看看