3

我找到了 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 中批处理的高分辨率精灵(请参阅此处的评论)。

4

0 回答 0