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 *= .4;
// Если пуля оказалась слишком далеко от астероида, удаляем ее.
if (bullets[i].dist < .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 = bullets[i].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: .01, clip: "rock"+level});
}
Подобно функции moveBulletsфункция moveRocksиспользует свойство distкаждого астероида, чтобы передвинуть его. Однако со временем он приближается к экрану и его начальное значение 0,01 в каждом кадре увеличивается на 10 %. Помимо положения астероида его свойства _xscale и _yscale также зависят от dist,это делает возможным увеличивать астероид и создавать иллюзию его приближения к кораблю. Если занчение distстановится больше 1,0 и астероид все еше находится в видимой области экрана, считается, что астероид попал в корабль. Астероид взрывается, и значение переменной damageувеличивается. Если значение переменной damageбольше или равно 20, то игра заканчивается.
function moveRocks() {
// Перемещаем все астероиды.
for(i=rocks.length-1;i>=0;i—) {
// Уменьшаем расстояние до корабля на 10 %.
rocks[i].dist *= 1.1;
// Проверяем, может ли астероид задеть корабль.
if (rocks[i].dist > 1.0) {
// Проверяем, ударил ли астероид корабль.
if (rocks[i].destx > 0 and rocks[i].destx < 550 and rocks[i].desty > 0 and rocks[i].desty < 400) {
// Взрываем астероид и увеличиваем количество повреждений.
_root[rocks[i].clip].gotoAndPlay("explode blue");
damage++;
foreground.displayDamage = damage;
// Смотрим, превысило ли количество повреждений допустимый уровень.
if (damage >= 20) {
removeAllRocks();
Mouse.show();
gotoAndStop("game over");
}
// Если астероид не попал по кораблю, то убираем его.
} else {
_root[rocks[i].clip].removeMovieClip();
}
// Убираем элемент из массива.
rocks.splice(i,1);
// Перемещаем астероид.
} else {
rocks[i].x = (1.0-rocks[i].dist)*rocks[i].startx + rocks[i].dist*rocks[i].destx;
rocks[i].y = (1.0-rocks[i].dist)*rocks[i].starty + rocks[i].dist*rocks[i].desty;
_root[rocks[i].clip]._x = rocks[i].x;
_root[rocks[i].clip]._y = rocks[i].y;
// Увеличиваем астероид.
Читать дальше
Конец ознакомительного отрывка
Купить книгу