Столкновение спрайтов 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];
Рэй Вендерлих (Ray Wenderlich) написал хорошее руководство по использованию Box2D только для обнаружения столкновений, если вы заинтересованы в том, чтобы идти по этому пути. http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone
Сначала проверьте, что ваши спрайты могут быть аппроксимированы прямоугольниками. Если так, то ответ @Omega был великолепен. Если они не могут быть, возможно, потому что они содержат много прозрачности или по какой-то другой причине, вам, возможно, придется аппроксимировать свои спрайты с помощью polys и работать с ними.