1. 程式人生 > >cocos2d-x中實現不規則按鈕的點選效果

cocos2d-x中實現不規則按鈕的點選效果

先說一點,這是從別人那裡扒來的,親測有效覺得不錯,分享一下:

原理很簡單,就是判斷按鈕圖片的點選區域 畫素點透明度是不是0,需要修改原始碼;

我拿cocos2dx 3.10的版本(xcode環境)舉例:

第一步,新建一個cocos專案,找到cocos的原始碼中的Widget,它在ui 》base 》UIWidget.h檔案中,在Widget類的public中新增三個函式:

virtual bool AlphaTouchCheck(const Vec2 &point);

virtual bool getAlphaTouchEnable();

virtual void setAlphaTouchEnable(bool

isAlphaTouch);

然後再新增一個布林型變數:

bool _isAlphaTouchEnable;

在UIWidget.cpp檔案中實現:

bool Widget::AlphaTouchCheck(const Vec2 &point)

    {

        returntrue;

    }

bool Widget::getAlphaTouchEnable()

    {

return_isAlphaTouchEnable;

    }

void Widget::setAlphaTouchEnable(bool isAlphaTouch)

    {

        _isAlphaTouchEnable

= isAlphaTouch;  

    }

第二步,找到Button的原始碼,在ui 》widgets 》UIButton.h中過載函式bool AlphaTouchCheck(constVec2& point); 在UIbutton.cpp中實現:

bool Button::AlphaTouchCheck(const Vec2& point)

    {

if (getAlphaTouchEnable())

        {

            Image* normalImage =newImage();

            normalImage->initWithImageFile

(_normalFileName);//_normalFileName是button預設的那張圖片路徑

            auto data = normalImage->getData();

            if (data ==NULL)

            {

                returntrue;

            }

            auto locationInNode =this->convertToNodeSpace(point);

            int pa =4 * ((normalImage->getHeight() - (int)(locationInNode.y) -1) * normalImage->getWidth() + (int)(locationInNode.x)) +3;

            unsignedint ap = data[pa];

            if (ap <20)//這裡判斷透明度,小於20就判斷為點選無效,課根據自己的需要修改為0等等..

            {

                CC_SAFE_DELETE(normalImage);

                returnfalse;

            }

            else

            {

                CC_SAFE_DELETE(normalImage);

                returntrue;  

            }  

        }  

        returntrue;  

    }

第三步:比較重要,在在ui 》base 》UIWidget.cpp檔案中找到boolWidget::onTouchBegan(Touch *touch,Event *unusedEvent),在

_touchBeganPosition = touch->getLocation();這一句程式碼後面新增

if(!AlphaTouchCheck(_touchBeganPosition))

        {

            return false;

        }

ok,完成。原始碼修改到這裡結束;

然後基本沒什麼,就是Button的正常使用,要注意一點的是,這個button的點選效果有個開關:setAlphaTouchEnable(bool ); 

測試在HelloWorld.cpp中新增一個Button,選一個不規則的圖片作為預設按鈕圖,程式碼:

Button*s = Button::create("testbtn.png");//圖片中間區域透明

s->addTouchEventListener(this,toucheventselector(HelloWorld::btnclick));

s->setPosition(Vec2(300,200));

addChild(s);

s->setAlphaTouchEnable(true);//false為關閉該功能,和普通button一樣,點選中間區域按鈕後執行btnclick;true為開啟,點選中間區域後不進入btnclick函式;

voidHelloWorld::btnclick(Ref*r,cocos2d::ui::TouchEventType t)

{

CCLog("Log:%s" ,"click!"); 

}



附加是我測試使用的圖片,中間是空的