国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 丹巴县| 航空| 仁寿县| 新建县| 大兴区| 阿瓦提县| 南溪县| 竹北市| 色达县| 徐州市| 连山| 台北县| 玉环县| 娄烦县| 始兴县| 闻喜县| 荆门市| 拉孜县| 古田县| 城固县| 麻江县| 卢龙县| 北碚区| 中卫市| 浦江县| 旬邑县| 库车县| 望奎县| 津南区| 静安区| 略阳县| 隆回县| 临海市| 和林格尔县| 株洲县| 富锦市| 富裕县| 应城市| 西峡县| 宁乡县| 阿尔山市|