加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

COCOS2DX3.0的3种触摸响应机制

发布时间:2020-12-14 17:00:08 所属栏目:百科 来源:网络整理
导读:现在网上关于3.0的资料实在是有点少,不过我还是很喜欢3.0的风格的,C++11也带来了很多方便。 其实说的是4种触摸机制,其实有一部分cocos2dx已经不建议用了,会爆出大量警告。 第一种是采用函数回调,主要是用于 MenuItem [cpp] view plain copy // a selecto
现在网上关于3.0的资料实在是有点少,不过我还是很喜欢3.0的风格的,C++11也带来了很多方便。

其实说的是4种触摸机制,其实有一部分cocos2dx已经不建议用了,会爆出大量警告。

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

[cpp] view plain copy
  1. //aselectorcallback
  2. voidmenuCloseCallback(Object*pSender);
  3. autocloseItem=MenuItemImage::create("CloseNormal.png","CloseSelected.png",
  4. CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
  5. voidHelloWorld::menuCloseCallback(Object*pSender)
  6. {
  7. Director::getInstance()->end();
  8. #if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)
  9. exit(0);
  10. #endif
  11. }
从上面的代码也可以看得到3.0的一些改变

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



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

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

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

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


第三种 触摸监听绑定

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

[cpp] view plain copy
  1. autolistener1=EventListenerTouchOneByOne::create();//创建一个触摸监听
  2. listener1->setSwallowTouches(true);//设置是否想下传递触摸
  3. Rectrect=Rect(qipanPoint.x,qipanPoint.y
  4. ,qipanSize.width,qipanSize.height);
  5. //3.0后可以直接在touchBegan后添加它的实现代码,而不用特意去写一个touchBegan的函数
  6. listener1->onTouchBegan=[rect,this](Touch*touch,Event*event){//[]中间的是传入的参数
  7. autotarget=static_cast(event->getCurrentTarget());//获取的当前触摸的目标
  8. PointlocationInNode=target->convertToNodeSpace(touch->getLocation());
  9. Sizes=target->getContentSize();
  10. if(rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
  11. {"white-space:pre">//以下是我自定义的一些操作
  12. //创建锁定精灵
  13. autolockSprite=Sprite::create("lock.png");
  14. lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
  15. lockSprite->setTag(99);
  16. this->addChild(lockSprite);
  17. returntrue;
  18. }else
  19. returnfalse;
  20. };
  21. //拖动精灵移动
  22. listener1->onTouchMoved=[rect,Event*event){
  23. autotarget=static_cast(event->getCurrentTarget());//获取的当前触摸的目标
  24. PointlocationInNode=target->convertToNodeSpace(touch->getLocation());
  25. Sizes=target->getContentSize();
  26. if(rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
  27. {
  28. //锁定精灵移动
  29. Sprite*lockSprite=(Sprite*)this->getChildByTag(99);
  30. lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
  31. }
  32. };
  33. listener1->onTouchEnded=[=](Touch*touch,Event*event){//=在c++11里面代表这个lambda表达式中能使用外面的变量
  34. this->removeChildByTag(99);//移除锁定精灵
  35. };
  36. //将触摸监听添加到eventDispacher中去
  37. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1,layer);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读