国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

cocos2d-x中實(shí)現(xiàn)不規(guī)則按鈕的點(diǎn)擊效果

2019-11-06 09:34:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

先說(shuō)一點(diǎn),這是從別人那里扒來(lái)的,親測(cè)有效覺得不錯(cuò),分享一下:

原理很簡(jiǎn)單,就是判斷按鈕圖片的點(diǎn)擊區(qū)域 像素點(diǎn)透明度是不是0,需要修改源代碼;

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

第一步,新建一個(gè)cocos項(xiàng)目,找到cocos的源代碼中的Widget,它在ui 》base 》UIWidget.h文件中,在Widget類的public中添加三個(gè)函數(shù):

virtual bool AlphaTouchCheck(const Vec2 &point);

virtual bool getAlphaTouchEnable();

virtual void setAlphaTouchEnable(bool isAlphaTouch);

然后再添加一個(gè)布爾型變量:

bool _isAlphaTouchEnable;

在UIWidget.cpp文件中實(shí)現(xiàn):

bool Widget::AlphaTouchCheck(const Vec2 &point)

    {

        returntrue;

    }

bool Widget::getAlphaTouchEnable()

    {

        return_isAlphaTouchEnable;

    }

void Widget::setAlphaTouchEnable(bool isAlphaTouch)

    {

        _isAlphaTouchEnable = isAlphaTouch;  

    }

第二步,找到Button的源代碼,在ui 》widgets 》UIButton.h中重載函數(shù)bool AlphaTouchCheck(constVec2& point); 在UIbutton.cpp中實(shí)現(xiàn):

bool Button::AlphaTouchCheck(const Vec2& point)

    {

        if (getAlphaTouchEnable())

        {

            Image* normalImage =newImage();

            normalImage->initWithImageFile(_normalFileName);//_normalFileName是button默認(rèn)的那張圖片路徑

            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就判斷為點(diǎn)擊無(wú)效,課根據(jù)自己的需要修改為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,完成。源代碼修改到這里結(jié)束;

然后基本沒(méi)什么,就是Button的正常使用,要注意一點(diǎn)的是,這個(gè)button的點(diǎn)擊效果有個(gè)開關(guān):setAlphaTouchEnable(bool ); 

測(cè)試在HelloWorld.cpp中添加一個(gè)Button,選一個(gè)不規(guī)則的圖片作為默認(rèn)按鈕圖,代碼:

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

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

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

addChild(s);

s->setAlphaTouchEnable(true);//false為關(guān)閉該功能,和普通button一樣,點(diǎn)擊中間區(qū)域按鈕后執(zhí)行btnclick;true為開啟,點(diǎn)擊中間區(qū)域后不進(jìn)入btnclick函數(shù);

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

{

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

}

附加是我測(cè)試使用的圖片,中間是空的


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 方正县| 青铜峡市| 铁岭市| 山东省| 阿克| 托克托县| 上思县| 伊吾县| 潼关县| 和顺县| 平顶山市| 揭阳市| 玉林市| 抚松县| 长宁区| 西城区| 宣武区| 公主岭市| 兰溪市| 清镇市| 宁晋县| 库伦旗| 湟源县| 宁都县| 香格里拉县| 海原县| 德格县| 循化| 抚顺县| 濮阳市| 麦盖提县| 财经| 蕲春县| 桂林市| 历史| 和平县| 盖州市| 锡林郭勒盟| 平谷区| 府谷县| 二手房|