我找到了 Daniel Vilcez 开发的像素完美碰撞算法,并包含在这个 cocos2d-iphone.org 论坛主题中共享的项目中。
下面是我感兴趣的算法部分。我正在尝试修改它,因为每当我使用 CCRenderTexture 时,就像最初在代码中一样,应用程序崩溃了。
我正在考虑基于圆形碰撞的替代方法,但这些方法“不是像素完美的”,如果我的子弹是这种形状的波浪,它就不能很好地工作。
**我想知道如何让算法与在 CCSpriteBatchNode 中批处理的精灵一起工作?如果是这样,这是否严格包括 CCRenderTexture 的使用?**
准确地说,这个问题与我的另一个问题部分相关,关于创建导致我的应用程序崩溃的 CCRenderTexture 实例。我发布了两个不同的,因为在这里我问的是算法,另一个我只是问为什么 CCRenderTexture 会导致我的应用程序崩溃(不使用 Daniel 的像素完美算法,而只是创建 CCRenderTexture 的实例)。
改编的代码(这里缺少 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 中批处理的高分辨率精灵(请参阅此处的评论)。