Effective Pixel Collision Detection in Cocos2dx

I am trying to port the perfect collision detection to Cocos2d-x, the original version was made for Cocos2D and can be found here: http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color -blending /

Here is my code for Cocos2d-x version

 bool CollisionDetection :: areTheSpritesColliding (cocos2d :: CCSprite * spr1, cocos2d :: CCSprite * spr2, bool pp, CCRenderTexture * _rt) {bool isColliding = false;  CCRect intersection;  CCRect r1 = spr1-> boundingBox ();  CCRect r2 = spr2-> boundingBox ();  intersection = CCRectMake (fmax (r1.getMinX (), r2.getMinX ()), fmax (r1.getMinY (), r2.getMinY ()), 0,0);  intersection.size.width = fmin (r1.getMaxX (), r2.getMaxX () - intersection.getMinX ());  intersection.size.height = fmin (r1.getMaxY (), r2.getMaxY () - intersection.getMinY ());  // Look for simple bounding box collision if ((intersection.size.width> 0) && (intersection.size.height> 0)) {// If we're not checking for pixel perfect collisions, return true if (! Pp ) {return true;  } unsigned int x = intersection.origin.x;  unsigned int y = intersection.origin.y;  unsigned int w = intersection.size.width;  unsigned int h = intersection.size.height;  unsigned int numPixels = w * h;  // CCLog ("Intersection X and Y% d,% d", x, y);  // CCLog ("Number of pixels% d", numPixels);  // Draw into the RenderTexture _rt-> beginWithClear (0, 0, 0, 0);  // Render both sprites: first one in RED and second one in GREEN glColorMask (1, 0, 0, 1);  spr1-> visit ();  glColorMask (0, 1, 0, 1);  spr2-> visit ();  glColorMask (1, 1, 1, 1);  // Get color values โ€‹โ€‹of intersection area ccColor4B * buffer = (ccColor4B *) malloc (sizeof (ccColor4B) * numPixels);  glReadPixels (x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);  _rt-> end ();  // Read buffer unsigned int step = 1;  for (unsigned int i = 0; i 0 && color.g> 0) {isColliding = true;  break;  }} // Free buffer memory free (buffer);  } return isColliding;  } 

My code works fine if I send the "pp" parameter as false. That is, if I only do a collision with a bounding box, but I cannot get it to work correctly for the case when I need a collision with Pixel Perfect. I think the opengl disguise code does not work as I expected.

Here is the code for "_rt"

  _rt = CCRenderTexture :: create (visibleSize.width, visibleSize.height);
     _rt-> setPosition (ccp (origin.x + visibleSize.width * 0.5f, origin.y + visibleSize.height * 0.5f));
     this-> addChild (_rt, 1000000);
     _rt-> setVisible (true);  // For testing

I think I'm wrong in implementing this CCRenderTexture

Can someone guide me with what I am doing wrong?

Thank you for your time:)

+6
source share
2 answers

Finally, the problem is resolved. I had to use custom opengl fragment shaders to shade one of the sprites completely RED and the other completely BLUE, and then iterate over glReadPixels to find any pixel that has both RED and BLUE pixels. (Mixing should also be considered, we do not want to replace one pixel value with another)

Depth information can be found in my blog post http://blog.muditjaju.infiniteeurekas.in/?p=1

+3
source

You do not go through the buffer correctly.

// Read buffer unsigned int step = 1; for(unsigned int i=0; i<numPixels; i+=step) { ccColor4B color = buffer; if (color.r > 0 && color.g > 0) { isCollision = YES; break; } } 

source: http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/#post-337907

+1
source

Source: https://habr.com/ru/post/952868/


All Articles