Итак, разработка игры привела нас к следующим важным аспектам, которыми необходимо управлять во время игры:
► число оставшихся жизней (автомобилей);
► счет;
► булевская переменная, отслеживающая окончание игры.
Эта информация отражает ядро игровых данных, которые необходимо отслеживать во время игры. Помните, что игровые спрайты – очень важный компонент состояния игры. Зная это, вы можете перейти к проработке кода игры Space Out. Так же, как и игра High Seas, созданная в главе 12, игра Space Out потребует значительных сил, но труд будет вознагражден! Вы увидите!
Реализация игры
Структура игры аналогична структуре игр, разработанных ранее. В следующих разделах вы разработаете код и ресурсы игры.
Создание движущихся спрайтов
Разработку игры Space Out начнем с создания нового класса спрайтов, который будет использоваться в игре для реализации движущихся спрайтов. Этот класс MovingSprite аналогичен классу DriftSprite из главы 12 за исключением того, что в первом будут использоваться компоненты X и Y скорости, а также обрабатываться столкновения спрайта со стенкой экрана.
Любой спрайт в итоге может достичь края экрана, и в этом случае возможны несколько вариантов. Например, в игре Pong спрайт, достигающий границы экрана, отскакивает от нее. В игре Asteroids при достижении границы экрана спрайт может появиться у противоположной стороны. В некоторых играх спрайт просто замирает или уничтожается (скрывается). Все эти возможности реализует класс MovingSprite. Давайте перечислим эти возможности снова:
► скрыться– сокрытие спрайта по достижении им края экрана;
► переместиться– при достижении спрайтом края экрана он появляется у противоположного края;
► оттолкнуться– по достижении спрайтом границы экрана направление его движения изменяется на противоположное;
► остановиться– если спрайт достигает края экрана, он останавливается.
Все эти случаи реализуются константами класса 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() проверяет столкновение спрайта с границей экрана и в случае столкновения выполняет соответствующие действия
Читать дальше
Конец ознакомительного отрывка
Купить книгу