Столкновение спрайтов cocos2d

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

Все спрайты перемещаются одновременно в случайные точки на экране.

То, что я хочу сделать, это обнаружить столкновение между спрайтами и затем изменить их путь движения.

Является ли это возможным?

3 ответа

Решение

Итерация через каждый CCSprite в вашем массиве (назовите это A), и для каждой итерации повторять каждый раз CCSprite в массиве (исключая A само по себе, конечно) (назовите это B). Теперь используйте CGRectIntersectsRect вместе с boundingBox чтобы найти столкновение между ними. Это выглядит примерно так:

        for (CCSprite *first in mySprites) {
            for (CCSprite *second in mySprites) {
                if (first != second) {
                    if (CGRectIntersectsRect([first boundingBox], [second boundingBox])) {
                        // COLLISION! Do something here.
                    }
                }
            }
        }

Изменить: Но, конечно, возможно, что если два спрайта сталкиваются, "событие столкновения" будет происходить дважды (сначала с точки зрения спрайта A, а затем с точки зрения спрайта B).

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

Есть бесчисленное множество способов проверить это, но вот пример (обновленный код):

Отредактировано снова:

NSMutableArray *pairs = [[NSMutableArray alloc]init];
    bool collision;
    for (CCSprite *first in mySprites) {
        for (CCSprite *second in mySprites) {
            if (first != second) {
                if (CGRectIntersectsRect([first boundingBox], [second boundingBox])) {
                    collision = NO;
                    // A collision has been found.
                    if ([pairs count] == 0) {
                        collision = YES;
                    }else{
                        for (NSArray *pair in pairs) {
                            if ([pair containsObject:first] && [pair containsObject:second]) {
                                // There is already a pair with those two objects! Ignore collision...
                            }else{
                                // There are no pairs with those two objects! Add to pairs...
                                [pairs addObject:[NSArray arrayWithObjects:first,second,nil]];
                                collision = YES;
                            }
                        }
                    }
                    if (collision) {
                        // PUT HERE YOUR COLLISION CODE.
                    }
                }
            }
        }
    }
    [pairs release];

Посмотрите на это так ответы.

Вы можете сделать простое обнаружение столкновений, используя CGRectIntersectsRect и узел boundingBox, Если вам нужны более продвинутые функции, взгляните на физический движок, такой как chipmunk или Box2D.

Рэй Вендерлих (Ray Wenderlich) написал хорошее руководство по использованию Box2D только для обнаружения столкновений, если вы заинтересованы в том, чтобы идти по этому пути. http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

Сначала проверьте, что ваши спрайты могут быть аппроксимированы прямоугольниками. Если так, то ответ @Omega был великолепен. Если они не могут быть, возможно, потому что они содержат много прозрачности или по какой-то другой причине, вам, возможно, придется аппроксимировать свои спрайты с помощью polys и работать с ними.

Другие вопросы по тегам