Отскакивающий мяч
Теперь мы умеем перемещать шар вдоль апплета без мерцания экрана. Это означает, что мы знаем две наиболее важных вещи, необходимых для создания игры с анимированными объектами. В этой главе я хочу рассказать вам, как менять направление движения шара. Это первый случай, когда мы не можем решить задачу применением "стандартной" техники, как делали в предыдущих главах (двойная буферизация...). Но я уверен, что, если вы поймете решение, у вас появятся собственные идеи в похожих ситуациях. В последних двух апплетах шар двигался по экрану лишь единожды. Теперь нам нужно избежать исчезновения шара из поля апплета - вместо этого он будет отражаться и двигаться в противоположном направлении от "стены". Что мы сделаем? Было бы неплохо, если бы сейчас прекратили чтение и попробовали найти решение самостоятельно. Ниже в этой главе вы узнаете о том, как решил задачу я (мое решение не единственно правильное!). Используйте в качестве заготовке код апплета двигающегося шара с двойной буферизацией.
Как двигать мяч в разных направления по оси x
Во-первых, мы должны вспомнить способ, с помощью которого мы перемещали шар во второй главе. Как мы тогда поступили? Мы увеличивали значение позиции объекта по оси x каждый раз, когда запускался thread и перерисовывал шар на новой позиции. Возможно, вы и не сознавали этого, но мы использовали "вектор скорости" для позиции x шара вызовом x_pos++ в методе run. Это означает, что мы также можем определить переменную x_speed, хранящую значение, которое будет добавляться к x_pos таким образом: x_pos += x_speed. Представьте, что x_speed имеет значение 1, означабщее, что шар будет двигаться слева направо (в том же направлении, что и в предыдущей главе), так как x-pos увеличивается каждый раз, когда запускается метод run. Теперь действительно легко понять, как поменять направление шара. Нам всего лишь следует задать значение переменной x_speed, равное -1! После этого при каждом вызове x_pos += x_speed -1 "прибавляется" к позиции x нашего шара. Значение x_pos уменьшается на один и шар двигается справа налево!
Вот мы и научились менять направление шара, и осталась только одна "проблема". Как мы (вернее, компьютер) можем решить, где следует поменять направление? Для этого нам следует постоянно проверять, где находится шар. Взгляните на этот код:
// Шар отскакивает, когда его позиция по оси x достигает правого края апплета
if (x_pos > appletsize_x - radius)
{
-
// Изменение направления движения шара
x_speed = -1;
// Шар отскакивает, когда его позиция по оси x достигает левого края апплета
else if (x_pos < radius)
{
-
// Изменение направления движения шара
x_speed = +1;
Всякий раз, когда запускаем метод run, мы проверяем, достиг ли шар границы апплета (правой либо левой). В этих случаях мы меняем значение переменной x_speed и, таким образом, можем менять и направление движения шара.
Вы можете спросить, почему я использовал в коде радиус. Дело в том, что позиция x шара находится в его центральной точке, и поэтому позиция x его правого и левого края отличается от позиции центра на значение радиуса (больше и меньше соответственно). Чтобы заставить нас поверить, что шар отскакивает, когда достигает стены, нам необходимо добавить или вычесть значение радиуса из значения позиции x шара.
Появление шара с другой стороны
После того, как вы освоили технику проверки местонахождения шара, вы можете осуществить множетво других вещей. Представьте, что нам нужно сделать так, чтобы шар появлялся с другой стороны, когда он покидает поле апплета. Это очень легко сделать, нам снова надо проверить где находится шар, а затем задать ему новое значение позиции x вместо изменения x_speed.
// Проверяем, покинул ли шар поле апплета
if (x_pos > appletsize_x + radius)
{
-
// Set a new x_pos value for the ball
x_pos = -20;
Позже, в главе 5, я расскажу, как перемещать шар не только в одном направлении, а в двух (по осям x и y). В этом тоже нет ничего сложного. У вас будет не один вектор (x_speed), а два (x_speed, y_speed), и также y_pos и x_pos. Оба значения меняются, когда запускается run(), и шар движется вдоль всего поля апплета. Конечно, надо иметь в виду, что нам придется проверять 4 возможных ситуации, когда мяч покинет поле апплета. Если хотите, можете создать апплет, где шар может двигаться в разных направлениях (2D) и отлетать от каждого края апплета (это будет хорошей практикой ;-). Вот и все, запускайте апплет и скачивайте код!
Скачать исходный код отскакивающего мяча
Скачать исходный код появляющегося мяча
Запустить апплет с отскакивающим мячом
Запустить апплет с появляющимся мячом
Следующая глава:
Использование звуков в апплетах