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

Стрельба по воздушным шарам

Функция moveBalloons проверяет, все ли шары созданы и все ли шары исчезли, что говорит об окончании игры.

function moveBalloons() {
    // Перемещаем все шары,
    for (i = balloons.length - 1; i >= 0; i--) {
        // Определяем скорость шара
        //и получаем ссылку на клип,
        dx = balloons[i].d;
        balloon = _root[balloons[i].clip];
        // Перемещаем шар.
        balloon._x += dx;
        // При вылете за экран шар удаляется,
        if ((dx < 0) and (balloon._x < -20)) {
            balloon.removeMovieClip();
            balloons, splice(i, 1);
        }
        else if ((dx > 0) and (balloon._x > 570))
            balloon.removeMovieClip();
        balloons.splice(i, 1);
        // Если шары закончились, игра завершается.
        if ((nextBalloon >= numBalloons) and (balloons.length < 1)) {
            gotoAndStop("game over");
        }
    }
}

Функция moveFox определяет, нажаты ли клавиши со стрелками "влево" или "вправо", и перемешает лису на 10 пикселов влево или вправо при нажатии соответствующей клавиши. Как и в предыдущих играх, параметр _xscale клипа, содержащего лису, используется для поворота лисы. Функция также задает переход клипа к анимационной последовательности (изображает идущую лису и начинается в кадре 2), а также к кадр (изображает стоящую лису).

function moveFox() {
    // Подвинуть лису влево.
    if (Key.isDown(Key.LEFT)) {
        dx = -10;
        fox._xscale = Math.abs(fox._xscale);
        // Подвинуть лису вправо, перевернув ее клип по вертикали.
        // То есть изменив знак у свойства _scale, мы создаем зеркальное отражение клипа; лиса теперь идет в другую сторону.
    }
    else if (Key.isDown(Key.RIGHT)) {
        dx = 10;
        fox._xscale = -Math.abs(fox._xscale);
        // Иначе лиса не двигается.
    }
    else {
        dx = 0;
        // Перемещаем лису.
        fox._x += dx;
        if ((dx == 0) and (fox._currentFrame != 1)) {
            // Переходим к кадру, в котором лиса стоит,
            fox.gotoAndStop(1);
        }
        else if ((dx != 0) and (fox._currentFrame == 1)) {
            // Переходим к кадру, где лиса бежит.
            fox.gotoAndPlay(2);
        }
    }
}

Для того чтобы выстрелить, пользователь должен нажать на клавишу пробела. На нажатие клавиши реагирует скрытая кнопка, которая вызывает функцию shootBullet. Код кнопки будет рассмотрен далее, в разделе "К сведению".

Функция shootBullet проверяет, прошло ли достаточно времени после предыдущего выстрела. Это не дает игроку возможности стрелять залпом по всем мишеням.

Подобно шарам снаряды представлены одновременно клипом и элементом массива, в данном случае массива bullets. Массив используется функцией moveBullets для осуществления выстрелов.

Обратите внимание, что движение клипа, содержащего снаряд, начинается в точке, расположенной в 2 пикселях вправо и 55 пикселях влево от центра клипа лисы. Эта точка соответствует кончику соломинки.

function shootBullet() {
    // Проверяем, что с момента
    // предыдущего выстрела прошло достаточно времени.
    if (getTimer() > nextBulletTime) {
        // Создаем новую пулю.
        attachMovie("bullet", "bullet" + nextBullet, nextBullet + 9999);
        // Устанавливаем ее координагы.
        _root["bullet" + nextBullet]._x = fox._x + 2;
        _root["bullet" + nextBullet]._y = fox._y - 55;
        // Добавляем новую пулю к массиву.
        bullets.push(nextBullet);
        // Изменяем значение переменных, отвечающих
        //за появление пуль.
        nextBullet++;
        nextBulletTime = getTimer() + 1000;
    }
}

Функция moveBullets работает аналогично функции moveBalloons, но перемещает снаряды не вправо и влево, а вверх. Она проверяет одно из следующих условий: снаряд достиг верхнего края экрана либо попал в шар и вызвал функцию checkCollision. В обоих случаях и клип, и элемент массива удаляются.

function moveBullets() {
    // Проверяем, попали ли пули в шар.
    for (i = bullets.length - 1; i >= 0; i--) {
        // Выбираем элемент.
        bullet = _root["bullet" + bullets[i]];
        // Передвигаем пулю вверх,
        bullet._y -= 10;
        // Выясняем, достигла ли она конца экрана,
        if (bullet._y < 0) {
            bullet.removeMovieClip();
            bullets.spliced, 1);
            // Определяем, не попал ли игрок по шару.
        }
        else {
            if (checkCollision(bullet)) {
                bullet.removeMovieClip();
                bullets.splice(i, 1);
            }
        }
    }
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.