В Cocos2D, как я могу проверить наличие столкновений с произвольной пользовательской формой?

Я хочу обнаружить столкновение между спрайтом и созданной пользователем формой.

Например. На экране есть 3 объекта. Пользователь берет палец и рисует ненормальную форму вокруг 2 предметов. Мне нужно обнаружить эти 2 объекта.

пользовательская форма в фиолетовом, игровые объекты зеленым и красным цветом>> </p>

<p> Как я могу эффективно использовать Cocos2D? </p></body></html>

10 голосов | спросил David McGraw 15 J000000Thursday10 2010, 01:20:54

4 ответа


10

В этом конкретном примере есть очень простое решение.

Я предполагаю, что ваша произвольная форма - это всего лишь несколько точек.

Нарисуйте луч от каждого из ваших объектов в любом направлении. Если количество раз, когда оно пересекает сегмент линии на вашей фигуре, равно (включая ноль), вы находитесь за пределами формы.

Если количество раз, когда вы пересекаетесь, является нечетным, вы находитесь внутри объекта.

Столкновение с лучом /сегментом линии - довольно простой алгоритм для поиска /реализации.

ответил Tetrad 15 J000000Thursday10 2010, 01:39:28
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;
}

Сообщите мне, если это будет полезно.

ответил Tone 17 J000000Saturday10 2010, 16:03:06
2

В книге «Обнаружение столкновений в реальном времени» есть раздел о обнаружении столкновения между линиями и сегментами. Пример через Google Книги: http://ow.ly/2gjQf

ответил AlfredBaudisch 26 J000000Monday10 2010, 01:09:04
0

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

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

Отредактировано для добавления: Отвратительный ответ, неверный вопрос. Учебники по-прежнему довольно приличные, хотя, если вы хотите читать на хрустале на пиксель.

ответил Kaj 19 AM000000100000003531 2010, 10:56:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132