cocos2dx 3.x事件监听

admin 2018-3-27 185

使用了cocos2dx 3.10,当使用到点击事件时,想像3.0之前的版本那样使用,结果却发现,基类函数无法在lambda(这是什么鬼,我其实不知道。。)中使用。。。。

  1. virtual bool ccTouchBegan(cocos2d::Touch* touch, cocos2d::Event ev);  


上面的声明方式却无法使用,后来网上看才发现,3.0以上版本的事件定义方式,简单便捷些,如:

  1. auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听   
  2. this->setSwallowsTouches(true);  


listener1是单点触摸事件的声明,当然,还有其他的一些事件,这里就不一一列举了。

  1. //通过 lambda 表达式 直接实现触摸事件的回掉方法    
  2. listener1->onTouchBegan = [](Touch* touch, Event* event) {  
  3.     auto target = static_cast<Sprite*>(event->getCurrentTarget());  
  4.   
  5.     Point locationInNode = target->convertToNodeSpace(touch->getLocation());  
  6.     Size s = target->getContentSize();  
  7.     Rect rect = Rect(0, 0, s.width, s.height);  
  8.   
  9.     if (rect.containsPoint(locationInNode))  
  10.     {  
  11.         log("sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y);  
  12.         target->setOpacity(180);  
  13.         return true;  
  14.     }  
  15.     return false;  
  16. };  
  17.   
  18. listener1->onTouchMoved = [=](Touch* touch, Event* event) {  
  19.     auto target = static_cast<Sprite*>(event->getCurrentTarget());  
  20.     target->setPosition(target->getPosition() + touch->getDelta());  
  21. };  
  22.   
  23. listener1->onTouchEnded = [=](Touch* touch, Event* event) {  
  24.     auto target = static_cast<Sprite*>(event->getCurrentTarget());  
  25.     log("sprite onTouchesEnded.. ");  
  26.     target->setOpacity(255);  
  27.     Point locationInNode = target->convertToNodeSpace(touch->getLocation());  
  28.     Point spriteLocation = g_Monkey->getPosition();  
  29.           
  30.           
  31. };  
  32. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);  


以上是单点触摸事件的三个生命周期的定义:ccTouchBegan、ccTouchMoved、ccTouchEnded,注意“=”号后带有“=”的中括号,带有“=”的,可以在方法中使用全局或者局部的变量,否则则不可在lambda中使用。最后一句则是将事件注册到相关的组件中,如Sprite或者Layer等。


最新回复 (0)
返回