Як в Cocos2D перевірити наявність зіткнень з довільною формою, намальованою користувачем?


10

Я хочу виявити зіткнення між спрайтом і певною створеною користувачем формою.

Наприклад. На екрані є 3 об’єкти. Користувач бере пальцем і малює ненормальну форму навколо 2-х об'єктів. Мені потрібно виявити ці 2 об’єкти.

форма користувача у фіолетовому, ігрові об'єкти в зеленому та червоному кольорах

Як я підходжу до цього ефективно, використовуючи Cocos2D?

Відповіді:


10

Для цього конкретного прикладу є дуже просте рішення.

Я припускаю, що ваша довільна форма - це лише ряд точок.

Намалюйте промінь від кожного з ваших об'єктів у будь-якому напрямку. Якщо кількість разів перетинає відрізок лінії на вашій формі рівним (включаючи нуль), ви знаходитесь поза формою.

Якщо кількість разів, коли ви перетинаєтесь, непарне, ви знаходитесь всередині об'єкта.

Зіткнення променевих / лінійних сегментів - це досить простий алгоритм пошуку / реалізації.


3

Звичайно, мені довелося це зрозуміти для моєї гри Star Catch. Можливо, є кращі способи зробити це, але ось як я це зробив. Я фактично знайшов алгоритм в Інтернеті (вибачте, що не можу згадати джерело). Я здійснив пошук для виявлення точки у полігоні.

Я створив NSMutableArray, щоб утримати свою точку зору. Я додаю бали у своїх дотиках.

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

Повідомте мене, якщо це корисно.


2

У книзі "Виявлення зіткнень у режимі реального часу" є розділ про виявлення зіткнень лінії / сегмента. Приклад через Google Books: http://ow.ly/2gjQf


0

Для піксельної перевірки зіткнення є приємна серія підручників на сайті розробників XNA.
http://creators.xna.com/en-US/tutorial/collision2dperpixeltransformed

Однією оптимізацією, яку ви не можете використовувати в цих навчальних посібниках (як не дивно), є те, що в більшості випадків потрібно перевіряти лише контур, зберігаючи дорогоцінні цикли .

Відредаговано, щоб додати: Lousy відповідь, неправильно прочитати питання. Підручники все ще досить пристойні, хоча, якщо ви хочете прочитати на піксельній холодній.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.