这篇博客来总结下cocos单点触控的相关内容:
我们在Layer类的源代码中能够看到。Layer类提供了一下4个与屏幕单点触控相关的回调方法:
onTouchBegan()、onTouchMoved()、onTouchEnded()和onTouchCancelled()分别表示接收屏幕触摸的開始、移动、结束和取消的回调函数。什么是回调函数?就是发生屏幕触摸的这些事件时这些函数会被调用运行。
那么接下来我们就通过使用这4个回调方法来了解一下cocos的单点触控:
1.首先在头文件里声明这4个方法:
//触摸開始 virtual bool onTouchBegan(Touch *touch, Event *unused_event); //触摸移动 virtual void onTouchMoved(Touch *touch, Event *unused_event); //触摸结束 virtual void onTouchEnded(Touch *touch, Event *unused_event); //触摸取消 virtual void onTouchCancelled(Touch *touch, Event *unused_event);
2.然后。要进行触摸事件监听的绑定,分3步:
第一步:创建触摸监听对象:
auto eventTouch = EventListenerTouchOneByOne::create();
第二步:绑定触摸监听对象的触摸函数:
//通过宏函数CC_CALLBACK_2实现 //宏函数參数:1.类中定义的函数 2.类本身 //宏函数CC_CALLBACK_2的定义在base/ccMacros.h文件里能够找到。//绑定触摸開始 eventTouch->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this); //绑定触摸移动 eventTouch->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this); //绑定触摸结束 eventTouch->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this); //绑定触摸取消 eventTouch->onTouchCancelled = CC_CALLBACK_2(HelloWorld::onTouchCancelled, this);
第三步,将触摸监听对象加入到事件监听分发器中:
//參数:1.触摸监听对象 2.类本身 _eventDispatcher->addEventListenerWithSceneGraphPriority(eventTouch,this);
通过以上三步,我们就完毕了触摸事件监听的绑定。
3.接下来就要实现之前在头文件里声明的4个方法:
//触摸開始函数的实现 bool HelloWorld::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event) { log("onTouchBegan!!!"); //假设不返回true,其它的触摸函数不会接收到触摸消息 return true; } //触摸移动函数的实现 void HelloWorld::onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *unused_event) { log("onTouchMoved!!!"); } //触摸结束函数的实现 void HelloWorld::onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *unused_event) { log("onTouchEnded!!!"); } //触摸取消函数的实现 void HelloWorld::onTouchCancelled(cocos2d::Touch *touch, cocos2d::Event *unused_event) { log("onTouchCancelled!!!"); }
执行程序。我们随便在模拟器屏幕上划一下。能够看到例如以下输出:
在这里还能够看出触摸事件的调用顺序:首先会调用onTouchBegan()方法,然后随着触摸移动的过程中会一直调用onTouchMoved()方法。最后在手指或鼠标指针抬起的时候会调用onTouchEnded()方法,标志触摸结束。
那么你可能会有疑问onTouchCancelled()方法是在什么时候调用的呢?事实上这种方法基本没什么用,它唯一会被用到的情况就是当我们在触摸的时候不小心按到了手机的home键。游戏退出后台有可能会调用该方法。
好了。接下来我们就利用以上知识做一个小demo:让一个精灵跟着我们的鼠标点击位置来移动。
首先完毕精灵相关初始化:
#define TAG 10 //创建一个精灵 auto sprite = Sprite::create("haha.jpg"); //向父节点加入精灵 this->addChild(sprite); //设置精灵tag sprite->setTag(TAG); //设置精灵坐标 sprite->setPosition(Vec2(480,320));
然后改动4个触摸函数。向当中加入例如以下一段代码:
//获得触摸坐标 Vec2 vec = touch->getLocation(); //通过tag获得精灵 Sprite *sprite = (Sprite*)this->getChildByTag(TAG); //设置sprite坐标 if (sprite) { sprite->setPosition(vec); }
touch就是触摸函数传入的Touch类型的參数。我们就是通过其getLocation()方法获得的触摸点坐标。另外我们是通过设置的tag得到精灵的。
//触摸開始函数的实现 bool HelloWorld::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event) { Vec2 vec = touch->getLocation(); Sprite *sprite = (Sprite*)this->getChildByTag(TAG); if (sprite) { sprite->setPosition(vec); } return true; } //触摸移动函数的实现 void HelloWorld::onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *unused_event) { Vec2 vec = touch->getLocation(); Sprite *sprite = (Sprite*)this->getChildByTag(TAG); if (sprite) { sprite->setPosition(vec); } } //触摸结束函数的实现 void HelloWorld::onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *unused_event) { Vec2 vec = touch->getLocation(); Sprite *sprite = (Sprite*)this->getChildByTag(TAG); if (sprite) { sprite->setPosition(vec); } }
这样。执行程序。我们所创建的精灵就会随着鼠标点击位置来移动了,因为执行效果是动态的这里我就不传效果图了。
总结一下:
1.Layer类提供onTouchBegan()、onTouchMoved()、onTouchEnded()和onTouchCancelled()4个方法,这4个方法事实上就是触摸事件的回调函数。
2.假设想要使用这4个触摸事件回调函数,我们就要在之前要进行触摸事件监听的绑定;
3.触摸事件监听的绑定分3步:1).创建触摸监听对象eventTouch 2).通过宏函数CC_CALLBACK_2绑定触摸监听对象的触摸函数3).将触摸监听对象eventTouch 加入到事件监听分发器_eventDispatcher中;
4.触摸函数Touch类型的參数touch,我们通过其getLocation()方法获得的触摸点坐标。
以上。