0

正しく動作しないため、cocos2d と glReadPixels に問題があります。Web でピクセル パーフェクト コリジョンのコードを見つけ、アプリ用に修正しましたが、アニメーションまたはより高速なアニメーションでは機能しません。

これはコードです:

-(BOOL) isCollisionBetweenSpriteA:(CCSprite*)spr1 spriteB:(CCSprite*)spr2 pixelPerfect:(BOOL)pp { BOOL isCollision = NO; CGRect intersection = CGRectIntersection([spr1 boundingBox], [spr2 boundingBox]);

// Look for simple bounding box collision
if (!CGRectIsEmpty(intersection))
{
    // If we're not checking for pixel perfect collisions, return true
    if (!pp) {return YES;}

    // 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);

    /******* All this is for testing purposes *********/


    // Draw the intersection rectangle in BLUE (testing purposes)


    /**************************************************/

    [_rt end];

    // Read buffer
    unsigned int step = 1;
    for(unsigned int q=0; q<1; q+=step)
    {
        ccColor4B color = buffer[q];

        if (color.r > 0 && color.g > 0)
        {
            isCollision = YES;
            break;
        }
    }

    // Free buffer memory
    free(buffer);
}

return isCollision;

}

どこに問題がありますか?試してみましたが、何もしませんでした。

どうもありがとうございました。よろしく。

4

1 に答える 1

0

iOS6 を使用している場合は、この投稿で解決策を確認してください。

CAEAGLLayer *eaglLayer = (CAEAGLLayer *) self.layer;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithBool:YES],
                                    kEAGLDrawablePropertyRetainedBacking,
                                    kEAGLColorFormatRGBA8,        kEAGLDrawablePropertyColorFormat,
                                    nil];

説明は、iOS6 が iOS Open GL 実装のいくつかのバグを修正し、GL バッファが画面に表示されるたびに (正しく) クリアされるようにすることです。これについてAppleが書いていることは次のとおりです。

重要: EAGLContext/-presentRenderbuffer: を呼び出す前に glReadPixels を呼び出す必要があります: 保持されたバック バッファを使用していない限り、定義された結果を取得します。

glReadPixels正しい解決策は、レンダー バッファーが画面に表示される前に呼び出すことです。その後、無効化されました。

上記の解決策は、画像を一種の「スティッキー」にするための単なる回避策です。

アプリのレンダリング パフォーマンスに影響を与える可能性があることに注意してください。ポイントは、cocos2d を使用している場合glReadPixels、レンダー バッファーが提示される前に簡単に呼び出すことができないということです。

それが役に立てば幸い。

于 2013-01-25T12:15:56.263 に答える