标签:
一、基本使用
1、首先,声明一个监听器
有两种,EventListenerTouchOneByOne 和 EventListenerTouchAllAtOnce,前者是单点触控。后者是多点触控。后者我没怎么用过。不是非常了解。所以这里主要讲单点触控。
2、实现触碰监听各种事件的相应回调方法
这里也有两种
1)CC_CALLBACK_2 回调机制
2) 直接用Lambda 表达式
3、注冊监听
演示样例
1) 用CC_CALLBACK_2 回调机制
//声明监听
auto listener = EventListenerTouchOneByOne::create();
//实现监听回调
listener->onTouchBegan = CC_CALLBACK_2(Test::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(Test::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(Test::onTouchEnded, this);
//注冊监听
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); 三个回调方法,这里没有写详细的内容bool Test::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
return true;
}
void Test::onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *event)
{
}
void Test::onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *event)
{
}
2) 用Lambda 表达式 //声明监听
auto listener = EventListenerTouchOneByOne::create();
//实现监听回调
listener->onTouchBegan = [](Touch * touch, Event *event){
return true;
};
listener->onTouchMoved = [](Touch * touch, Event *event){
};
listener->onTouchEnded = [](Touch * touch, Event *event){
};
//注冊监听
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); 假设不是要反复多次使用的回调方法的话。用Lambda是非常不错的选择,直观,能省不少事。只是Lambda事实上也能多次调用的。这个暂且不说。
二、拖动精灵移动
这个我们要做下面步骤
1、获取触碰坐标
2、推断这个坐标是否包括在精灵里
3、获取鼠标(即我们手指移动)移动的差值
4、精灵移动对应的距离和方向
listener->onTouchMoved = [=](Touch * touch, Event *event){
//获取触碰坐标----这里getLocation()这种方法会自己主动将坐标转换成openGL坐标。不用我们手动转换
auto touchPos = touch->getLocation();
//推断是否在精灵里
if (sp->getBoundingBox().containsPoint(touchPos)) {
//获取差值
auto movePos = touch->getDelta();
//精灵移动
sp->setPosition(sp->getPosition() + movePos);
}
};
这里我要说一下getDelta()这种方法。曾经获取差值是要我们自己计算的,通过getPreviousLocation()这种方法获取上次的坐标,然后与如今的坐标相减来算出。如今已经有算差值的方法了。还是挺贴心的- -。
哦对了。这里这个Lambda表达式须要在[ ]里面加 = 号,表示值传递。这像人才的外部引用和修改变量。关于本可以去看看Lambda要使用
版权声明:本文博主原创文章。博客,未经同意不得转载。
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/4875121.html