2012-09-08 12 views
9

私はCocos2dの初心者です。私はスプライトを持っており、そのスプライトの透明な部分に触れることを無視したい。cocos2dのスプライトの透明部分を検出しますか?

私はこの回答がCocos2d 2.0 - Ignoring touches to transparent areas of layers/spritesであり、この素晴らしい記事http://www.learn-cocos2d.com/2011/12/fast-pixelperfect-collision-detection-cocos2d-code-1of2/も知っています。

私はKKPixelMaskSpriteで動作させることができましたが、ファイルからはスプライトを使用していて、バッチノードからはスプライトを使用していません。スプライトを得るためにバッチノード(スプライトシート)を使用するたびに、動作を停止します。

私はお互いに異なるスプライトを持っていますが、私はこの方法を検出したいと思います - >タッチが現在のスプライトバウンディングボックスにある場合、その部分はスプライトかノーで透明ですか?

P.S.私はcocos2d 1.0を使用しています。物理エンジンを使用したくないので、スプライトの透過領域(バッチノードを使用して作成された領域)のタッチを無視したいだけです。どうすればいいですか?または、役に立つツールがあれば教えてください。

ありがとうございます。

+0

を作成uがCGPathRefを試してみましたか? – Guru

+0

あなたが言及したリンクが完璧なソリューションだと思います。 http://stackoverflow.com/questions/10889170/cocos2d-2-0-ignoring-touches-to-transparent-areas-of-layers-sprites – user739711

+0

@ user739711私はそれを試して、それはバッチノードではなく、単一のスプライトについてのみ私のために働いた。 – User1234

答えて

3

あなたは非矩形スプライトの衝突検出を行うためにCGMutablePathRefを使用することができます。

CGPoint loc =[mySprite convertToNodeSpace:touchPoint]; 

    if([mySprite isPointInsideMap:loc]) 
    { 
     //touched inside.. 
    } 

//Add this method in your MySprite class derived from CCSprite. 
-(bool)isPointInsideMap:(CGPoint)inPoint 
{ 
    if (CGPathContainsPoint(mCollisionPath, NULL, inPoint, NO)) 
    { 
     return true; 
    } 

    return false; 
} 

////をチェック

//がパス

CGMutablePathRef mCollisionPath = CGPathCreateMutable(); 
CGPathMoveToPoint(mCollisionPath, NULL, 0, 0); 
CGPathAddLineToPoint(mCollisionPath, NULL, 11, 82); 
CGPathAddLineToPoint(mCollisionPath, NULL, 42, 152); 
CGPathAddLineToPoint(mCollisionPath, NULL, 86, 202); 
CGPathAddLineToPoint(mCollisionPath, NULL, 169, 13); 
CGPathCloseSubpath(mCollisionPath); 
+1

ありがとう、このソリューションは私のために働いた。 – User1234

+0

@ User1234 :(:(:( – Guru

+0

どうしたの? – User1234

1

私は私のためにあなたのあるタッチでバウンディングボックスを変更しようと、さまざまなスプライトのためにそれを減らすだろう...

+0

ありがとう、私は今使用している、私は各スプライトのためにadjustedBoundingBoxを持っています。それについての悪いことは、それは矩形だけにすることができます。答えがどうかありがとう、+1 upvote。 – User1234

2

この答えは、私はあなたのコードを与えることはありませんよう、ご想像以上に拡散していますこれを実装する方法は次のとおりです。

スプライトの境界ボックスの位置(該当する場合は透明領域を含むスプライトの隅)と、画面上のタッチの位置があります。この情報を使用して、スプライトのの内側にあるの位置を調べることができます。言い換えれば、ゲーム画面とは無関係に、タッチされたピクセルを見つけることができます。

ピクセル位置(xとy)、画像(おそらくPNG)を開いて、そのピクセルのRGB [A]値を取得しました。各PNGには透明キーがあります。これはアルファチャンネルですPNGの内部ピクセルの色が(x; y)==透明キーである場合、そのピクセルは透明です

問題のピクセルのアルファ値を取得できる場合は、が0に等しい場合、ピクセルは透明です。

編集:セマンティクス(「アルファチャンネル」)

+0

私はすでにそのソリューションを試してみましたが、私の質問ではリンクされていますが、バッチノードでは機能しませんでした。ありがとう。 – User1234

関連する問題