Apa cara yang benar untuk menerapkan deteksi hit dengan sprite non-persegi panjang?

8

Apa cara yang benar untuk menerapkan deteksi hit atau touch untuk sprite non-persegi panjang di Cocos2d?

Saya sedang mengerjakan puzzle jigsaw, jadi sprite kami memiliki beberapa bentuk aneh (jigsaw puzzle bricks). Sampai sekarang, kami telah menerapkan "deteksi" dengan cara ini:

- (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;
}

Saya tahu masalahnya ada di kata kunci " sprite.boundingBox". Apakah ada cara yang lebih baik untuk mengimplementasikan ini, atau apakah itu batasan ketika menggunakan sprite berdasarkan .png's? Jika demikian, bagaimana saya harus melanjutkan?

hogni89
sumber

Jawaban:

5

Saya sebenarnya menemukan solusi sederhana!

Mengubah objek karakter untuk tidak hanya menyertakan info dan sprite, tetapi juga CGPath. Kemudian diimplementasikan suatu metode, untuk mengulang semua objek karakter, dan memeriksa

CGPathContainsPoint( params ...)

bukan untuk

CGRectContainsPoint( params ...)

Tutorial yang saya gunakan: http://www.youtube.com/watch?v=HxHZwzaadNQ - "Keajaiban CGPath"

hogni89
sumber
3

Saya tidak terbiasa dengan tujuan C, jadi saya tidak bisa memberikan kode tertentu. Tetapi cara umum untuk mencapai hal-hal seperti ini adalah dengan melakukan pemeriksaan tabrakan per pixel. Pada dasarnya ini berfungsi seperti bagaimana Anda memilikinya berdasarkan pada persegi panjang, tetapi sebelum menembakkan acara sentuh, Anda harus mengulang semua piksel yang disentuh dan memastikan setidaknya satu dari mereka tidak transparan. Itu akan membantu Anda lebih dekat dengan jawabannya, semoga orang lain dapat memberi Anda beberapa contoh kode aktual pada subjek.

Kevin DiTraglia
sumber