位置: 编程技术 - 正文

cocos2dx 不规则按钮的实现

编辑:rootadmin

推荐整理分享cocos2dx 不规则按钮的实现,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

最近研究了一下像素级的触摸处理,有时候我们用一个不规则的图形作为一个按钮,这个不规则的图形是一张矩形的png图片,很可能图片的实际有效的显示内容只占整个png图片的很小一部分,剩下的大部分都是png图片的透明区域,我们想把这部分透明区域过滤掉,实现一个触摸到真实的内容才会有按钮响应的效果。

cocos2dx 不规则按钮的实现

刚开始试图通过CCSprite直接获取到纹理的像素信息,但是cocos2d-x并没有给我们提供直接通过CCSprite获取像素信息的接口,研究了几个网上的Demo,发现通过使用RenderTexture重绘可以实现这一效果,下面把代码贴出来。

#include "HelloWorldScene.h" #include "SimpleAudioEngine.h" using namespace cocos2d; using namespace CocosDenshion; CCScene* HelloWorld::scene() { // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } bool HelloWorld::init() { if (!CCLayer::init()){ return false; } this->setTouchEnabled(true); this->m_imgMan = CCSprite::create("man.png"); this->m_imgMan->setPosition(ccp(, )); this->addChild(this->m_imgMan, 1); this->m_pRenderTexture = CCRenderTexture::create(this->m_imgMan->getContentSize().width, this->m_imgMan->getContentSize().height, kCCTexture2DPixelFormat_RGBA); this->m_pRenderTexture->ignoreAnchorPointForPosition(true); this->m_pRenderTexture->setPosition(ccp(, )); this->m_pRenderTexture->setAnchorPoint(CCPointZero); this->addChild(this->m_pRenderTexture, 0, 1); return true; } bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { bool isTouched = false; CCPoint touchPoint = pTouch->getLocationInView(); CCPoint glPoint = CCDirector::sharedDirector()->convertToGL(touchPoint); if (this->m_imgMan->boundingBox().containsPoint(glPoint)) { ccColor4B color4B = {0, 0, 0, 0}; CCPoint nodePos = this->m_imgMan->convertTouchToNodeSpace(pTouch); unsigned int x = nodePos.x; unsigned int y = this->m_imgMan->getContentSize().height - nodePos.y; CCPoint point = this->m_imgMan->getPosition(); //开始准备绘制 this->m_pRenderTexture->begin(); //绘制使用的临时精灵,与原图是同一图片 CCSprite* pTempSpr = CCSprite::createWithSpriteFrame(this->m_imgMan->displayFrame()); pTempSpr->setPosition(ccp(pTempSpr->getContentSize().width / 2, pTempSpr->getContentSize().height / 2)); //绘制 pTempSpr->visit(); //结束绘制 this->m_pRenderTexture->end(); //通过画布拿到这张画布上每个像素点的信息,封装到CCImage中 CCImage* pImage = this->m_pRenderTexture->newCCImage(); //获取像素数据 unsigned char* data_ = pImage->getData(); unsigned int *pixel = (unsigned int *)data_; pixel = pixel &#; (y * (int)pTempSpr->getContentSize().width) * 1 &#; x * 1; //R通道 color4B.r = *pixel & 0xff; //G通道 color4B.g = (*pixel >> 8) & 0xff; //B通过 color4B.b = (*pixel >> ) & 0xff; //Alpha通道,我们有用的就是Alpha color4B.a = (*pixel >> ) & 0xff; CCLOG("当前点击的点的: alpha = %d", color4B.a); if (color4B.a > ) { isTouched = true; } else { isTouched = false; } //绘制完成后清理画布的内容 this->m_pRenderTexture->clear(0, 0, 0, 0); } if (this->m_pLabTips) { this->m_pLabTips->removeFromParentAndCleanup(true); this->m_pLabTips = NULL; } return isTouched; } void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (this->m_pLabTips) { this->m_pLabTips->removeFromParentAndCleanup(true); this->m_pLabTips = NULL; } this->m_pLabTips = CCLabelTTF::create("点击到非透明的像素点", "Courier", ); this->m_pLabTips->setAnchorPoint(CCPointZero); this->m_pLabTips->setPosition(ccp(.0f, .0f)); this->m_pLabTips->setColor(ccYELLOW); this->addChild(this->m_pLabTips, 1); } void HelloWorld::registerWithTouchDispatcher() { CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, CCLayer::getTouchPriority(), false); }

这里我们把alpha通道的&#;小于的像素点都视为同名的点,当点击到了透明的黑色区域时,屏幕上不显示任何文字,点击到有色区域时,观察打印日志信息:

实现的原理:我通过点击的时候把图片进行重绘,重绘的过程中,可以通过RenderTexture也就是画布,把整个画布上的像素点信息全部拿到,我让绘制的内容和画布的大小是一样的,所以就能保证画布上的每一个像素点就是我想要绘制的图片的像素点,然后通过判断像素点的alpha通道&#;,来确定这个点是否是透明色的,如果是透明色则不做触摸响应。

本文由CC原创总结,如需转载请注明出处:

【cocos2dx】如何实现场景的跳转 前面定义了一个SpalshScene.h,并声明了如下的函数,在SplashScene.cpp中对这些函数实现,跳转用到了CCNode类的定时器有关的函数,详细参考书,这里采用的

cocos2dx ActionManager播放动画回调问题 ActionManager播放动画回掉问题问题描述:我在studio编辑器里编辑了一个界面,里面有一个动画,我想当动画执行完毕后,再执行一些其他操作,然后就使

RapidJSON的一些方便操作的宏定义 以前是一直使用CCJsonConventer去把JSON字符串转化为CCDictionary对象的,现在使用cocos2d-x3.x后,不推荐使用CCDictionary了,而且,JSON库也换成了rapidjson,不过我

标签: cocos2dx 不规则按钮的实现

本文链接地址:https://www.jiuchutong.com/biancheng/372603.html 转载请保留说明!

上一篇:Cocos2dx -lua QuickXDev拓展

下一篇:【cocos2dx】如何实现场景的跳转(cocos2d怎么用)

  • 本期应补退税额和期末未缴税额
  • 对外支付哪些项目需要缴税
  • 所得税汇算清缴调整项目
  • 增值税小规模纳税人免征增值税政策
  • 盈余公积补亏为什么未分配利润增加
  • 金税盘技术维护费怎么申报
  • 银行承兑质押金的会计分录
  • 债务担保属于或有资产吗
  • 公司个人薪金怎么申报宁波
  • 调拨单可以根据哪些单据生成
  • 房屋租赁收入怎么做账
  • 印花税漏报,税务局怎么罚款
  • 劳动保险费属于营业外支出吗
  • 企业股权转让留存收益可以扣除吗
  • 隔月发票红冲,交税怎么交
  • 项目规划设计费用取费标准
  • 物业公司临时工的工资可以进成本吗
  • 土地使用管理费
  • 农产品收购发票是普票还是专票
  • 长期待摊费用当月增加当月摊销吗
  • 代理进口一般几个点费用
  • 办公室租金相关法规
  • 出口企业增值税怎么算
  • 一般纳税人注销库存需要补交税吗
  • 征缴工会筹备金的规定
  • 固定资产捐赠的增值税
  • 企业预缴多交税了如何申请退税
  • 企业外购材料的入账价值包括
  • 企业所得税是根据什么申报的
  • 无租使用房产如何征收企业所得税
  • 受托代理资产核算
  • 床垫专票可以抵扣吗
  • 生产废料怎么处理会计分录
  • 电脑开机画面都是英文怎么处理
  • 收到汇算清缴退税账务处理
  • 用产品抵债的合同怎么写
  • linux中安装命令
  • 金鱼草的养殖方法和注意事项有哪些
  • php如何自定义函数
  • PHP:gmstrftime()的用法_Date Time函数
  • 教案的近义词是什么
  • 公允价值变动损益在利润表哪里
  • 公司给员工购买商业保险报销哪些
  • 折旧和摊销的区别通俗
  • yolov1 实现
  • 未开票收入缴纳增值税吗
  • 税控盘服务费小规模可以抵扣吗
  • 企业利息收入需要缴纳所得税吗
  • 什么是全面预算控制?全面预算控制的作用有哪些?
  • 固定资产报废怎么开票
  • 存量资金上缴财政怎么做账
  • 预付账款主要是什么
  • 净利润为负数会计分录
  • 纳税人办理逾期申报流程
  • 营改增后计税依据
  • 商业仓储
  • 什么是存储过程?有哪些优缺点?
  • mysql常见报错
  • dos下如何安装win7
  • macos high sierra深色模式
  • mac电脑apple id
  • win7一键共享软件
  • w8系统怎么用
  • linux打包命令tar打包目录结构
  • netfilter/iptables模块编译及应用
  • win7系统咋样
  • cocos2d安装
  • django sessionid
  • dos命令大全及用法
  • 如何删除命令
  • async/await与promise(nodejs中的异步操作问题)
  • 原生js实现ajax步骤
  • android按钮怎么放置在下方
  • shader能做什么
  • jquery技巧
  • jquery input checked
  • 广州契税补贴2022政策
  • 个体逾期未申报一天会怎么样
  • 以划拨方式取得土地使用权的,转让房地产时
  • 天津住房公积金管理中心官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设