Мяч и бита
Создание кода
В сценарий предыдущего ролика необходимо внести некоторые изменения. Изменить существующие функции и добавить одну новую. Приведем сценарий клипа "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; } } }