Спрайты и обнаружение столкновений cocos2d android

У меня просто короткий вопрос! Я делаю приложение, в котором на экране рисуются случайные спрайты, и я хочу, чтобы эти спрайты не перекрывались с другими (эти спрайты представляют собой одно и то же изображение, но только случайные позиции).

Спасибо за любую помощь.


person user1997570    schedule 21.01.2013    source источник


Ответы (2)


Чтобы проверить, пересекается ли спрайт с другим, вы можете использовать

CCSprite *sprite1, *sprite2;
if (CGRectIntersectRect(sprite1.boundingBox, sprite2.boundingBox)) {
  // sprites are overlapping
}

Это не учитывает вращение, так как вычисления станут намного сложнее.

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

CCNode *parent;
for (int i = 0; i < AMOUNT; ++i) {
  CCSprite *sprite = [CCSprite spriteWith..];
  bool isOk = false;
  while (!isOk) {
    sprite.position = ccp(...);
    isOk = true;
    for (CCSprite *sprite2 in parent) {
      if (CGRectIntersectRect(sprite.boundingBox, sprite2.boundingBox)) {
        isOk = false;
        break;
      }
    }
  }
person Jack    schedule 21.01.2013
comment
у меня есть только 1 спрайт, и когда я касаюсь экрана, эти спрайты появляются снова, но с другим положением (например, на экране будет 2 улыбающихся солнца), поэтому я хочу сравнить только 1 спрайт, потому что только 1 спрайт создан, но добавлен как ребенка снова и снова с разных позиций. - person user1997570; 22.01.2013
comment
Тогда это еще проще, так как вам не нужен внешний цикл. - person Jack; 22.01.2013

Вы можете использовать ArrayList, чтобы сохранить предыдущее местоположение спрайта (солнца) и применить проверку при добавлении нового солнца.

ArrayList<CGRect> sunArrayList=new ArrayList<CGRect>();

теперь применяйте проверку при создании нового спрайта (солнца) на экране

boolean exist;// variable to check position already exist
do{
    exist=false; //set at every loop starting new no generated not exist we have to check this below. if exist change it to true
    //generate no
    int xRandom=3;//apply your logic for random location x
    int yRandom=5;//apply your logic for random location y

for(int i=0;i<sunArrayList.size();i++)
{
    if(sunArrayList.get(i).contains(xRandom,yRandom))
    {
        exist=true;
    }
}

    if(exist==false)// means your generated location not exist
    {
        // add sun to screen with position xRandom,yRandom
        //write code here to add sprite on screen (xRandom,yRandom)

        ///
        CGSize sunSize=CGSize.make(width, height);
        //CGSizeSunSize=sprite(sun) slicing size 

CGPoint sunPos=new CGPoint();
        sunPos.set(xRandom, yRandom);
CGRect randomLocationGeneratedSun=new CGRect(sunPos,sunSize);
sunArrayList.add(randomLocationGeneratedSun);
    }

}while(exist) 
person Karan Rana    schedule 25.01.2013