我找到了Daniel Vilchez开发的像素完美碰撞算法,该算法包含在共享in this cocos2d-iphone.org forum topic的项目中。
下面是我感兴趣的算法部分。我试图修改这个,因为每当我使用CCRenderTexture时,就像代码中最初的那样,App崩溃了。
我正在考虑alternative methods based on circle collision,但那些“不是像素完美”,如果我的子弹是this shape的波浪,它将无法正常工作。
**我想知道如何使用在CCSpriteBatchNode中批处理的精灵来运行算法?如果是这样,这严格包括CCRenderTexture的使用? **
准确地说,这个问题与this other question of mine部分相关,在创建导致我的App崩溃的CCRenderTexture实例时。我发布了两个不同的,因为我在这里询问算法,另一个我只是问为什么CCRenderTexture导致我的App崩溃(没有使用Daniel的像素完美算法,只是创建了CCRenderTexture的实例)。
改编的CODE(这里缺少CCRenderTexture,因为它让我的应用程序崩溃了,所以我注释掉了_rt的用法--CCRenderTexture的实例)。代码不能正常工作,所以我想我需要CCRenderTexture,因此我问了一个问题:
-(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;
编辑:我发现KKPixelMaskSprite但它似乎不适用于在CCSpriteBatchNodes中批量处理的高分辨率精灵(请参阅此处的comment)。