cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮
2014-09-25 22:56
369 查看
本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要执行不同的事件
一般情况下,如果要检测某一个精灵是否被点中,做法如下
上述方法判断的都是矩形区域,包括透明的部分点击也是有效的,如果要制作上面的八卦按钮,就不好办了。
这样就引出了下面的实现方式,做两张图,这两张图一样大,叠在一起正好是一个完整的八卦。
点击的时候判断点击的区域是否是透明的,如果不是透明的就响应事件!如果是透明的就向下传递。
如何获取点击的区域是否透明呢?创建一个CCRenderTexture,把当前的Sprite画上去,然后通过CCRenderTexture得到一个CCImage,然后在取到CCImage里面某一个点得像素信息。
获取点是否是透明的,我封装了两个函数,具体实现代码如下
忘记把CCImage中添加的代码贴出来了
在CCImage.h文件中加入如下函数
http://www.cnblogs.com/Androider123/p/3795050.html
一般情况下,如果要检测某一个精灵是否被点中,做法如下
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent) { CCSize sprSize = pSpr->getContentSize(); CCPoint point = pSpr->convertTouchToNodeSpace(pTouch); if (CCRectMake(0, 0, 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); if (CCRectMake(0, 0, sprSize.width, sprSize.height).containsPoint(point)) { int i = getOpacityWithPoint(pSpr, point); if (i > 0) { 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 = { 0, 0, 0, 0 }; int ix = (int)x - 1; int iy = (int)y - 1; m_pData += (iy*getWidth() + ix) * 4; color.r = *(m_pData++); color.g = *(m_pData++); color.b = *(m_pData++); color.a = *(m_pData++); return color; };
http://www.cnblogs.com/Androider123/p/3795050.html
相关文章推荐
- cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮
- Android应用开发笔记(10):制作自定义背景Button按钮、自定义形状Button的全攻略
- 【笔记】Cocos2d-x高级开发教程:制作自己的<捕鱼达人> 笔记一:序_前言_第一章
- quick-cocos2d-x游戏开发【6】——制作自定义效果按钮菜单
- 获取Sprite上某一个点的透明度
- Android应用开发笔记(10):制作自定义背景Button按钮、自定义形状Button的全攻略
- cocos2d-x 3.0开发笔记---用progressTimer制作血槽
- 用node.js+express.js+mongodb+jade开发一个完整的项目笔记(1)【页面即页面之间逻辑的制作】
- cocos2d-x 3.0开发笔记---用progressTimer制作血槽
- Cocos2D-X笔记(1)制作一个动态的精灵
- quick-cocos2d-x从零开始游戏开发笔记(三):参照Flappy Bird制作第一个游戏①
- iOS开发笔记--viewWithTag获取subview规则详解
- 自己写的一个分享按钮的插件(可扩展,内附开发制作流程)
- iOS开发笔记--viewWithTag获取subview规则详解
- 用cocos2d 2.1制作一个过河小游戏(2): 牧师与魔鬼Sprite设计
- 用cocos2d 2.1制作一个过河小游戏(3): 船与河岸Sprite设计
- 一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
- Unity3D游戏开发之在uGUI中使用不规则精灵制作按钮
- Android开发学习笔记--给一个按钮定义事件