столкновение спрайтов cocos2d - PullRequest
2 голосов
/ 02 декабря 2011

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

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

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

Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 02 декабря 2011

Выполните итерацию через каждый CCSprite в вашем массиве (назовите его A), и для каждой итерации повторите итерацию через каждый CCSprite в массиве (исключая A* 1008) * само собой разумеется) (назовите это 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];
1 голос
/ 02 декабря 2011

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

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

0 голосов
/ 04 декабря 2011

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

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

...