2014-01-03 3 views
0

У меня есть несколько layers, который содержит CCSprites. У меня есть основной CCScene, который добавляет эти слои в начале. Мне нужно проверить столкновение между спрайтами из разных слоев.Обнаружение столкновений между слоями

Я знаю, как проверить простое столкновение с CGRectContains, моя проблема в том, что мне нужен какой-то класс, который содержит все позиции спрайтов со всех слоев и проверяет каждый tick на предмет столкновения.

Вопрос: что такое правильный способ создания такого класса, который сохраняет/проверяет спрайты со всех слоев на сцене?

Спасибо.

+0

Просто проверяю ... Вы хотите знать, как сделать это без использования физический движок, такой как Chipmunk или Box2d? – godel9

+0

да. прямо сейчас я не использую box2d, так что оказалось, что готового решения нет. – Curnelious

ответ

0

Если вы не заботитесь о пустом пространстве, то вы можете просто установить self.contentSize для каждого слоя. Вы можете сделать это следующим образом:

CGRect rect = CGRectNull; 
for (CCNode *node in self.children) { 
    rect = CGRectUnion(rect, node.boundingBox); 
} 
self.contentSize = rect.size; 

Но если вы заботитесь о пустом пространстве, то вам нужно использовать что-то вроде этого:

// put it somewhere outside class implementation 
static inline BOOL CCLayerIntersectsCCLayer(CCLayer l1, CCLayer l2) { 
    for (CCNode *n1 in l1.children) { 
     for (CCNode *n2 in l2.children) { 
      CGRect r1 = n1.boundingBox; 
      CGRect r2 = n2.boundingBox; 
      r1.origin = [l1.parent convertToNodeSpace:r1.origin]; 
      r2.origin = [l2.parent convertToNodeSpace:r2.origin]; 
      if (CGRectIntersectsCGRect(r1, r2)) { 
       return YES; 
      } 
     } 
    } 
    return NO; 
} 

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

Смежные вопросы