Разрушение кирпичей: обнаружение столкновения с нашим снарядом между кирпичами, веслом и краями

В этот момент мы должны воспользоваться моментом, чтобы похлопать себя по спине. У нас есть игра, созданная полностью из кода, снаряд движется, и мы можем управлять ракеткой; мы многого достигли! В этой статье мы будем работать над обнаружением столкновений между снарядом и другими элементами в игре.

Может показаться, что метод обнаружения столкновений должен быть в классе снаряда, но, поскольку он работает с другими элементами в игре, мы должны поместить его в класс игры, чтобы мы могли ссылаться на себя вместо того, чтобы передавать все элементы. .

Давайте начнем этот метод с обнаружения столкновений с ракеткой. К счастью, мы имеем дело с двумерными прямоугольными объектами, поэтому нам просто нужно увидеть, находится ли снаряд ниже верха, выше низа, слева от правой стороны или справа от левой стороны. Если эти условия выполняются, то нам нужно изменить скорость снаряда.

То, как дробилка обрабатывает изменение скорости после столкновения, заключается в том, чтобы определить, с какой стороны весла или кирпича ударяется снаряд, а затем инвертировать скорость на оси в соответствии со стороной, по которой он ударяется, поэтому, если снаряд попадает в слева от лопасти, скорость по оси x будет инвертирована, а по оси y — для вершины и т. д. Скорость также будет увеличиваться в зависимости от того, насколько близко к углам сталкивается снаряд.

Сейчас мы просто сосредоточимся на обнаружении столкновений, инвертируем скорость по соответствующей оси и вызовем метод в нашей функции updateScreen():

И теперь снаряд должен отскочить от весла! Конечно, он просто продолжает улетать с экрана после того, как доберется до кирпичей, но мы ожидали этого, потому что мы не сказали компьютеру что-либо делать, когда мячик туда попадет!

Чтобы немного снизить нагрузку на наш процессор (не то, чтобы это игра с большой нагрузкой на процессор), мы не начнем обнаруживать столкновения, пока снаряд не минует дно контейнера с кирпичами, а затем, поскольку кирпичи стационарные и выровненные по сетке, мы можем использовать некоторые математические вычисления, ширину экрана и высоту контейнера с кирпичами, чтобы выяснить не только, когда был ударен кирпич, но и какой именно кирпич был ударен.

Я зашел так далеко, ожидая, что снаряд отскочит от кирпичей, но снаряд продолжает лететь так же, как и раньше, что дает! Если мы перепишем код, чтобы получить какой-то полезный вывод, мы можем посмотреть в консоли и увидеть, что вызывает ошибку:

Значения координат возвращаются как NaN (не число). Установив точку останова и взглянув на функцию getXCoordinate(), он пытается разобрать «auto» как целое число, чего не может сделать. Это означает, что нам нужно изменить способ получения и установки наших координат x и y (в подобных ситуациях действительно проявляются преимущества объектно-ориентированного программирования: нам нужно изменить только несколько строк кода).

Оглядываясь назад, наш кирпичный класс казался подозрительно простым. Из-за того, что они размещены в виде элементов сетки, когда мы пытаемся получить их положение, мы получаем «авто», потому что их позиционирование устанавливается автоматически. Нам нужно переопределить методы getXCoordinate и getYCoordinate из класса базового элемента на те, которые дадут нам смещение кирпичей:

И до сих пор не работает, какая досада! Если мы установим точку останова и посмотрим на значение activeBrick, мы обнаружим, что он выбрал совершенно неправильный кирпич, поэтому нам нужно изменить код, который получает координаты наших снарядов с точки зрения столбцов кирпичей, а также перевернуть x и координаты y при выборе активного кирпича:

И он все еще не обнаруживает столкновение! это связано с тем, что координаты в контейнере кирпичей по сути перевернуты, поэтому, если мы вычтем 266 из координаты Y, это будет работать немного лучше.

Теперь это почти работает, но это не совсем так, не так ли? Нам нужно сообщить снаряду, чтобы он не сталкивался с кирпичами, которые уже исчезли:

Последнее, с чем мы хотим, чтобы наш снаряд сталкивался, — это стены, поэтому мы можем настроить еще один блок операторов if, чтобы проверять положение нашего снаряда относительно границ игры:

Это должно почти завершить обнаружение столкновений. Мы почти там! В следующей статье мы поработаем над изменением скорости мяча более подходящим/забавным способом!

На случай, если вы отстали или что-то работает не так, вот как выглядят мои файлы в конце этой статьи: