► скрыться – сокрытие спрайта по достижении им края экрана;
► переместиться – при достижении спрайтом края экрана он появляется у противоположного края;
► оттолкнуться – по достижении спрайтом границы экрана направление его движения изменяется на противоположное;
► остановиться – если спрайт достигает края экрана, он останавливается.
Все эти случаи реализуются константами класса MovingSprite. Ниже приведены константы и переменные этого класса:private int xSpeed, ySpeed;
private int action;
private Canvas canvas;
public static final int BA_HIDE = 1; //Эти константы описывают различные действия на границах игрового поля при перемещении спрайтов
public static final int BA_WRAP = 2;
public static final int BA_BOUNCE = 3;
public static final int BA_STOP = 4;Переменные xSpeed и ySpeed хранят соответствующие компоненты скорости спрайта, которые измеряются в пикселях за один игровой цикл. Переменная action содержит код действия, выполняемого по достижении спрайтом границы экрана – значение одной из констант класса. Поэтому каждый движущийся спрайт по достижении края экрана должен остановиться, появиться у другого края экрана, оттолкнуться или скрыться.
Граница экрана определяется переменной canvas, которая хранит холст, на котором выводится спрайт. Цель этой переменной – создать прямоугольную границу, ограничивающую движения спрайта. Иначе говоря, размеры переменной canvas служат размерами области, в которой может перемещаться спрайт – движение вне области невозможно.
Переменные класса MovingSprite инициализируются конструктором MovingSprite (листинг 18.1).
Листинг 18.1. Конструктор класса MovingSprite создает как анимационный, так и неанимационный спрайтpublic MovingSprite (Image image, int xMoveSpeed, Int yMoveSpeed,
int boundsAction, Canvas parentCanvas) {
super(image); //Вызов родительского конструктора Sprite()
// скорость XY
xSpeed = xMoveSpeed;
ySpeed = yMoveSpeed;
// действие при достижении границы экрана
action = boundsAction;
// родительский холст
canvas = parentCanvas;
}
public MovingSprite(Image image, int frameWidth, int frameHeight, int xMoveSpeed,
int yMoveSpeed, int boundsAction, Canvas parentCanvas) {
super(image, frameWidth, frameHeight); //Вызов родительского анимационного конструктора Sprite()
// скорости XY
xSpeed = xMoveSpeed;
ySpeed = yMoveSpeed;
// действие при достижении границы экрана
action = boundsAction;
// родительский холст
canvas = parentCanvas;
}В классе MovingSprite реализованы два конструктора – для создания анимационного и обычного спрайтов. Оба конструктора вызывают конструктор родительского метода Sprite(), который создает ядро спрайта, после чего выполняется инициализация специфических переменных класса. В отличие от класса DriftSprite, разработанного в главе 12, метод update() в классе MovingSprite удивительно прост:
public void update() {
// Move the sprite based on its speed
move(xSpeed, ySpeed);
// Check for a collision with the screen boundary
checkBounds();
}Сначала метод update() перемещает спрайт на основании текущей скорости, хранящейся в целочисленных переменных xSpeed и ySpeed. Метод завершается проверкой, находится ли спрайт внутри границ. Это выполняется методом checkBounds(), код которого приведен в листинге 18.2. Листинг 18.2. Метод checkBounds() проверяет столкновение спрайта с границей экрана и в случае столкновения выполняет соответствующие действия