長方形でないスプライトでヒット検出を実装する正しい方法は何ですか?


8

Cocos2dで長方形以外のスプライトのヒットまたはタッチ検出を実装する正しい方法は何ですか?

私はジグソーパズルに取り組んでいるので、スプライトには奇妙な形(ジグソーパズルのレンガ)があります。現在のところ、「検出」は次のように実装されています。

- (void)selectSpriteForTouch:(CGPoint)touchLocation {  
    CCSprite * newSprite = nil;

    // Loop array of sprites
    for (CCSprite *sprite in movableSprites) {

        // Check if sprite is hit.
        // TODO: Swap if with something better.
        if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {
            newSprite = sprite;
            break;
        }
    }
    if (newSprite != selSprite) {
        // Move along, nothing to see here
        // Not the problem
    }
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
    [self selectSpriteForTouch:touchLocation];
    return TRUE;
}

問題はキーワード「sprite.boundingBox」にあることがわかります。これを実装するより良い方法はありますか、それとも.pngに基づくスプライトを使用する場合の制限ですか?もしそうなら、どうすればいいですか?

回答:


5

私は実際に簡単な解決策を見つけました!

キャラクターオブジェクトを変更して、情報とスプライトだけでなく、CGPathも含めるようにしました。次に、メソッドを実装して、すべてのキャラクターオブジェクトをループし、

CGPathContainsPoint( params ...)

代わりに

CGRectContainsPoint( params ...)

使用したチュートリアル:http : //www.youtube.com/watch? v=HxHZwzaadNQ-"CGPathの魔法"


3

私は目的Cに慣れていないので、特定のコードを与えることはできません。しかし、このようなことを行う一般的な方法は、ピクセルごとの衝突チェックを行うことです。基本的には、長方形に基づく方法と同じように機能しますが、タッチイベントを発生させる前に、タッチされたすべてのピクセルをループして、少なくとも1つのピクセルが透明でないことを確認する必要があります。それはあなたが答えに近づくのに役立つはずです、うまくいけば他の誰かがあなたに主題に関する実際のコードサンプルをいくつか与えることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.