閱讀35 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Cocos2d-x開發實例:單點觸摸事件

下麵我們通過一個實例詳細了解一下層中單點觸摸事件的實現過程。感受一下它的缺點和優點。該實例場景如下圖所示場景中有兩個方塊精靈我們可以點擊和移動它們。



下麵我們看看HelloWorldScene.cpp具體的實現代碼如下

bool HelloWorld::init()
{
    if( !Layer::init() )
    {
         returnfalse;
    }
    ......
    setTouchEnabled(true);   
    //設置為單點觸摸
    setTouchMode(Touch::DispatchMode::ONE_BY_ONE);                                                             
   
    returntrue;
}
 
bool HelloWorld::onTouchBegan(Touch*touch, Event* event)                                                     ①
{
    log("onTouchBegan");
    //通過tag標簽獲得BoxA精靈
    autoboxA = this->getChildByTag(kBoxA_Tag);                                                                           ②
    //如果BoxA精靈被點擊
    if(this->isTap(boxA, touch))                                                                                                            ③
    {
         log("BoxAsprite Tap");
         boxA->runAction(ScaleBy::create(0.06,1.06));                                                                         ④
         returntrue;                                                                                                                                     ⑤
    }
    //通過tag標簽獲得BoxB精靈
    autoboxB = this->getChildByTag(kBoxB_Tag);                                                                   ⑥
    //如果BoxB精靈被點擊
    if(this->isTap(boxB, touch))
    {
         log("BoxBsprite Tap");
         boxB->runAction(ScaleBy::create(0.06,1.06));
         returntrue;
    }                                                                                                                                                 ⑦
    returnfalse;
}
 
void HelloWorld::onTouchMoved(Touch*touch, Event *event)                                                     ⑧
{
    log("onTouchMoved");
    //通過tag標簽獲得BoxA精靈
    autoboxA = this->getChildByTag(kBoxA_Tag);
    //如果BoxA精靈被點擊
    if(this->isTap(boxA, touch))
    {
         log("BoxAsprite Tap");
         //移動當前按鈕精靈的坐標位置
         boxA->setPosition(boxA->getPosition()+ touch->getDelta());
         return;
    }
    //通過tag標簽獲得BoxB精靈
    autoboxB = this->getChildByTag(kBoxB_Tag);
    //如果BoxB精靈被點擊
    if(this->isTap(boxB, touch))
    {
         log("BoxBsprite Tap");
         //移動當前按鈕精靈的坐標位置
         boxB->setPosition(boxB->getPosition()+ touch->getDelta());
         return;
    }
}
 
void HelloWorld::onTouchEnded(Touch*touch, Event *event)                                                      ⑨
{
    log("onTouchEnded");    
    //通過tag標簽獲得BoxA精靈
    autoboxA = this->getChildByTag(kBoxA_Tag);
    //如果BoxA精靈被點擊
    if(this->isTap(boxA, touch))
    {
         log("BoxAsprite Tap");
         boxA->runAction(ScaleTo::create(0.06,1.0));
         return;
    }
    //通過tag標簽獲得BoxB精靈
    autoboxB = this->getChildByTag(kBoxB_Tag);
    //如果BoxB精靈被點擊
    if(this->isTap(boxB, touch))
    {
         log("BoxBsprite Tap");
         boxB->runAction(ScaleTo::create(0.06,1.0));
         return;
    }
}
 
bool HelloWorld::isTap(Node* node,Touch* touch)                                                                    ⑩
{
    //獲取觸摸點相對Node位置坐標
    PointlocationInNode = node->convertToNodeSpace(touch->getLocation());                         ⑪
    Sizes = node->getContentSize();                                                                                                    ⑫
    Rectrect = Rect(0, 0, s.width, s.height);                                                                                         ⑬
 
    //點擊範圍判斷檢測
    if(rect.containsPoint(locationInNode))                                                                                         ⑭
    {
         returntrue;
    }
    returnfalse;
}

上述代碼第①、⑧、⑨行分別定義了三個觸摸事件函數函數的參數touch是在層中的觸摸點event是觸摸事件我們不能使用8.1.3一節的auto target = static_cast<Sprite*>(event->getCurrentTarget())語句獲得要點擊的精靈事實上event->getCurrentTarget()函數獲得的是事件源這裏的事件源是當前的層而不是精靈對象。那麼我們如何判斷是否點擊了哪個精靈呢我的辦法是每一個精靈逐一判斷。所以我們在第②~⑤行代碼判斷精靈BoxA是否被點擊在第⑥~⑦行代碼判斷精靈BoxB是否被點擊。

代碼第③行用到了isTap函數我們在第⑩行定義了該函數它是用來判斷觸摸點是否在精靈內這個判斷主要是通過Rect的containsPoint函數判斷的。函數中第⑪行代碼獲取觸摸點相對精靈對象本地坐標。第⑫行代碼是獲得精靈對象的尺寸。第⑬行代碼是通過精靈對象的尺寸創建Rect變量。第⑭行代碼rect.containsPoint(locationInNode)是判斷是否觸摸點在精靈對象範圍。




更多內容請關注最新Cocos圖書《Cocos2d-x實戰 C++卷》
本書交流討論網站https://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程https://v.51work6.com
歡迎加入Cocos2d-x技術討論群257760386


《Cocos2d-x實戰 C++卷》現已上線各大商店均已開售

京東https://item.jd.com/11584534.html

亞馬遜https://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

當當https://product.dangdang.com/23606265.html

互動出版網https://product.china-pub.com/3770734

《Cocos2d-x實戰 C++卷》源碼及樣章下載地址

源碼下載地址https://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

樣章下載地址https://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

歡迎關注智捷iOS課堂微信公共平台



最後更新:2017-04-03 05:39:34

  上一篇:go Akka學習筆記(二):Actor Systems
  下一篇:go Android 適配器教程(三)