9

私は Cocos2d の初心者です。スプライトがあり、そのスプライトの透明領域へのタッチを無視したい。

私はこの回答Cocos2d 2.0 - Ignoring touches to transparent area of​​layers/sprites、およびこの素晴らしい記事http://www.learn-cocos2d.com/2011/12/fast-pixelperfect-collision-detection-cocos2dを認識しています-code-1of2/ .

KKPixelMaskSprite で動作させることができましたが、バッチ ノードからではなく、ファイルからスプライトを使用した場合のみです。バッチ ノード (スプライト シート) を使用して sprite を取得すると、動作が停止します。

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

PSI は cocos2d 1.0 を使用しています。今のところ物理エンジンを使用したくありません。スプライトの透明な領域 (バッチ ノードを使用して作成されたもの) へのタッチを無視したいだけです。どうすればよいですか? または、役立つツールはありますか?

よろしくお願いします。

4

3 に答える 3

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);
于 2012-09-20T16:28:31.317 に答える
2

コード例を提供しないため、この回答は予想よりも拡散していますが、これを実装する方法は次のとおりです。

スプライトのバウンディング ボックス (該当する場合は透明領域を含むスプライトの角) の位置と、画面上のタッチの位置がわかります。この情報を使用して、スプライト内のタッチの位置を特定できます。つまり、ゲーム画面に関係なく、タッチしたピクセルを見つけることができます。

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

問題のピクセルのアルファ値を取得でき、それが 0 の場合、そのピクセルは透明です。

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

于 2012-09-20T09:43:36.380 に答える
1

あなたの is Touch for me の境界ボックスを変更して、さまざまなスプライトの境界ボックスを縮小しようとします...

于 2012-09-19T13:30:42.137 に答える