ios cocos2d-iphone collision-detection pixel

ios - Cocos2d: colisión perfecta de píxeles para sprites por lotes



cocos2d-iphone collision-detection (0)

Encontré un algoritmo de colisión perfecta de píxeles desarrollado por Daniel Vilchez e incluido en un proyecto compartido en este tema del foro cocos2d-iphone.org .

A continuación está la parte del algoritmo que me interesa. Estoy intentando modificar esto porque siempre que utilicé CCRenderTexture, como originalmente en el código, la aplicación se bloqueó.

Estoy pensando en métodos alternativos basados ​​en la colisión circular, pero esos "no son perfectos para el píxel" y, en el caso de que mi bala sea una ola con esta forma , no funcionaría bien.

** Me pregunto cómo puedo hacer que el algoritmo funcione con sprites agrupados en un CCSpriteBatchNode. Y si es así, ¿esto incluye estrictamente el uso de CCRenderTexture? **

Para ser precisos, esta pregunta está parcialmente relacionada con esta otra pregunta mía , sobre la creación de una instancia de CCRenderTexture que hace que mi aplicación se bloquee. Publiqué dos diferentes porque aquí estoy preguntando sobre el algoritmo, en el otro solo pregunto por qué CCRenderTexture hace que mi aplicación se cuelgue (sin usar el algoritmo perfecto de Daniel, sino simplemente creando una instancia de CCRenderTexture).

CÓDIGO adaptado (aquí falta la CCRenderTexture porque hizo que mi aplicación fallara, así que comenté el uso de _rt - instancia de CCRenderTexture). El código no funciona correctamente, así que supongo que necesito CCRenderTexture y, por lo tanto, hice la pregunta:

-(BOOL) isPixelPerfectCollisionBetweenSpriteA:(CCSprite*)spr1 spriteB:(CCSprite*) spr2 { BOOL isCollision = NO; CGRect intersection = CGRectIntersection([spr1 boundingBox], [spr2 boundingBox]); // Look for simple bounding box collision if (!CGRectIsEmpty(intersection)) { // Get intersection info 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; //NSLog(@"/nintersection = (%u,%u,%u,%u), area = %u",x,y,w,h,numPixels); // Draw into the RenderTexture //[_rt beginWithClear:0 g:0 b:0 a: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 = 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<numPixels; i+=step) { ccColor4B color = buffer[i]; if (color.r > 0 && color.g > 0) { isCollision = YES; break; } } // Free buffer memory free(buffer); } return isCollision;

EDIT: también encontré KKPixelMaskSprite, pero no parece funcionar para sprites de alta resolución agrupados en CCSpriteBatchNodes (ver comentario aquí).