Хм, я еще раз взглянул на ваш код и, возможно, обнаружил ошибку (отладка должна это подтвердить): ваши условия, похоже, проверяют, находится ли шарик вне блока.
Предполагая, что Ball
и Bloc
являются компонентами качания, координата 0/0 будет означать верхний левый угол и, следовательно, положительный y будет вниз.
Таким образом, края блока могут быть частично определены как
- вверху: block.y
- внизу: block.y + block.height
- left: block.x
- right: block.x + block.width
Теперь давайте визуализируем ваши условия, которые применяются, только если границы шара и блока пересекаются:
- «внизу»: ball.y <= block.y + bloc.height </li>
- "выше": ball.y + ball.height> = block.y
- "влево": ball.x + ball.width <= block.x </li>
- "right": ball.x> = block.x + block.width
Для простоты будем считать, что шар - это просто точка, то есть with и height равны 1Таким образом, мы проигнорируем размер шара и просто используем его положение (которое в любом случае представляет пиксель шара) и упростим ваши уравнения (которые могут быть отклонены на 1 btw):
- «ниже»: шар.y <= block.y + bloc.hвосемь </li>
- "выше": ball.y> = block.y
- "влево": ball.x <= block.x </li>
- "вправо": ball.x> = block.x + block.height
Теперь давайте визуализируем те, у которых есть несколько стрелок, чтобы указать, где они будут истинны:
+----------+ ---
| | | (2)
| Block | V ^
| | | (1)
+----------+ ---
<--| |-->
(3) (4)
Основная проблема сейчас заключается в том, что вы 'повторяю эти условия по порядку.Что произойдет, если мяч попал в блок со стороны?Условие 1, скорее всего, уже будет выполнено, и вы просто измените y-условие.Если он все еще находится внутри блока, то условие 1 или 2 все равно будет выполнено, и вы вернете y-условие обратно.
Однако есть также проблема с условиями 3 и 4:
Из-за проверки пересечения ваше исходное условие 3 может быть верным только в том случае, если мяч находится справа от левого края, что может вообще не быть ударом.Если это немного правее, условие больше не будет верным.
Давайте сделаем пример с шаром шириной 5 и блоком с x-позицией 10. Таким образом, ваше условие ball.x + ball.width <= block.x
будет равно ball.x + 5 <= 10
.Это может быть верно только для ball.x <= 5. Однако для любого ball.x <5 вы получите правильную границу 9 или меньше для шара, что означает, что он не пересекает блок. </p>
Условие 4 аналогично: предположим, что блок имеет ширину 20 и позицию x, равную 10. Таким образом, ball.x >= block.x + block.width
становится ball.x >= 30
(10 + 20).Это означает, что это будет верно только в том случае, если шар имеет х-позицию ровно 30, но это не будет означать пересечение.