@ITeration_Test

Как работает «И», «ИЛИ» --> с учётом коллизии объекта и расстоянии объектов друг от друга?

При инициализации коллизии объектов, учитываются моменты через операцию И(&&) --> края начала(x,y) и конца(width,height), для того чтобы их ввести в рамки ограничений: что от кудо и до кудо.
BOOL IsCollision(OBJECT* FIRST, OBJECT* LAST)
{
	return (
		( (FIRST->x + FIRST->width) > LAST->x ) &&
		( FIRST->x < (LAST->x + LAST->width) )
		&& ( (FIRST->y + FIRST->height) > LAST->y )
		&& ( FIRST->y < (LAST->y + LAST->height) )
		);
}

spoiler

1) @@.....................2)..................@@
....@@...........................................@@
.......########................########
.......########................########
.......########................########


======================
...Без учёта на ширину и высоту(относительно центра объекта).
Почему-то, для коллизии от объекта до мышки, приходится применять ИЛИ( || ).
if ((mouseX < playerX - 200) || (mouseX > playerX + 200) || (mouseY > playerY + 200) || (mouseY < playerY - 200))
{
    // Code....
}

spoiler

.............................\\....................................................
.........\\........................00...........................\\ -- курсор
....................................00.............................................
..........................................\\......................................


Почему в этой логике, второй пример так отличается от первого...?
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AnimeSlave
Первый код проверяет наличие части одного объекта внутри другого. Для этого нужно, чтобы все условия были истинны.

Второй код проверяет обратное, что объект мыши находится за рамками объекта игрока. И тут достаточно того, что выполняется одно из четырёх условий
Ответ написан
Комментировать
@MasterGod
В первом примере, где проверяется коллизия объектов, используется операция И(&&). Здесь мы проверяем, что все условия для коллизии выполняются одновременно. Если хотя бы одно из условий не выполняется, то коллизии нет.

Во 2м примере, где проверяется коллизия между объектом и мышкой, используется операция ИЛИ(||). Здесь мы проверяем, что хотя бы одно из условий выполняется. Если хотя бы одно из условий выполняется, то есть коллизия.

Разница в логике объясняется разными требованиями для этих двух случаев. В 1, чтобы говорить отколлизии между объектами необходимо чтобы все условия были выполнены, а во втором случаи только одно.

Операторы "И" (&&) и "ИЛИ" (||) являются логическими операторами, которые позволяют комбинировать условия в программировании когда используешь эти операторы для проверки коллизий объектов и расстояния между ними, они позволяют создать сложные условия для определения, происходит ли коллизия или нет.

Для проверки коллизии объектов с учетом их координат и размеров, ты модешь использовать операторы "И" (&&) для комбинирования условий проверки границ объектов. Например, в в твоём коде функции IsCollision():

BOOL IsCollision(OBJECT* FIRST, OBJECT* LAST)
{
  return (
    ( (FIRST->x + FIRST->width) > LAST->x ) &&
    ( FIRST->x < (LAST->x + LAST->width) ) &&
    ( (FIRST->y + FIRST->height) > LAST->y ) &&
    ( FIRST->y < (LAST->y + LAST->height) )
  );
}


Тут условия проверяют, пересекаются ли границы объектов FIRST и LAST по осям X и Y. Если все условия выполняются, функция возвращает true и это означает, что произошла коллизия.

Что касается второго примера кода, где проверяешь коллизию между мышью и игроком с использованием оператора "ИЛИ" (||), это означает, что коллизия будет считаться истинной, если хотя бы одно из условий выполняется. В твоём случае, если мышь находится вне прямоугольной области, определенной координатами игрока и дополнительным расстоянием 200, то условие будет считаться истинным и будет выполняться код внутри блока if.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы