Как правильно реализовать обнаружение попадания с непрямоугольными спрайтами?

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? Если так, как я должен продолжить?

hogni89
источник

Ответы:

5

Я на самом деле нашел простое решение!

Изменены объекты персонажей, чтобы они включали не только информацию и спрайт, но и CGPath. Затем реализовал метод, чтобы зациклить все символьные объекты и проверить

CGPathContainsPoint( params ...)

вместо

CGRectContainsPoint( params ...)

Учебник, который я использовал: http://www.youtube.com/watch?v=HxHZwzaadNQ - "Магия CGPath"

hogni89
источник
3

Я не знаком с целью C, поэтому не могу дать какой-либо конкретный код. Но общий способ выполнения подобных вещей - проверка столкновения на пиксель. По сути, это работает так же, как у вас на основе прямоугольника, но перед тем, как запустить событие касания, вы должны пройти через все пиксели, к которым прикоснулись, и убедиться, что хотя бы один из них не был прозрачным. Это должно помочь вам приблизиться к ответу, надеюсь, кто-то еще может дать вам несколько примеров кода по этой теме.

Кевин ДиТраглия
источник