cocos2d判断精灵某点颜色是否有效

前端之家收集整理的这篇文章主要介绍了cocos2d判断精灵某点颜色是否有效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

用了一段时间的Cocos2d-3.x,遇到一个问题,就是判断触摸的精灵像素是否有效,而cocos并没有获取Sprite某一点像素值的方法

在网上看到有人通过保存Image像素的方法,来记录像素值。或者通过Image::initWithImageFile 来实现获取像素值。

前者浪费内存,后者浪费性能。今天来分享一下我的实现方法

  1. /** * 判断Sprite某点像素值是否有效 * @author devefx * @date 2016/8/13 */
  2. bool isNonInvalidPixel(Sprite* sprite,const Point& point)
  3. {
  4. Rect rect = sprite->getBoundingBox();
  5.  
  6. if (rect.containsPoint(point))
  7. {
  8. GLint oldFBO;
  9. glGetIntegerv(GL_FRAMEBUFFER_BINDING,&oldFBO);
  10.  
  11. GLuint frameBuffer;
  12. glGenFramebuffers(1,&frameBuffer);
  13. glBindFramebuffer(GL_FRAMEBUFFER,frameBuffer);
  14.  
  15. glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,sprite->getTexture()->getName(),0);
  16.  
  17. CCASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE,"Could not attach texture to framebuffer");
  18.  
  19. Rect frameRect = sprite->getSpriteFrame()->getRectInPixels();
  20. // subtract anchor point
  21. GLint x = point.x - rect.getMinX();
  22. GLint y = point.y - rect.getMinY();
  23. // convert left-handed
  24. y = frameRect.size.height - 1 - y;
  25. // add frame origin
  26. x = x + frameRect.origin.x;
  27. y = y + frameRect.origin.y;
  28.  
  29. Color4B color;
  30.  
  31. glPixelStorei(GL_PACK_ALIGNMENT,1);
  32. glReadPixels(x,y,1,GL_RGBA,GL_UNSIGNED_BYTE,&color);
  33.  
  34. glBindFramebuffer(GL_FRAMEBUFFER,oldFBO);
  35. glDeleteFramebuffers(1,&frameBuffer);
  36.  
  37. return color.a != 0;
  38. }
  39. return false;
  40. }

主要是使用FBO关联已经加载的texture,再通过glReadPixels来获取像素值

猜你在找的Cocos2d-x相关文章