Передней стенки у нас нет, но на ее месте располагается бита. Если параметр z принимает значение 0, клип биты проверяет, попал ли в него шар (22). Бита имеет размер 70x70, так что шар должен находиться не далее чем в 35 пикселах по каждой из координат от центра биты. При столкновении определяются новые значения скорости шара в соответствии с расстоянием от центра биты до места столкновения (23). При столкновении строго по центру шар отражается отвесно, тогда как отражение, например, от левой стороны отклоняет мяч влево и т. д.
При столкновении с битой ее параметр _alpha на мгновение принимает значение 90 (24). В следующем кадре значение восстанавливается (26).
Если шар пролетает мимо биты, игра заканчивается
(25). Если же все блоки оказываются выбиты, игрок переходит на следующий уровень.
function moveBall() {
(16) →// Определяем пространственные координаты шара.
ballpos.x += ballvel.x;
ballpos.y += ballvel.y;
ballpos.z += ballvel.z;
(17) →// Определяем плоские координаты.
ball._x = ballpos.x + ballpos.z*(200-ballpos.x)/200;
ball._y = ballpos.y + ballpos.z*(200-ballpos.y)/200;
(18) →// Корректируем размер шара.
ball._xscale = (200-ballpos.z)/2;
ball._yscale = (200-ballpos.z)/2;
(19) →// Определяем размер рамки.
ring._xscale = (200-ballpos.z)/2;
ring._yscale = (200-ballpos.z)/2;
(20) →// Проверяем столкновения со стенками.
if (ballpos.x > 400) ballvel.x *= -1;
if (ballpos.x < 0) ballvel.x *= -1;
if (ballpos.y > 400) ballvel.y *= -1;
if (ballpos.y < 0) ballvel.y *= -1;
(21) →// Столкновение с задней стеной.
if (ballpos.z > 140) {
// Меняем направление вдоль Oz.
ballvel.z *= -1;
// Удаляем выбитые шары.
for(var i=bricks.length-1;i>=0;i–) {
if (bricks[i].hitTest(ball._x,ball._y)) {
bricks[i].removeMovieClip();
bricks.splice(i,1);
score++;
}
}
}
(22) →// Столкновение с битой.
if (ballpos.z < 0) {
// Расстояние до центра биты.
px = ballpos.x-paddle._x;
py = ballpos.y-paddle._y;
// Столкновение происходит, если расположение от шара
// до центра биты не более 35 пикселов.
if ((Math.abs(px) < 35) and (Math.abs(py) < 35)) {
(23) →// Корректируем скорости по x и по y.
ballvel.x = px/7;
ballvel.y = py/7;
(24) →//Отмечаем столкновение изменением прозрачности биты.
paddle._alpha = 90;
} else {
(25) →// Мяч пропущен.
removeBallAndPaddle();
gotoAndStop("game over");
}
// Меняем направление мяча вдоль Oz.
ballvel.z *= -1;
} else {
(26) →// Возвращаем бите прежнюю прозрачность.
paddle._alpha = 50;
}
(27) →// Смотрим, все ли блоки выбиты.
if (bricks.length < 1) {
gameLevel++;
removeBallAndPaddle();
gotoAndStop("level over");
}
}
Вот еще два полезных фрагмента кода. Первый удаляет шар и биту. Если этого не сделать, они так и будут висеть, как в кадре «game over», так и в кадре «level over».
function removeBallAndPaddle() {
paddle.removeMovieClip();
ball.removeMovieClip();
}
Ну а следующая функция, removeBricks,удаляет блоки из этих же кадров. Вызывается при нажатии соответствующих кнопок.
function removeBricks() {
for(var i=0;i
bricks[i].removeMovieClip();
}
}
Первый кадр ролика – «start» – присваивает переменной gameLevelзначение 1 и останавливает ролик.
gameLevel=1; stop();
Чтобы перейти к следующему кадру, надо нажать кнопку. Вот ее код.
on (press) {
GotoAndStop("Play");
}
Все функции, которые мы рассмотрели, находятся в кадре «Play». Еще там есть команда, вызывающая функцию initGame.Когда уровень пройден, игра переходит к кадру "level over". Так как клип "action" находится в другом кадре, то все шары автоматически останавливаются. При нажатии единственной в этом кадре кнопки все блоки удаляются, и функция initGameможет расставить их заново при переходе на следующий уровень.
on (press) {
removeBricks();
gotoAndStop("Play");
}
При нажатии кнопки в кадре «game over» блоки тоже удаляются, но игра переходит к кадру «start».
on (press) {
removeBricks();
gotoAndStop("Start");
}
К сведению
Игра, в общем то, лишь приблизительно воспроизводит трехмерный мир. Например, когда мяч отлетает в угол, компонент скорости z меняется таким образом, что суммарный вектор скорости остается неизменным.
Вы можете попробовать спрятать курсор перед началом игры с помощью Mouse.hide(), только не забудьте вернуть его на место по окончании игры с помощью Mouse.show().
Другие возможности
Очень простой способ внести дополнение в эту игру – поместить какой-либо рисунок за блоками. Это можно сделать вообще без использования ActionScript. Можно также сделать, чтобы в конце каждого уровня пользователь видел другую картинку.
Глава 12 Викторины и загадки со словами
• Викторина во Flash
• Викторина с учетом времени
• Игра "Виселица"
• Криптограмма
В этой главе мы рассмотрим игры, в которых используются слова, а не действия. Есть два различных типа игр со словами. В играх первого типа программа задает вопрос и проверяет, правильно ли ответил пользователь. В играх второго типа пользователю предлагается отгадать слово или фразу, открывая по одной букве.
Читать дальше
Конец ознакомительного отрывка
Купить книгу