Мяч и бита
Создание кода
В сценарий предыдущего ролика необходимо внести некоторые изменения. Изменить существующие функции и добавить одну новую. Приведем сценарий клипа "actions", который вызывает новую функцию moveComputerPaddle:
onClipEvent(load) {
_root.startLevel();
}
onClipEvent(enterFrame) {
_root.moveBall();
_root.movePaddle();
_root.moveComputerPaddle();
}
Вместо функции startGame в этой игре используется функция startLevel, которая обладает всеми возможностями функции startGame и в дополнение к ним указывает, что мяч будет двигаться в произвольном направлении. Достичь этого можно, определив, что мяч в 50% случаев подается вверх, в 50% случаев – вниз, также в 50% случаев – влево и в 50% случаев – вправо. То есть вы получаете четыре возможных направления движения мяча по диагонали.
function
startLevel() {
// Определяем начальное положение мяча,
x
=
ball._x;
y
=
ball._y;
// Указываем начальную скорость и одно из четырех
// произвольных направлений по диагонали,
dx
=
5
;
dy
=
5
;
if
(Math.random()
<
0.5
)
dx
*
=
-
1
;
if
(Math.random()
<
0.5
)
dy
*
=
-
1
;
// Прячем курсор.
Mouse.hide();
// Устанавливаем значения констант.
rightWall
=
550
;
leftWall
=
0
;
topWall
=
0
;
bottomWall
=
400
;
ballRadius
=
ball._width
/
2
;
passedPaddle
=
false
;
}
Теперь в функцию moveBall включен код для определения, пролетел ли мяч мимо биты компьютера или нет (10). Он похож на код, обрабатывающий биту игрока (9), и идентичен соответствующему фрагменту кода предыдущей игры.
Когда мяч пролетает с правой (11) или с левой (12) стороны, обычно игра возвращается к кадру "start level". Однако если не осталось больше мячей, программа переходит к кадру завершения игры, "game over". В зависимости от того, кто пропустил мяч, очко записывается либо игроку, либо компьютеру (переменной playerScore или computerScore).
function
moveBall() {
// Изменяем координаты х и у.
x
+
=
dx;
y
+
=
dy;
// Проверяем, попал ли мяч в нижнюю стену,
if
(y
+
ballRadius
>
bottomWall) {
overshoot
=
(y
+
ballRadius)
-
bottomWall;
y
-
=
overshoot
*
2
;
dy
*
=
-
1
;
}
// Проверяем, попал ли мяч в верхнюю стену,
if
(y
-
ballRadius
<
topWall) {
overshoot
=
topWall
-
(y
-
ballRadius);
y
+
=
overshoot
*
2
;
dy
*
=
-
1
;
}
//(9) Находится ли мяч там, где по нему должна ударить бита?
paddleRight
=
paddle._x
+
(paddle._width
/
2
);
if
((x
-
ballRadius
<
paddleRight) and ipassedPaddle) {
// Находится ли там бита?
paddleTop
=
paddle._y
-
(paddle._height
/
2
);
paddleBottom
=
paddle._y
+
(paddle._height
/
2
);
if
((y
>
paddleTop) and (y
<
paddleBottom)) {
overshoot
=
paddleRight
-
(x
-
ballRadius)
// Удар битой,
x
+
=
overshoot
*
2
;
dx
+
=
-
1
;
// Увеличиваем скорость мяча,
dx
*
=
1.05
;
dy
*
=
1.05
;
}
else
{
// Мяч пропущен, больше ничего не проверяем.
passedPaddle
=
true
;
}
}
}