Daniel Vilchez によって開発され、この cocos2d-iphone.org フォーラム トピック で共有されているプロジェクトに含まれているピクセル パーフェクト コリジョン アルゴリズムを見つけました。
以下は、私が興味を持っているアルゴリズムの部分です。CCRenderTexture を使用するたびに、コードの最初のようにアプリがクラッシュしたため、これを変更しようとしています。
円の衝突に基づく代替方法を考えていますが、それらは「ピクセルパーフェクトではありません」。弾丸がこの形状の波の場合、うまく機能しません。
** CCSpriteBatchNode でバッチ化されたスプライトでアルゴリズムを動作させるにはどうすればよいでしょうか? もしそうなら、これには CCRenderTexture の使用が厳密に含まれますか? **
正確に言うと、この質問は、アプリをクラッシュさせる CCRenderTexture のインスタンスを作成するという私の他の質問に部分的に関連しています。ここではアルゴリズムについて質問しているため、2 つの異なるものを投稿します。もう 1 つは、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 でバッチ処理された高解像度のスプライトでは機能しないようです (ここのコメントを参照)。