Помогите пжл разобраться как работает метод.
public boolean isCollision(GameObject object) {
int transparent = Color.NONE.ordinal(); // переменная для проверки прозрачности поля
for (int matrixX = 0; matrixX < width; matrixX++) {
for (int matrixY = 0; matrixY < height; matrixY++) { // счетчик для проверки всей матрицы ракеты
int objectX = matrixX + (int) x - (int) object.x; // тут затык. Ракеты то мы полностью прокручиваем, но объект с которым сравниваем мы почему то берем только одну координату (угловую?). Но ведь ландшафта она может коснуться в любом месте. Не понимаю как это работает. Хотя в целом идея с вычитанием значения координат вроде понятна.
int objectY = matrixY + (int) y - (int) object.y; //аналогично
if (objectX < 0 || objectX >= object.width || objectY < 0 || objectY >= object.height) { // Ландшафт и платформа изначально находятся ниже ракеты, поэтому изначально objectX и objectY должен быть меньше нуля. А вот смысл проверки objectX >= object.width ускользает.
continue;
}
if (matrix[matrixY][matrixX] != transparent && object.matrix[objectY][objectX] != transparent) { // тут не уверен. Если матрица ракеты и матрица объекта пересеклись в непрозрачной части? то возвращаем true? Но где мы успели вобще успели проверить пересечение матриц? Короче запутался.
return true;
}
}
}
return false;
}
Олег
35 уровень
isCollision
Обсуждается
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #3030178Expert
28 марта 2022, 12:13полезный
Берется не одна угловая координата объекта, здесь вычисляется смещение, чтобы получить координаты матриц ракеты и объекта, которые будут равны точке на экране. Для каждой точки ракеты получаем точку объекта, которая находится под ракетой.
Это условие и есть проверка пересечения ракеты и объекта. Мы получили сопоставление координат ракеты и объекта. matrix[matrixY][matrixX] это точка ракеты, object.matrix[objectY][objectX] это точка объекта, при отображении это одна и таже видимая точка. И если эта точка у ракеты и объекта не равны нулю, значит они пересеклись.
"А вот смысл проверки objectX >= object.width ускользает" - если ракету переместить вправо, получить координату больше width.
+1
Олег
29 марта 2022, 19:51
Пока что все равно не понял. Завтра перечитать попробую. Если есть время, напишите еще раз, но на этот раз как для пятилетнего)
0
Anonymous #3030178Expert
30 марта 2022, 04:56полезный
Отображаемый вид ракета и ландшафт задается матрицами, у точек, которые не отображаются на экране, в матрице значение 0. Когда ракета перемещается по экрану, матрица ракеты "накладывается" на матрицу ландшафта. Остается проверить чтобы ячейки матрицы ракеты, в которых не ноль, не "накладывались" на ячейки ландшафта, в которых тоже не ноль, т.е. чтобы видимая часть матриц не пересеклась. Поэтому используются цикл только по матрице ракеты, для каждой точки ракеты вычисляется точка ландшафта, на которую накладывается ракета.
+1
Олег
30 марта 2022, 06:37
Про цикл только по матрице ракеты стало понятно и про то как именно проверяем пересечение. Осталось непонятно почему мы вот так задаем координаты ландшафта object.matrix[objectY][objectX] ? У нас же вроде objectX это разница между координатой ракеты и угловой координатой ландшафта. А как эта разница может служить координатой ландшафта? Я думал она только для проверки пересечения матриц сгодиться.
0
Anonymous #3030178Expert
30 марта 2022, 16:59полезный
Рассмотрим на примере y, будет нагляднее, потому что x для ландшафта равен 0.
int objectY = matrixY + (int) y - (int) object.y;
Матрица ландшафта выводится на экран смешенная "вниз" по координате y на 25, это object.y. Нулевая точка матрицы ландшафта [0][0] на экране отображается в точке [25][0].
Ракета начинает движение с координаты y = 0, и "опускается вниз", y возрастает.
Рассмотрим выражение objectY = matrixY + y - object.y без matrixY. Рассмотрим левый верхний угол матриц.
На старте ракеты выражение y - object.y = 0 - 25 = -25. Угол ракеты за пределами ландшафта. Когда ракета отпустится до координаты y = 25, y - object.y = 25 - 25 = 0. Угол ракеты(и вся ракета) пересек матрицу ландшафта.
y - object.y в этом выражении вычисляется смещение матрицы ландшафта и ракеты. Если отображать ландшафт без смешения, начиная с точки [0][0], тогда бы координаты ракеты [y][x] соответствовали бы индексу матрицы.
matrixY - используется для обхода по матрице, чтобы проверить всю матрицу.
+1
hidden #598481
28 марта 2022, 09:03
Я не решал этой задачи и поэтому не знаю, что за координаты в полях x и y, код полностью ты не прикрепил, поэтому мне не совсем понятно, что такое "матрица ракеты", например.
Но суть работы метода я понимаю в том, что ты сначала вычисляешь относительное положение ракеты относительно объекта, а потом сравниваешь полученные относительные координаты с размерами объекта.
Получается, что objeсtX и objectY - это сдвиг ракеты относительно угла объекта.
И те случаи, когда сдвиг отрицательный (до меньшей границы объекта) или сдвиг очень большой (за пределами большей границы объекта) ты пропускаешь, выполняя continue. А остаются только те случаи, когда сдвиг от нуля до большей границы объекта, т.е. с учетом сдвига ты попадаешь в площадь объекта.
После этого остаётся только проверить состояние (цвет) этого поля и засчитать попадание.
0