Этот код достаточно прост, в нем переменным класса присваиваются параметры спрайта преследующего. Важно обратить внимание на порядок параметров преследующего, передаваемых в конструктор. Также стоит обратить внимание на вызов родительского конструктора Sprite() через метод super(), которому передаются значения ширины и высоты фрейма спрайта.
Помимо переменных, работу класса определяет единственный метод – update(). Этот метод вызывается один раз за игровой цикл, он обновляет спрайт и перемещает его. Листинг 13.2 содержит код метода update() метода ChaseSprite.
Листинг 13.2. Метод update() класса ChaseSprite реализует преследованиеpublic void update() {
// временно сохранить положение
int xPos = getX();
int yPos = getY();
int direction = 0; // up = 0, right = 1, down = 2, left = 3
// Преследовать или переместиться случайным образом в зависимости от
уровня агрессии
if (Math.abs(rand.nextInt() % (aggression + 1)) > 0) {
// преследовать
if (getX() > (chasee.getX() + chasee.getWidth() / 2)) { //Преследование продолжается, пока преследуемый не входит в граничную зону преследователя
// преследовать влево
move(-speed, 0);
direction = 3;
}
else if ((getX() + getWidth() / 2) < chasee.getX()) {
// преследовать вправо
move(speed, 0);
direction = 1;
}
if (getY() > (chasee.getY() + chasee.getHeight() / 2)) {
// преследовать вверх
move(0, -speed);
direction = 0;
}
else if ((getY() + getHeight() / 2) < chasee.getY()) {
// преследовать вниз
move(0, speed);
direction = 2;
}
}
else {
// переместиться случайным образом
switch (Math.abs(rand.nextInt() % 4)) { //Если спрайт не преследует, то он просто перемещается случайным образом
// переместиться влево
case 0:
move(-speed, 0);
direction = 3;
break;
// переместиться вправо
case 1:
move(speed, 0);
direction = 1;
break;
// переместиться вверх
case 2:
move(0, -speed);
direction = 0;
break;
// переместиться вниз
case 3:
move(0, speed);
direction = 2;
break;
}
}
// проверить столкновения с барьером
if (barrier != null && collidesWith(barrier, true)) {
// вернуть спрайт в исходное положение
setPosition(xPos, yPos);
}
// если спрайт направленный, то перейти к нужному фрейму
if (directional) //Если спрайт является направленным, то выбирается соответствующий фрейм анимации, в противном случае выводится следующий фрейм анимации
setFrame(direction);
else
nextFrame();
}