转载【 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();
}

最新文章

  1. 如何在真机装linux(本人在台式机上又添了个硬盘)
  2. 我的ORM之八-- 事件
  3. slice,substr和substring的区别
  4. java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解
  5. 100款免费的圣诞节矢量图标素材(PSD & SVG)
  6. Android Activity/Service/Broadcaster三大组件之间互相调用
  7. set 赋值(转载)
  8. android110 jni01
  9. POJ 3414 Pots【bfs模拟倒水问题】
  10. HDOJ(HDU) 2136 Largest prime factor(素数筛选)
  11. 最长公共子序列--nyoj36
  12. Leetcode:Swap Nodes in Pairs 单链表相邻两节点逆置
  13. 至Android虚拟机发送短信和拨打电话
  14. Button颜色选择器进阶
  15. .NET Core 2.1 Preview 2发布 - April 10, 2018
  16. Mysql 多表数据拼接插入及子查询结果集随机取一条
  17. Java String、StringBuilder、StringBuffer[笔记]
  18. opencv模板匹配有趣的链接
  19. jetbrain_ia
  20. 【代码审计】CmsEasy_v5.7 代码执行漏洞分析

热门文章

  1. 消息队列RabbitMQ使用教程收集
  2. python 交互模式 方向键乱码问题解决
  3. dubbo服务的group和version
  4. TCP打洞与UDP打洞的差别
  5. component and slot
  6. Office Excel找不到PERSONAL.XLS怎么办
  7. quick-cocos2d-x游戏开发【1】——引擎结构总览和创建项目
  8. 前端为啥要用javascript框架
  9. JavaScript基础 -- ECMAscript
  10. Ubuntu14.04 x64 zabbix 3.0 安装