這篇博客來總結下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()方法獲得的觸摸點座標。
以上。