使用了cocos2dx 3.10,当使用到点击事件时,想像3.0之前的版本那样使用,结果却发现,基类函数无法在lambda(这是什么鬼,我其实不知道。。)中使用。。。。
virtual bool ccTouchBegan(cocos2d::Touch* touch,cocos2d::Event ev);
上面的声明方式却无法使用,后来网上看才发现,3.0以上版本的事件定义方式,简单便捷些,如:
auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听 this->setSwallowsTouches(true);
listener1是单点触摸事件的声明,当然,还有其他的一些事件,这里就不一一列举了。
//通过 lambda 表达式 直接实现触摸事件的回掉方法 listener1->onTouchBegan = [](Touch* touch,Event* event) { auto target = static_cast<Sprite*>(event->getCurrentTarget()); Point locationInNode = target->convertToNodeSpace(touch->getLocation()); Size s = target->getContentSize(); Rect rect = Rect(0,s.width,s.height); if (rect.containsPoint(locationInNode)) { log("sprite began... x = %f,y = %f",locationInNode.x,locationInNode.y); target->setOpacity(180); return true; } return false; }; listener1->onTouchMoved = [=](Touch* touch,Event* event) { auto target = static_cast<Sprite*>(event->getCurrentTarget()); target->setPosition(target->getPosition() + touch->getDelta()); }; listener1->onTouchEnded = [=](Touch* touch,Event* event) { auto target = static_cast<Sprite*>(event->getCurrentTarget()); log("sprite onTouchesEnded.. "); target->setOpacity(255); Point locationInNode = target->convertToNodeSpace(touch->getLocation()); Point spriteLocation = g_Monkey->getPosition(); }; _eventDispatcher->addEventListenerWithSceneGraPHPriority(listener1,this);以上是单点触摸事件的三个生命周期的定义:ccTouchBegan、ccTouchMoved、ccTouchEnded,注意“=”号后带有“=”的中括号,带有“=”的,可以在方法中使用全局或者局部的变量,否则则不可在lambda中使用。最后一句则是将事件注册到相关的组件中,如Sprite或者Layer等。