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

Стена и мяч

Оператор *= работает точно так же, как и +=, только он умножает исходное значение переменной на указанное число. То есть если значение а равно 5, строка а *= 3 изменит это значение на 15. Если же записать а *= – 1, значение переменной а станет равным – 5. Воспользовавшись записью *= – 1 можно быстро изменить знак переменной.

function moveBall() {
    //(1) Изменяем значение переменных х и у.
    x += dx;
    y += dy;
    //(2) Проверяем, достиг ли мяч правой стены,
    if (x + ballRadius > rightWall) {
        overshoot = (x + ballRadius) - rightWall;
        x -= overshoot * 2;
        dx *= -1;
        //(3) Проверяем, достиг ли мяч нижней стены,
        if (y + ballRadius > bottomWall) {
            overshoot = (y + ballRadius) - bottomWall;
            y -= overshoot * 2;
            dy *= -1;
            //(4) Проверяем, достиг ли мяч верхней стены,
            if (y - ballRadius < topWall) {
                overshoot = topWall - (y - ballRadius);
                y += overshoot * 2;
                dy *= -1;
                //(5) Находится ли мяч там, где должен удариться о биту?
                paddleRight = paddle._x + (paddle._width / 2);
                if ((x - ballRaduis < paddleRight) and passedPaddle) {
                    //(6) Находится ли там бита?
                    paddleTop = paddle._y - (paddle._height / 2);
                    paddleBottom = paddle._y + (paddle._height / 2);
                    if ((y > paddleTop) and (y < paddleBottom)) {
                        // Удар о биту.
                        overshoot = paddleRight;
                        x += overshoot * 2;
                        dx *= -1;
                        //(7) Увеличиваем скорость,
                        dx *= 1.05;
                        dy *= 1.05;
                    }
                    else {
                        // Мяч пропущен, больше ничего проверять не надо.
                        passedPaddle = true;
                    }
                }
                //(8) Проверяем, находится ли мяч у левой стены,
                if ((x - ballRadius < leftWall) and passedPaddle) {
                    Mouse.show();
                    GotoAndPLay("game over");
                }
                // Устанавливаем новое положение мяча.
                ball._x = x;
                ball._y = y;
            }
        }
    }
}

По сравнению с функцией moveBall функция movePaddle Поразительно короткая. Все, что необходимо сделать, – присвоить вертикальному положению биты значение вертикальной координаты курсора.

function movePaddle() {
    // положение биты меняется в соответствии с курсором
    paddle._y = _ymouse;
}

К сведению

Убедитесь, что экземпляру клипа с мячом присвоено имя "ball", а экземпляру клипа с битой – "paddle". Если стены расположены не так, как в исходном ролике, проверьте, правильно ли указаны константы в функции initGame.

В основной кадр игры необходимо включить оператор stop, чтобы вставить паузу в основную временную шкалу (это поможет избежать досрочного перехода к кадру окончания игры).

Другие возможности

Игру можно усовершенствовать, если позволить игроку пропустить в течение игры определенное количество мячей. Таким образом, игра не будет заканчиваться после пропуска первого мяча, а продолжится со вторым мячом и т.д.

Осуществить это можно, присвоив, например, в начале игры переменной ballNum значение 3 или какое-либо другое. В результате, если величина ballNvun будет превышать 0, вместо кадра "game over" ролик будет переходить к кадру "ball lost". Игрок может нажать любую клавишу и начать игру заново, но при этом значение ballNum.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.