Пишем игру для Андроид
Часть шестая «Столкновения»
Столкновения в играх - это событие, которое должно привести к другому событию. Например, в нашем случае, если астероид упадет на базу, то должен произойти взрыв, раздаться звук взрыва и произойти изменения в самой картинке базы. Если астероид упал мимо базы, можно ограничиться меньшим взрывом и его звуком.
Столкновение внешне выглядит, как правило, в виде касания или перекрытия объектов, таким образом, в коде мы должны будем сравнивать определенные координаты тел, и делать выводы.
Координаты астероида меняются в методе update класса public class GameView.
public void update() {
if (yAsteroid > height) {
yAsteroid = 0;
// find by random function Asteroid & speed Asteroid
Random rnd = new Random();
xAsteroid = rnd.nextInt(width - widthAsteroid);
speedAsteroid = 5+ rnd.nextInt(10);
} else {
yAsteroid +=speedAsteroid;
}
}
Давайте еще раз внимательно посмотрим, что происходит. Если координата астероида по У (yAsteroid) становится больше высоты экрана, то она обнуляется. Также
задается по случайному закону координата по Х (xAsteroid), и по случайному закону
назначается скорость падения по У (speedAsteroid). Если у нас астероид в поле
экрана (условие else), то координата по У возрастает за один цикл на величину
speedAsteroid.
В этом задании отработаем столкновение астероида с землей. В нашем
случае это желтая полоса. Если нижний край астероида коснется ее, мы будем
считать, что он коснулся объекта. Для этого мы должны записать условие
столкновения.
Раньше мы прежде, чем прорисовывать картинку астероида, задали размеры холста:
mAsteroid.setBounds(leftAsteroid, topAsteroid, rightAsteroid, bottomAsteroid);
в котором будем рисовать методом mAsteroid.draw(canvas);.
Теперь надо описать те случаи, когда красный квадрат коснется желтой
линии. В начале, рассмотрим участок слева от ступеньки (т.А). Мы задаём условие,
что если координата по У будет больше 0,8 высоты экрана устройства и в тоже время (&& - логическое «И») обязано выполняться еще одно условие: правый край квадрата должен лежать левее начала ступеньки (координата по Х равна width/4).
yAsteroid > 8*height/10 && rightAsteroid <= width/4
Аналогично описываем саму ступеньку, координата по У стала на 0,1 высоты экрана
выше, а левый и правый края квадрата не выходят за ступеньку.
yAsteroid > 7*height/10 && rightAsteroid > width/4 && leftAsteroid<=3*width/4
И участок справа от ступеньки (т.D)
yAsteroid > 8*height/10&& leftAsteroid > 3*width/4
Между этими условиями стоит значок || (логическое «или»), который говорит программе, что если выполнится хотя бы одно из этих условий, то событие должно
произойти.
Что же у нас произойдет? Пока нет анимации взрыва, поэтому просто засылаем
астероид выше верхней части экрана
yAsteroid = -height/2;
Посмотрите, как изменилось условие в методе update.
public void update() {
if (yAsteroid > 8*height/10&& rightAsteroid <= width/4||
yAsteroid > 7*height/10&& rightAsteroid > width/4&& leftAsteroid<=3*width/4||
yAsteroid > 8*height/10&& leftAsteroid > 3*width/4
) {
yAsteroid = -height/2;
// find by random function Asteroid & speed Asteroid
Random rnd = new Random();
xAsteroid = rnd.nextInt(width - widthAsteroid);
speedAsteroid = 5+ rnd.nextInt(10);
} else {
yAsteroid +=speedAsteroid;
}
}
На видео хорошо видно, как астероид исчезает в разных местах.
https://youtu.be/3XxX6G103UM
На следующем уроке научимся создавать спрайты и работать с ними, т.е. вставим
анимацию взрыва астероида.