1. 程式人生 > >COCOS學習筆記--單點觸控

COCOS學習筆記--單點觸控

這篇部落格來總結下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()方法獲得的觸控點座標。

 以上。