Как обнаружить столкновение спрайтов, находящихся в CCArray, в игре cocos2d-x (c ++) ios

0

Я новичок в разработке игр cocos2dx ios. У меня есть 12 спрайтов в CCArray, и они случайным образом падают сверху вниз. Любой спрайт может появиться в любое время. Я сделал расслоение, что спрайт в индексе массива 0 будет приходить на уровне 12, а индекс 1 - на уровне 11 и т.д. Таким образом, спрайты, которые появляются сначала, впереди второго следующего спрайта. Но дело в том, что эта ситуация не всегда верна. Спринсы могут сначала иметь индекс 5, а затем индекс 4 и т.д. Итак, как обнаружить столкновение спрайтов, присутствующих в том же массиве, что, если они касаются друг друга ограничивающим полем, я могу заставить их замедлить секунду или что-то еще, чтобы они не перекрывались друг с другом. Я не использую Box2d и не хотят его использовать. Я просто хочу ответить без использования box2d и только в cocos2dx с помощью c++. Любой, кто может мне помочь Спасибо

  • 0
    Это в значительной степени зависит от формы ваших спрайтов (круглых, прямоугольных или других), а также от того, как вы хотите обрабатывать столкновения. Не могли бы вы предоставить больше информации?
  • 0
    они прямоугольные и одинаковой формы
Показать ещё 4 комментария
Теги:
iphone
cocos2d-x

2 ответа

0
Лучший ответ

CCArray mbox;

Напишите этот код в обновлении

for(int i = 0; i<mbox_count();i++)
  for(int j = i+1; j<mbox_count();j++)
   {
     CCSprite* sp = static_cast<CCSprite*>mbox->objectatindex(j);
     CCSprite* sp1 = static_cast<CCSprite*>mbox->objectatindex(i);
     if(sp1->boundingBox().intersectsRect(sp->boundingBox()))
    {
    //whatever you want to do;
    }
   }
  • 0
    но здесь есть проблема .. если я помещаю этот код в функцию и вызываю его через каждую секунду .. он вызывается в начале i * j раз, потому что во время создания спрайтов и добавления спрайтов в массив они все находятся в одинаковом положении
0

@Rajan Я бы рекомендовал использовать CC_FOREACH при поиске через CCArray, потому что у меня были проблемы с утечкой памяти, используя ответ Singhaks выше. Вместо этого вы можете написать свой код следующим образом:

// we need two objects to look at each element in our array
CCObject*   obj_x = NULL;
CCObject*   obj_y = NULL;

CCARRAY_FOREACH(_arr_x, obj_x) {
    CCArray* _obj_x_arr = (static_cast<CCArray*>(obj_x));

    CCARRAY_FOREACH(_obj_x_arr, obj_y) {
        Sprite* _spriteImage_y  = (static_cast<Sprite*>(obj_y));
        Rect rect_a         = IntersectionPoint_A -> getBoundingBox();
        Rect rect_b               = _spriteImage_y  -> getBoundingBox();

        if (rect_b.intersectsRect(rect_a)) {                
            // do whatever you like in here   
        }
    }

}

Я написал более подробно здесь, если вам это нужно: https://kagato0110.wordpress.com/2015/07/24/how-to-traverse-through-a-2d-ccarray-cocos2dx-c-on-android/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню