先說(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è)試使用的圖片,中間是空的新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注