cocos2d-x中实现不规则按钮的点击效果

3/1/2017来源:Android开发人气:1062

先说一点,这是从别人那里扒来的,亲测有效觉得不错,分享一下:

原理很简单,就是判断按钮图片的点击区域 像素点透明度是不是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!"); 

}

附加是我测试使用的图片,中间是空的