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

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

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

}

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

版权声明:

转载于:https://blog.51cto.com/12525470/1978197

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

  1. Android处理ListView中的Item中的Button按钮不能点击的问题

    问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...

  2. android中按钮凹下去,实现按钮的点击效果

    不多说,直接进入正题: 1.新建一个Android Application Project 2.在res文件夹中放入几个精心挑选或是经过PS处理的按钮图片(用PS处理保存时,最好保存为同样大小的图片, ...

  3. Flutter中为图片设置波纹点击效果

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 网易云[玩转大前端]配套课程 EDU配套 教程 Flutter开发的点滴积累系列文章 为图片添加水波纹点击效 ...

  4. CSS实现button按钮的点击效果

    需求 如下图所示,如果我们要实现这样的按钮点击效果,用CSS怎样去实现呢? 实现 个人方法是通过伪元素before来实现,上代码: HTML: <button class="prima ...

  5. 前端实现表格中的颜色变化以及不同点击效果

    环境: Python flask框架下的 html页面 目标: 1. 实现根据不同status显示不同颜色 2. 实现表格中对应链接根据不同状态不同点击效果 效果: 不同任务状态不同颜色显示,不同重启 ...

  6. 给页面字段中添加一个按钮,点击按钮实现弹窗效果

    页面效果: 点击按钮后弹窗效果: 点击左上角搜索框效果: 页面实现代码 首先配置一个入住房间字段 <field><header>入住房间</header><d ...

  7. android 按钮顶级效果_Android 中按钮的点击效果

    Android 中按钮点击后的效果通常是通过更换图片,或者背景色来实现的. 之前做的一直都是手动写在点击事件里,今天发现了一种更合适的方法,写在xml文件中. 比如,我有两张图片,一张是点击前的bef ...

  8. C#中调用Flash按钮,点击按钮可打开相应的功能

    1.制作一个FLASH按钮,并在按钮上添加如下代码: on (release) { fscommand ("Send Action"); } 2.生成swf文件 3.在FLASH控 ...

  9. vue遇到的小白问题之三——按钮的点击效果的实现

    问题是,需要对一个按钮进行的点击判断.其实就是disabled的使用 遇到的问题是disabled只要写在vue的按钮上就不能点击,不能进行判断.无论disabled=true还是disabled=f ...

最新文章

  1. Processes and Threads
  2. qt 关闭对话框 提醒_qt5信息提示框QMessageBox用法
  3. JavaFX中的塔防(5)
  4. STM32位带操作实现过程解析
  5. linux 修改 java 内存_Linux 和 Windows修改Java虚拟机内存大小
  6. python如何批量下载邮箱全部附件_Python编写执行测试用例及定时自动发送最新测试报告邮件...
  7. 大数据,并非一蹴而就
  8. SVN学习总结(4)——解决Win10 SVN图标不显示问题
  9. 向量的各种积,都有哪些,分别如何表示
  10. 新浪微博错误提示代码
  11. 容器存储卷的介绍与使用
  12. 快慢指针(Java版)
  13. matlab二阶滤波器设计,基于matlab的各类滤波器设计
  14. 精读《设计模式 - Prototype 原型模式》
  15. 计算机无法共享的原因,文件夹无法共享的原因及其解决办法
  16. Java八股文基础知识
  17. 智能车载终端项目方案
  18. 打造FreeBSD桌面系统
  19. DTE和DCE的区别下:配置串口链路通信
  20. 16个HTML5 框架、模板以及生成工具

热门文章

  1. ac3168无线网卡驱动下载_计算机基础:网卡
  2. java反射创建实例_Java反射创建实例
  3. iphone11没有电池小组加件_iPhone 11系列工信部数据:全系4GB运存电池最大达3969mAh...
  4. 搭建一个企业级的Vue工程!
  5. 分分钟写出Vue原理
  6. Spring MVC访问页面拦截js和css文件解决方法( No mapping found for HTTP request with URI [/Recruit/js/popper1.15.0.)
  7. 20200729:力扣199周周赛题解(下)
  8. 20190830:(leetcode习题)二叉树的最大深度
  9. dataframe 如何增加新的索引_带你领略pandas中多表之间如何处理
  10. 大小写 字符串_C# 读取环境变量,和字符串大小写转换