cocos2d-x中实现不规则按钮的点击效果
2017-02-28 16:25
405 查看
先说一点,这是从别人那里扒来的,亲测有效觉得不错,分享一下:
原理很简单,就是判断按钮图片的点击区域 像素点透明度是不是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,完成。源代码修改到这里结束;
4000
然后基本没什么,就是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!");
}
附加是我测试使用的图片,中间是空的
原理很简单,就是判断按钮图片的点击区域 像素点透明度是不是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,完成。源代码修改到这里结束;
4000
然后基本没什么,就是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!");
}
附加是我测试使用的图片,中间是空的
相关文章推荐
- cocos2d-x中实现不规则按钮的点击效果
- 回车直接实现点击某按钮的效果
- 点击按钮实现遮罩效果
- android仿IOS按钮点击效果,一张图片实现
- Android_UI_点击按钮切换背景效果实现
- Android_UI_点击按钮切换背景效果实现
- 实现点击ComboBox(DBComboBox)按钮下拉出现TreeView效果
- Android按钮点击效果的实现(selector)
- 图片轮换效果实现代码(点击按钮停止执行)
- Android_UI_点击按钮切换背景效果实现
- Android_UI_点击按钮切换背景效果实现
- Android中图片实现按钮点击效果
- Android_UI_点击按钮切换背景效果实现
- jquery 实现 点击按钮后倒计时效果,多用于实现发送手机验证码、邮箱验证码
- 按回车实现点击某按钮的效果 http://blog.csdn.net/jjzaihaozhe/archive/2007/08/18/1749635.aspx
- cocos2d中实现触摸按钮换图效果方案
- jquery 实现 点击按钮后倒计时效果,多用于实现发送手机验证码、邮箱验证码
- 代码实现Selector按钮点击效果
- jquery 实现 点击按钮后倒计时效果,多用于实现发送手机验证码、邮箱验证码
- 【Android 界面效果3】Android_UI_点击按钮切换背景效果实现