cocos2d-x sprite觸摸處理

轉自:http://www.cnblogs.com/lancidie/archive/2013/04/01/2993890.htmlhtml

咱們經常須要判斷用戶的點擊操做是否落於某個sprite之上,進而讓這個sprite作出響應。程序員

可是若是咱們經過繼承CCSprite類來實現本身的Sprite類的時候,產生的視圖尺寸會充滿屏幕。多個Sprite在同一層的時候會發生重疊,致使咱們經過回調函數傳遞進的touch點是相對於最上層Sprite來講的。函數

好在咱們能夠經過CCDirector::sharedDirector()->convertToGL(CCTouch* touch->locationInView());的方法來得到touch point的絕對座標。而後經過遍歷屏幕上全部的sprite,依次檢查落點來判斷用戶點擊應該被哪一個Sprite接受。this

但其實Cocos2d-x已經爲咱們提供了一個很是方便的方法來判斷用戶點擊了哪一個Sprite。spa

假如在這裏咱們有一個MySprite繼承了CCSprite,同時爲了響應點擊事件,咱們還須要繼承CCTargetedTouchDelegate
後者這個類爲咱們提供了三個virtual的回調函數:
code

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMove(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);

這三個函數分別在用戶「點擊」,「點擊拖動」,「擡起手指」的時候被調用。htm

其中ccTouchBegan函數的返回值是bool類型,其緣由就是系統會根據該回調函數的返回值來判斷點擊消息是否已經傳遞給用戶須要的Sprite。blog

具體點兒:若是該回調函數返回true,說明程序員已經認爲須要接受到這個觸摸消息的Sprite已經接收到了這個觸摸消息。那麼程序的觸摸消息傳遞就會到此爲止,只在本層被使用(也會被本層的ccTouchMove,ccTouchEnded所使用)。若是返回false,說明這個觸摸消息並無傳遞到須要接受這個消息的Sprite中去,這時系統會將這個觸摸消息傳遞到下一層Sprite,而且由這一層的ccTouchBegan來處理這個消息。繼承

貼個示例代碼:事件

bool MySprite::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){
    if(containsTouchLocation(touch)){
        cout<<"Touch:"<<this->getTag()<<endl;
        return true;
    }
    return false;
}

其中containsTouchLocation是用戶本身實現的:經過在該函數中獲取position,並與傳遞進函數的touch做比較,判斷用戶的觸摸操做是否落於該sprite區域以內。

若是落在該區域,則返回true,中斷這個消息鏈。同時這個sprite會相應相應的ccTouchMove,ccTouchEnded若是沒有落在該區域,則返回false,而且將這個消息傳遞給下一層的sprite。

相關文章
相關標籤/搜索