Cocos2D'de, keyfi olarak çizilmiş bir şekle karşı çarpışma olup olmadığını nasıl kontrol ederim?


10

Bir sprite ve bir tür kullanıcı tarafından oluşturulan şekil arasındaki bir çarpışmayı tespit etmek istiyorum.

Örneğin. Ekranda 3 nesne var. Kullanıcı parmağını alır ve nesnelerin 2'sine anormal bir şekil çizer. Bu 2 nesneyi tespit etmem gerekiyor.

kullanıcı şekli mor, yeşil ve kırmızı oyun nesneleri

Cocos2D kullanarak buna nasıl verimli bir şekilde yaklaşabilirim?

Yanıtlar:


10

Bu örnek için çok kolay bir çözüm var.

Rastgele şeklinizin sadece bir dizi nokta olduğunu varsayıyorum.

Her nesnenizden herhangi bir yönde bir ışın çizin. Şeklinizdeki bir çizgi segmentiyle kesişme sayısı eşitse (sıfır dahil), şeklin dışındasınız demektir.

Kesişme sayısı tekse, nesnenin içindesiniz.

Işın / çizgi segmenti çarpışması bulmak / uygulamak oldukça kolay bir algoritmadır.


3

Tabii, bunu Star Catch oyunum için bulmalıydım. Bunu yapmanın daha iyi yolları olabilir ama ben böyle yaptım. Aslında algoritmayı çevrimiçi buldum (üzgünüm kaynağı hatırlayamıyorum) Bir çokgenin içindeki bir noktayı tespit etmek için bir arama yaptım.

Demek istediğim bir NSMutableArray oluşturdum. Puanları toucheventlerime ekliyorum.

- (BOOL) testNodeInLoop:(CCNode *)node {

    CGPoint prev;

    // This is more accurate point for the node
    CGPoint absPoint = [node convertToWorldSpace:CGPointZero];

    float x = absPoint.x;
    float y = absPoint.y;

    BOOL isIn = NO;

    CGPoint cp;

    for(int i = 0, j = [points count] - 1; i < [points count]; j = i++) {
        [[points objectAtIndex:i] getValue:&cp];
        [[points objectAtIndex:j] getValue:&prev];

        if( ((cp.y > y) != (prev.y > y)) && (x < (prev.x -cp.x) * (y - cp.y) / (prev.y - cp.y) + cp.x)) {
            isIn = !isIn;
        }
    }
    return isIn;
}

Bunun yararlı olup olmadığını bana bildirin.


2

"Gerçek zamanlı çarpışma tespiti" kitabında çizgi / segment çarpışma tespiti ile ilgili bir bölüm vardır. Google Kitaplar üzerinden örnek: http://ow.ly/2gjQf


0

Piksel çarpışma kontrolleri için XNA geliştirici sitesinde hoş bir eğitim serisi var.
http://creators.xna.com/tr-TR/tutorial/collision2dperpixeltransformed

Bu eğitimlerde kullanılmayan bir optimizasyon (yeterince garip), çoğu durumda yalnızca anahatların kontrol edilmesi ve değerli döngülerden tasarruf edilmesi gerektiğidir .

Eklemek için düzenlendi: Berbat cevap, soruyu yanlış okudum. Piksel Coldet başına okumak istiyorsanız, öğreticiler yine de oldukça iyi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.