Подход
Самое сложное при создании этой игры – сделать так, чтобы мяч правильно отскакивал от стен. Многие программисты не учитывают ни диаметр мяча, ни его скорость. В результате может случиться, что мяч будет отскакивать не от стены, а от точки, расположенной за ней.
Рассмотрим ситуацию, когда мяч оказывается за стеной. При этом надо выяснить, насколько далеко залетел мяч за пределы игрового поля. Так как мяч перемещается на несколько пикселов в одном кадре, он может легко проскочить за стену на несколько пикселов.
После того как вы узнаете, насколько далеко за стеной оказался мяч, вы можете изменить направление его движения, а затем поместить мяч на соответствующее расстояние с нужной стороны стены. На рис. 11.2 показана диаграмма работы данного алгоритма.
Рисунок 11.2. Диаграмма показывает, как изменяется положение мяча после столкновения со стеной
Столкновения с битой рассматриваются точно так же, как и столкновения со стеной. Единственное различие – вы должны изначально убедиться, что вертикальное положение биты допускает удар мяча об нее.
Если мяч проходит через горизонтальное положение биты, но ее там нет, нужно присвоить некой переменной значение, указывающее, что мяч был пропущен. Таким образом, у пользователя не будет другого шанса отбить мяч, пока тот летит до границы экрана.
Подготовка ролика
Единственными графическими объектами, необходимыми для этой игры, являются мяч, бита и стены. Изображения стен не используются в коде, так как реальные границы игрового поля определяются с помощью значений определеннных констант.
Создание кода
Для этой игры необходимы лишь три функции (посмотрите исходный файл, Wallball.fla). Все эти три функции будут вызываться в клипе «actions»:
onClipEevent(load) {
_root.initGame();
}
onClipEvent(enterFrame) {
_root.moveBall();
_root.movePaddle();
}
Функции находятся в основной временной шкале. Первая функция, initGame,хранит положение мяча в переменных xи y.Указаны значения dxи dy,то есть скорость мяча по вертикали и горизонтали (5 пикселов в кадре каждая). Затем функция initGameустанавливает несколько постоянных, определяющих положение каждой стены. Этой функции передается значение радиуса мяча, которое также используется функцией moveBall.Переменной passedPaddleприсваивается значение true после того, как игрок пропустит мяч. При этом надо спрятать курсор, чтобы он не отвлекал внимание игрока.
function initGame() {
// Устанавливаем начальное положение мяча.
x = ball._x;
y = ball._y;
// Указываем начальную скорость.
dx = 5;
dy = 5;
// Устанавливаем значения постоянных.
rightWall = 550;
leftWall = 0;
topWall = 0;
bottomWall = 440;
ballRadius = ball._width/2
passedPaddle = false;
// Прячем курсор.
Mouse.hide();
}
Функция movePaddle– «рабочая лошадка» этой игры. Сначала она изменяет значение xи yна величину значений dxи dyсоответственно, чтобы получить новое положение мяча (1). Затем проверяет, пролетел ли мяч сквозь стену или нет (2).
К радиусу мяча прибавляется значение его положения, чтобы получить точную позицию правого края мяча. Если мяч оказался за стеной, функция movePaddleподсчитывает, как далеко он перелетел, и присваивает это значение переменной overshoot.Затем мяч перемещается назад на расстояние, в два раза превышающее значение overshoot.Направление мяча меняется при умножении dxна -1, таким образом, знак dxменяется на противоположный. Если значение dxдо столкновения мяча со стеной было равно 5, то после этого события становится равным -5.
Затем код проверяет, пролетел ли мяч сквозь нижнюю стену или нет (3). Этот фрагмент похож на предыдущий, только вместо xи dxиспользуются величины yи dy.
Фрагмент кода, где проверяется, пролетел ли мяч через верхнюю стену, несколько отличается от уже рассмотренных (4). Для определения положения верхней границы мяча из положения его центра вычитается радиус. Затем величина overshootрассчитывается как разница между положениями стены и верхней границы мяча.
Для того чтобы определить, ударился ли мяч о биту или нет, сначала код рассчитывает положение правой границы биты (5).Потом, если мяч находится достаточно близко к бите, рассчитываются верхняя и нижняя границы, а затем определяется, пересекаются ли мяч и бита (6).
Если мяч сталкивается с битой, то он ведет себя так же, как и при столкновении со стеной. Однако при этом скорость мяча увеличивается на 5 % (7). Если мяч перелетает через стену, совершается только одно действие – переменной passedPaddleприсваивается значение true.
Читать дальше
Конец ознакомительного отрывка
Купить книгу