【原】cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮
本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要执行不同的事件
一般情况下,如果要检测某一个精灵是否被点中,做法如下
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent)
{
CCSize sprSize = pSpr->getContentSize();
CCPoint point = pSpr->convertTouchToNodeSpace(pTouch);
, , sprSize.width, sprSize.height).containsPoint(point)) {
CCLOG("点中");
}
return true;
}
上述方法判断的都是矩形区域,包括透明的部分点击也是有效的,如果要制作上面的八卦按钮,就不好办了。
这样就引出了下面的实现方式,做两张图,这两张图一样大,叠在一起正好是一个完整的八卦。
点击的时候判断点击的区域是否是透明的,如果不是透明的就响应事件!如果是透明的就向下传递。
如何获取点击的区域是否透明呢?创建一个CCRenderTexture,把当前的Sprite画上去,然后通过CCRenderTexture得到一个CCImage,然后在取到CCImage里面某一个点得像素信息。
获取点是否是透明的,我封装了两个函数,具体实现代码如下
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent)
{
CCSize sprSize = pSpr->getContentSize();
CCPoint point = pSpr->convertTouchToNodeSpace(pTouch);
, , sprSize.width, sprSize.height).containsPoint(point)) {
int i = getOpacityWithPoint(pSpr, point);
) {
CCLog("点中");
}
}
return true;
}
int HelloWorld::getOpacityWithPoint(cocos2d::CCSprite *pSpr, cocos2d::CCPoint point)
{
point.y = pSpr->getContentSize().height-point.y;
CCImage * pImage = createImageFromSprite(pSpr);
ccColor4B c = pImage->getColor4B(point.x, point.y);
CCLog("%d, %d, %d, %d", c.r, c.g, c.b, c.a);
return c.a;
}
cocos2d::CCImage* HelloWorld::createImageFromSprite(cocos2d::CCSprite *pSpr)
{
CCSprite* pNewSpr = CCSprite::createWithSpriteFrame(pSpr->displayFrame());
pNewSpr->setAnchorPoint(CCPointZero);
CCRenderTexture* pRender = CCRenderTexture::create(pNewSpr->getContentSize().width, pNewSpr->getContentSize().height, kCCTexture2DPixelFormat_RGBA8888);
pRender->begin();
pNewSpr->visit();
pRender->end();
return pRender->newCCImage();
}
忘记把CCImage中添加的代码贴出来了
在CCImage.h文件中加入如下函数
public:
ccColor4B getColor4B(float x, float y)
{
ccColor4B color = { , , , };
;
;
m_pData += (iy*getWidth() + ix) * ;
color.r = *(m_pData++);
color.g = *(m_pData++);
color.b = *(m_pData++);
color.a = *(m_pData++);
return color;
};
【原】cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮的更多相关文章
- 获取Sprite上某一个点的透明度
转载[ http://www.cnblogs.com/Androider123/p/3795050.html] 本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要 ...
- 获取UILabel上最后一个字符串的位置。获取文字长度和高度,自动换行
//行的高度. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPat ...
- HTML5开发笔记:图片上传预览
我们知道通过<input type="file">可以用来进行一个图片或者文件的上传,然而浏览器自带的一个缩略图预览的功能其实是相当不美观的,很多时候我们希望可以在上传 ...
- TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint
前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...
- 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含着CPU的生产日期,版本号,型号等等,那么,在我们的这款友善之臂Tiny4412的板子上,我的这个CPU的ID又是多少呢?从我 ...
- 【原】cocos2d-x开发笔记:多点触控
在项目开发中,我们做的大地图,一个手指头按下滑动可以拖动大地图,两个手指头按下张开或者闭合,可以放大和缩小地图 在实现这个功能的时候,需要使用到cocos2d-x的多点触控功能. 多点触控事件,并不是 ...
- [开发笔记]-获取歌曲ID3信息
ID3介绍: ID3,一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版. 获 ...
- java笔记----获取电脑上ip(内网ip)
private static String getHostIP(){ String tempIP = "127.0.0.1"; try { if(isIpv4(InetAddres ...
- iOS 开发笔记-获取某个APP素材
2019.02.01 更新 以下这种方式只适合越狱的手机,目前12.1以后,iTools已经不适合了,请看最下面第二种方式. 有时候,我们看到别人的APP做得挺漂亮的,那么我们想查看该APP的图片素材 ...
随机推荐
- Spring MVC_Hello World
[Hello World] 步骤: (1)加入jar包, (2)在web.xml中配置DispatcherServlet, (3)加入Spring MVC的配置文件, (4)编写处理请求的处理器,并标 ...
- JavaEE最新技术整理--新技术
JavaEE最新技术整理-----https://blog.csdn.net/qq_21683643/article/details/79747922
- Project导入错误 36D27C48
做后台系统导出Project时,部署到服务器提示:检索 COM 类工厂中 CLSID 为 {36D27C48-A1E8-11D3-BA55-00C04F72F325} 的组件失败,原因是出现以下错误: ...
- MyBatis3-示例工程
一.准备工作: 0.新建QuitStart类型POM项目(即Application),Java Build Path为JDK1.8,Java Compiler为1.8,MySQL为5.5.38,数据库 ...
- 《WF in 24 Hours》读书笔记 - Hour 2(2) - Workflow:创建分支和传递参数
1. 修改workflow1.xaml,添加Flowchart,添加Flowdesicion,添加CodeActivity2,并且名字改为下图所示: 2. CodeActivity1和2的代码如下: ...
- Java线程池几个參数的理解
线程池几个參数的理解: 比方去火车站买票, 有10个售票窗体, 但仅仅有5个窗体对外开放. 那么对外开放的5个窗体称为核心线程数, 而最大线程数是10个窗体.假设5个窗体都被占用, 那么后来的人就必 ...
- POJ 1386 Play on Words(有向欧拉通路 连通图)
题意 见下方中文翻译 每一个单词能够看成首尾两个字母相连的一条边 然后就是输入m条边 推断是否能构成有向欧拉通路了 有向图存在欧拉通路的充要条件: 1. 有向图的基图连通: 2. 全部点的出度和 ...
- [Vue-rx] Share RxJS Streams to Avoid Multiple Requests in Vue.js
Splitting a stream into multiple streams causes new subscriptions. You can think of new subscription ...
- HDU 4499 Cannon (暴力搜索)
题意:在n*m的方格里有t个棋子,问最多能放多少个炮且每一个炮不能互相攻击(炮吃炮) 炮吃炮:在同一行或同一列且中间有一颗棋子. #include <stdio.h> #include & ...
- cc2540 cc2541 开发板资料更新日志
经过多次PCB打样和全面调试.已经完毕了cc2540 cc2541的开发板的批量贴片.硬件告一段落, 接下来是全面完好软件方面的工作.眼下已经针对没有开发经验的用户编写完毕0基础基础实验代码和教程.接 ...