Прямоугольники столкновения 2 не работают (метод ограничивающей рамки)

Привет, ребята, надеюсь, вы мне поможете. Я пытаюсь закодировать игру, но при столкновении не получается. Я много искал и обнаружил, что метод ограничивающего прямоугольника (для создания невидимого прямоугольника вокруг спрайта) - лучший способ для меня. Но метод пересечения у меня не работает. У меня есть два конфликтующих растровых спрайта, но в LogCat столкновения нет ...

Спрайт №1 Класс

public Sprite(GameView theGameView, Bitmap bmp) {
    this.theGameView = theGameView;
    this.bmp = bmp;
    this.width = bmp.getWidth();
    this.height = bmp.getHeight();
    ySpeed = 0;
    xSpeed = 1;
}


 public Rect bounds() {         
        return (new Rect(x,y,width,height));
    }


public void onDraw(Canvas canvas) {
    canvas.drawBitmap(bmp, x, y, null);
}

Спрайт №2 Класс

public FourthSprite(GameView theGameView, Bitmap bmp) {
    this.theGameView = theGameView;
    this.bmp = bmp;
    this.width = bmp.getWidth();
    this.height = bmp.getHeight();
    ySpeed =  0;
    xSpeed = -1;
}


public Rect bounds() {
    // TODO Auto-generated method stub
    return (new Rect(x,y,width,height));
}

public void onDraw(Canvas canvas) {
         canvas.drawBitmap(bmp, x, y, null);
}

}

Класс GameView

public void collision () {

   Rect r1 = theSprite.bounds();  // Sprite on left side
       Rect r4 = theSprite4.bounds(); // Sprite on right side

  if (r1.intersect(r4)){

       collision = true;
       Log.v("Log Tag", "COLLISION :D :D :D :D :D :D :D");
   }

  else       {
       collision = false;
       Log.v("Log Tag", "NO COLLISION");
  }
    }

Если это поможет, я также могу загрузить видео.

Изменить: http://youtu.be/wYxZ7nKsmdw Я понял, что коллизия работает, когда один спрайт не работает move arround и координаты x, y равны 0. В чем может быть проблема?


person user1394704    schedule 08.12.2012    source источник
comment
если вы начертите прямоугольники r1 и r4, будут ли они действительно пересекаться?   -  person mitim    schedule 08.12.2012
comment
Да, я загрузил видео для лучшего понимания: youtu.be/wYxZ7nKsmdw   -  person user1394704    schedule 08.12.2012


Ответы (2)


Судя по видео и данным, которые вы выводите в LogCat, что-то не так с функцией перемещения (которая не была указана в вашем вопросе).

Координаты left прямоугольников меняются, а координаты right - нет. Через некоторое время left координата одного прямоугольника становится больше, чем right координата, в результате чего функция intersects возвращает false.

Кстати, вы должны подумать о структурировании своего кода по-другому, попытаться использовать наследование вместо множества очень похожих классов.

person LukaCiko    schedule 08.12.2012
comment
нет значений, которые идут после - это ширина и высота растрового изображения - person user1394704; 08.12.2012
comment
Проверьте документацию. Метод flattenToString возвращает левый верхний правый нижний. Также ваш вызов конструктора Rect неверен - параметры равны (int left, int top, int right, int bottom), и проверка диапазона не выполняется. - person LukaCiko; 08.12.2012
comment
Бро, он работает с моим кодом, когда один спрайт находится в координатах (0,0). В чем может быть проблема - person user1394704; 09.12.2012
comment
Измените конструкторы на новый Rect (x, y, x + width, y + height) или новый Rect (x-width / 2, y-height, x + width / 2, y + height / 2), в зависимости от того, является ли x и y представляют угол или центр квадрата. - person LukaCiko; 09.12.2012
comment
АД ДА: ДД, ЧЕЛОВЕК, ЭТО РАБОТАЕТ С 1 недели Я НЕ МОГ НАЙТИ ЭТО ДЕРЬМО. Братан, если тебе понадобится помощь, напиши мне :))) - person user1394704; 09.12.2012
comment
Конечно, рад помочь. Отметьте вопрос как принятый, чтобы он был отображен как ответ. - person LukaCiko; 12.12.2012

Я не уверен, какую библиотеку вы используете для получения Rect (в стандартной библиотеке есть Rectangle, но нет Rect).

Я предлагаю сначала выполнить некоторую проверку ошибок, распечатав границы прямоугольников, когда должно произойти столкновение, и посмотреть, действительно ли они пересекаются. Если это сработает, возможно, создание вашей собственной функции пересечения - это выход, если тот, который вы используете, не работает. Это очень просто, быстрый Google дал мне это на c / javascript, но это легко переделать на Java.

Быстрое пересечение прямоугольника с прямоугольником

person dakotapearl    schedule 08.12.2012
comment
Бро, он работает с моим кодом, когда один спрайт находится в координатах (0,0). В чем может быть проблема - person user1394704; 09.12.2012