В 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 Книги: http://ow.ly/2gjQf

AlfredBaudisch
источник
0

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

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

Отредактировано, чтобы добавить: паршивый ответ, неправильно прочитал вопрос. Учебники все еще довольно приличны, хотя, если вы хотите читать на пиксель coldet.

Кая
источник