Космический бой
С помощью команды Mouse.hide () с экрана удаляется обычный курсор, вместо этого положение курсора вы будете определять с помощью клипа.
function initGame() { // Создаем массивы для пуль и астероидов, bullets = new Array(); rocks = new Array(); // Помещаем перекрестие и кабину корабля поверх остальных элементов. _root["foreground"].swapDepths(9999999); _root["cursor"].swapDepths(9999999); // Устанавливаем переменные, level = 0; damage = 0; hits = 0; // Убираем обычный курсор, вместо него отображаем перекрестие. Mouse.hide(); }При каждом обращении к клипу "actions" вызывается функция moveCursor, которая помешает клип "cursor" в точку, где находится курсор мыши. Игрок использует такой курсор, чтобы прицеливаться.
function moveCursor() { // Перемещаем перекрестие в точку, где находится курсор мыши. cursor._x = _xmouse; cursor._y = _ymouse; }Кнопка "button" при нажатии клавиши Пробел вызывает функцию fire, в которой определяется положение курсора и создается пара новых клипов "point" для пуль. Кроме того, в массив bullets добавляются следующие элементы: исходное положение, конечное положение, пройденное расстояние и имя клипа для каждой пули.
function fire() { // Определяем положение мыши. x = _xmouse; y = _ymouse; // Создаем левую пулю. level++; attachMovie("point", "bullet" + level, level); bullets.push({ startx: 50, starty: 350, destx: x, desty: y, dist: 1.0, clip: "bullet" + level }); // Создаем правую пулю. level++; attachMovie("point", "bullet" + level, level); bullets.push({ startx: 500, starty: 350, destx: x, desty: y, dist: 1.0, clip: "bullet" + level }); }После того как пуля выпущена, ее движением во всех кадрах управляет функция moveBullets, которая использует массив bullets, чтобы отслеживать путь каждой пули. В каждом кадре значение свойства dist уменьшается на 40% от своего предыдущего значения. Пуля отображается между своим исходным и конечным положением в зависимости от значения dist. Если это значение равно 1.0, пуля находится в исходном положении, а при 0.0 – в конечном.
Однако когда значение свойства dist становится равным 0.01, считается, что пуля практически закончила свой путь. В этот момент вызывается функция checkForHit, чтобы определить, попадет ли пуля в астероид или нет. Независимо от результата пуля удаляется из массива и ролика.
Эта игра не претендует на трехмерную модель реального пространства. Она, скорее, воссоздает типичную аркадную игру.
function moveBullets() { // Перемещаем все пули. for (i = bullets.length - 1; i >= 0; i--) { // Увеличиваем пройденное расстояние на 40%. bullets[i].dist *= 0.4; // Если пуля оказалась слишком далеко от астероида, удаляем ее. if (bullets[i].dist < 0.01) { checkForHit(bullets[i].destx, bullets[i].desty); _root[bullets[i].clip].removeMovieClip(); bullets.splice(i, 1); // Помещаем пулю ближе к цели. } else { bullets[i].x = bullets[i].dist * bullets[i].startx + (1.0 - bullets[i].dist) * bullets[i].destx; bullets[i].y = bullets[i].dist * bullets[i].starty + (1.0 - bullets[i].dist) * bullets[i].desty; _root[bullets[i].clip]._x = bulletsfi].x; _root[bullets[i].clip]._y = bullets[i].y; } } }Астероид создан так же, как и пуля. Однако координаты появления и исчезновения астероида выбираются случайно. Стартовая точка находится на расстоянии 25 пикселов по горизонтали и вертикали от центра экрана. Конечная точка отстоит от центра на расстоянии 550 пикселов по горизонтали и 400 по вертикали, что ровно в два раза больше размера рабочего поля. Это означает, что астероид появляется всегда в районе центра экрана, но может финишировать в любой точке вне видимой его области.
function createRock() { // Задаем случайное положение для астероида, startx = Math.random() * 50 + 250; starty = Math.random() * 50 + 175; // Задаем случайное направление движения, destx = Math.random() * 1100 - 275; desty = Math.random() * 800 - 200; // Добавляем астероид. level++; attachMovie("rock", "rock" + level, level++); rocks.push({ startx: startx, starty: starty, destx: destx, desty: desty, dist: 0.01, clip: "rock" + level }); }Подобно функции moveBullets функция moveRocks использует свойство dist каждого астероида, чтобы передвинуть его. Однако со временем он приближается к экрану и его начальное значение 0.01 в каждом кадре увеличивается на 10%. Помимо положения астероида его свойства _xscale и _yscale также зависят от dist, это делает возможным увеличивать астероид и создавать иллюзию его приближения к кораблю.
