cocos2d中的觸摸監聽

示例代碼

  1. 新建場景類繼承Scene。
  2. 重載init如下
bool ActionScene::init(){
     // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    touchEvent(this);
    return true;
}
  1. 在init前寫上全局監聽函數(或另建測試類)
void touchEvent(ActionScene *scene){
    //座標標籤
    Label *label=Label::create();
    label->setString("0,0");
    label->setPosition(Point(50,200));
    scene->addChild(label);

    //目標1
    Sprite *sprite1=Sprite::create("sprite1.png");
    sprite1->setPosition(Point(200,200));
    scene->addChild(sprite1);
    //目標2
    Sprite *sprite2=Sprite::create("sprite2.png");
    sprite2->setPosition(Point(200,200));
    scene->addChild(sprite2);

    //設置監聽對象
    auto lister=EventListenerTouchOneByOne::create();
    //在回調列表中阻止繼續傳播
    lister->setSwallowTouches(true);
    //觸摸按下
    lister->onTouchBegan=[](Touch *touch,Event *event){
        auto target=static_cast<Sprite*>(event->getCurrentTarget());
        Point pnow= Director::getInstance()->convertToGL(touch->getLocationInView());
        if(target->getBoundingBox().containsPoint(pnow)){
            target->setOpacity(100);
            return true;
        }else{
            return false;
        }
    };
    //觸發擡起
    lister->onTouchEnded=[](Touch *touch,Event *event){
        auto target=static_cast<Sprite*>(event->getCurrentTarget());
        Point pnow= Director::getInstance()->convertToGL(touch->getLocationInView());
        target->setOpacity(255);

    };
    //觸摸按下移動
    lister->onTouchMoved=[=](Touch *touch,Event *event){
        auto target=static_cast<Sprite*>(event->getCurrentTarget());
        Point pnow= Director::getInstance()->convertToGL(touch->getLocationInView());
        char strshow[1000];
        sprintf(strshow,"(%.2f,%.2f)",pnow.x,pnow.y);
        label->setString(strshow);
    };
    auto eventDisP=Director::getInstance()->getEventDispatcher();
    //綁定目標1
    eventDisP->addEventListenerWithSceneGraphPriority(lister,sprite1);
    //綁定目標2
    eventDisP->addEventListenerWithSceneGraphPriority(lister->clone(),sprite2);
}

該函數實現的是,對某個精靈點擊和鬆開會改變該精靈的透明度。以及在移動鼠標時顯示座標

這裏寫圖片描述

注意處

有界面的框架(如MFC、WinFrom)中都有一套事件監聽模塊。CC大致與它們相同,略微不同的地方是寫法(廢話)以及回調類型。在上面定義了三個動作的響應函數(落下,移動,擡起)。在MFC中它們回調函數類型相同,看一下CC中的定義。

這裏寫圖片描述

其中onTouchBegan的返回類型和其它動作的返回類型不同,爲bool。

  1. 如果返回true,且其它動作有定義,則會觸發執行
  2. 如果返回false,其它定義的動作不會觸發

在本例中,如果點擊的時候沒有點在某個精靈上,那麼移動鼠標不會得到鼠標當前的座標,鬆開鼠標修改該精靈透明度的代碼也不會執行。

*主要內容來自cocos2dx 3.0遊戲開發之旅 Section 5.4

發佈了37 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章