Страницы

Поиск по вопросам

четверг, 19 марта 2020 г.

Определение столкновений в Android

#разработка_игр #android #java


Столкнулся с проблемой, не могу отловить столкновение двух прямоугольников. Пытался
сделать это при помощи intersects(), но оно требует два прямоугольника внутри метода,
а мне нужно отловить только столкновение с одним прямоугольником. Вот что я пишу:
  Iterator i = enemy.iterator();
          while(i.hasNext()) {
              Enemy e = i.next();
              if(((Ball) ball).getRect().intersects((e.getRect())))
              {
                  i.remove();
              }
          }

Чего оно хочет не знаю, должно работать, в уроках на ютубе видел что там применяется
один объект и все было нормально... В чем трабла?
UPDATE:
Значит так. Enemy и Ball - это два класса; балл - это пуля, которая должна убивать
врага, соответственно, энеми - это враг, которого должен убивать бал. Мне нужно отловить
столкновение этих двух объектов, отлавливать пытаюсь при помощи intersects, который
требует иметь два прямоугольника, хотя в видеоуроке, который я смотрел, повествователь
туториала используется всего лишь один объект класса, второй используется для вызова
интерсекта, как в моем примере кода. Вот и вопрос, чем отличается его интерсект от моего?
Вот его урок Пишем 2D игру на java - Часть 7.
Ошибка которую мне выдает когда я начинаю компилировать 

The method intersects(Rect, Rect) in the type Rect is not applicable for the arguments
(Rect)

UPDATE 2:
Нашел я способ который решает мою проблему, возможно кому нибудь пригодится. Я почти
полностью видоизменил код, вот как он выглядит:
private void testCollision() {
        Iterator i = enemy.iterator();
        Iterator b = ball.iterator();

          while(i.hasNext() && b.hasNext()) {
              Enemy enemies = i.next();
              Ball balls = b.next();

              if (Math.abs(balls.x - enemies.x) <= (balls.width + enemies.width) / 2f
                      && Math.abs(balls.y - enemies.y) <= (balls.height + enemies.height)
/ 2f) {
                        i.remove();
                        b.remove();
              }
          }
    }

balls.x - enemies.x - центральная граница нашего объекта.
UPDATE 3:
Снова открываю тему так как у меня возникла проблема, 

"нужно вернуть итератор снова на
первый элемент, потому что он уже
загнан предыдущим проходом на
последний и hasNext() ивозвращает
false."

Это цитата одного человека который пытался мне объяснить как исправить ошибку, но
так и не смог объяснить. Может кто-то сможет мне сказать как это сделать? Код я использую
тот же. 
После прочтения этой цитаты несколько раз - у меня сломался мозг    


Ответы

Ответ 1



@dajver, Сами пишете что ошибка при компиляции : The method intersects(Rect, Rect) in the type Rect is not applicable for the arguments (Rect) Это значит, что метод Rect.intersects() хочет два аргемента (оба типа Rect). Видимо надо написать (если ищем пересечение прямоугольной пули с прямоугольным врагом): if( ((Ball)ball).getRect().intersects(e.getRect(),((Ball)ball).getRect()) ) { i.remove(); break; // это если одна пуля может уложить только одного врага }

Ответ 2



вы бы ошибку выложили, скорее всего у ball нету метода getRect. продолжая читать мысли: сделайте этот метод в Ball, возвращая прямоугольник описанного ball или вписанного. осмелюсь предположить что x, y это центр ball. А Rect это координаты верхней левой и правой нижней точек следовательно должно быть чтото типа: public Rect getRect() { new Rect(x - width/2, y - height / 2, x + width/2, y + height / 2) }

Комментариев нет:

Отправить комментарий