• 获取Sprite上某一个点的透明度


    转载【 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();
    }
  • 相关阅读:
    MybatisPlus自动填充公共字段的策略
    docker内的应用访问宿主机上的mysql和Redis
    Spingboot整合Redis,用注解(@Cacheable、@CacheEvict、@CachePut、@Caching)管理缓存
    集群中的session共享问题解决方案
    Java并发之原子性,有序性,可见性,以及Happen-Before原则
    Java NIO技术概述
    Java反射机制总结
    java线程以及定时任务
    java流概述以及文件读写示例
    CSS常用内容总结(二)
  • 原文地址:https://www.cnblogs.com/mokey/p/5689453.html
Copyright © 2020-2023  润新知