Иллюстрированный самоучитель по созданию Flash-игр

Мяч и бита

Создание кода

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