Ваш аккаунт: пройдите авторизацию

Авторизация

Пароль есть, но Вы его забыли?
Впервые на сайте? Зарегистрируйтесь!

Вы попали в мир графики и дизайна


Изюминка нашего сайта в том, что все файлы хранятся на наших серверах, поэтому Вы получаете круглосуточный доступ ко всем файлам по прямым ссылкам без регистрации! С нашим сайтом Вы забудете про файлообменники!


Урок "Катапульта"
Macromedia Flash » Уроки 23 августа 2009 NazaRПечать


И так начинаем.
В этом уроке объясняется шаг за шагом, как создать такую игру. С помощью него вы научитесь создавать movie клипы, рисовать и попрактикуетесь в основах actions script 2.
 
 Шаг 1

Начнём с создания катапульты. Нарисуйте катапульту на свой вкус. На данном этапе не рисуйте колёса и спусковой механизм. Выделите катапульту > правая кнопка мыши > convert to symbol (или просто нажмите F8)
Назовите объект catapult, задайте ему тип movie clip, и выберите галочкой export for actionscript. Далее убедитесь что linkage тоже catapult. Откройте мувик catapult и создайте новый слой. Нарисуйте спусковой механизм катапульты, сделайте его movieclipoм (F8),назовите его catapultarm и убедитесь что его linkage catapultarm.

Нажимаем на спусковой механизм и в меню properties (параметры) указываем instance name - arm. Теперь поместим его на нужную позицию. Поместите спусковой механизм так, чтобы его позиция по x и y была 0 (чёрный крестик должен быть на верху катапульты)
Дальше будем рисовать колёса. Нам понадобиться только одно колесо т.к второе будет копия первого. Нарисуйте колесо > F8 > Movie Clip и назовите catapultwheel. Скопируйте колесо и расставьте всё по позициям (одно колесо вперёд другое назад). Заднему колесу дадим instance name - backwheel, переднему frontwheel. Теперь катапульта полностью готова. Вернитесь на главную сцену и удалите мувик катапульты.

Урок "Катапульта"
Шаг 2

Теперь пришло время для создания травы. Нарисуй траву, чтобы её ширина была равна ширине сцены, и высота была одинаковой как слева, так и справа. Выделите траву и создайте её копию. Переместите ее в правую часть первой копии. Выберите всю траву > F8 > Movie Clip и назовите floor. Установите instance name - floor.
Урок "Катапульта"
Шаг 3

На очереди кнопка запуска. Рисуем её и превращаем в мувик, имя launchbutton. Проверьте, чтобы linkage был таким же. Далее удаляем её с главной сцены и открываем её двойным щелчком в библиотеке.
Теперь нам нужен регулировщик высоты.
Рисуем прямоугольник и высотой 30 и длинной 100. Превращаем в мувик . Имя, linkage и instance name - highorlong. Внутри этого мувика кликнем на 43 кадр и вставляем кадр (правый клик на 43 кадре и выбираем insert frame)
Создаём новый слой, размещаем его выше предыдущего. Рисуем белый прямоугольник высотой 5 и длинной 30. Превращаем в мувик. Имя, linkage и instance name - highorlongslider. Клик на кадре 23 и создаём новый кадр.Двигаем его на 97.5 по y. Создаём 43 кадр. Двигаем объект на 0 по y. На кадрах 1, 23 и 43 создаём motion tween.

 
Шаг 4

Рисуем вентилятор, батут и снаряд. Превращаем в мувики с именами fan, trampoline и projectile соответственно. Точки регистрации батута и вентилятора - нижний левый угол, у снаряда центр.
Далее удаляем эти объекты со сцены (единственный объект на сцене это трава)

Урок "Катапульта"
Шаг 5

Рисуем static текст с надписью "Game Over", ниже ещё один с надписью "очки". Далее рисуем один dynamic текст и устанавливаем instance name на score (здесь буду отображаться очки)
Далее создаём текст с надписью "Заново" и переводим в кнопку (F8 > BUTTON) даём instance name - replay. Выделяем это всё, превращаем в movieclip, называем losescreen с linkage - losescreen.

 
В верхнем левом углу создаём статический текст с надписью "Рекорд" и динамический с параметром var равным bestdist. Тоже самое делаем и в правом углу, надпись заменяем на "Расстояние", а var на dist.

Шаг 6

Далее кликнем на первом кадре, жмём f9 и пишем скрипт.

 CODE 

// Это массив для хранения имен всех созданных объектов (батуты, вентиляторы)
var objectArray:Array = new Array();
//Приравниваем к нулю число объектов
var objectcount = 0;
//Устанавливаем расстояние, которое пролетел снаряд на ноль
var distance:Number = 0;
//Функция которая будет начинать новую игру
function newGame() {
//удаляем все объекты от прошлой игры
for (var i = 0; i<objectArray.length; i++) {
 removeMovieClip(objectArray[i].toString());
}
//Очищаем массив объектов
objectArray = [];
//Если снаряд уже был выстрелян, удаляем его
if (projectile) {
 removeMovieClip("projectile");
}
//Выхываем функцию создания катапульты 
createCatapult();
}
//Вызываем функцию начала игры 
newGame();
//Функция создания катапульты
function createCatapult() {
//Если катапульта уже существует удаляем
if (catapult) {
 removeMovieClip("catapult");
}
//Создаём новую катапульту 
this.attachMovie("catapult","catapult",this.getNextHighestDepth(),{_x:-60, _y:250});
//Добавляем катапульту в список объектов
objectArray.push("catapult");
//Эта функция будет двигать катапульту , покуда она не достигнет нужной позиции
catapult.onEnterFrame = function() {
 //Двигаем катапульту на 2px вправо
 catapult._x += 2;
 //вращаем переднее колесо
 catapult.frontwheel._rotation += 5;
 //вращаем заднее колесо
 catapult.backwheel._rotation += 5;
 //Если катапульта достигла нужной позиции, заряжаем катапульту
 if (catapult._x>130) {
  //Вызываем функцию заряда катапульты
  loadCatapult();
 }
};
}
//Эта функция заряжает катапульту
function loadCatapult() {
//Удаляем предыдущую функцию, которая двигала катапульту
delete catapult.onEnterFrame;
//Создаём новую функцию, которая будет заряжать катапульту
catapult.onEnterFrame = function() {
 //Отводим спусковой механизм назад (заряжаем катапульту)
 catapult.arm._rotation -= 2;
 //Если он заряжен до предела, загружаем кнопку для спуска 
 if (catapult.arm._rotation<=-90) {
  //Вызываем функцию спуска 
  displayLaunchButton();
  //Удаляем функцию заряда катапульты
  delete catapult.onEnterFrame;
 }
};
}
//Функция спуска (запускает спусковой дисплей)
function displayLaunchButton() {
//Аттачим мувик для кнопки запуска
this.attachMovie("launchbutton","launchbutton",this.getNextHighestDepth(),{_x:80, _y:240});
//Когда кнопка запуска нажата, запускаем механизм выброса
launchbutton.onPress = function() {
 //запускаем механизм выброса
 releaseCatapult();
};
}
//Функция отвечает за механизм выброса
function releaseCatapult() {
//Обнуляем дистацию
distance = 0;
//Удаляем предыдущие onEnterFrame функции (если таковые имелись)
delete catapult.onEnterFrame;
//И создаём новую функцию для запуска катапульты
catapult.onEnterFrame = function() {
 //Поворачивает спусковой механизм на 15 градусов
 catapult.arm._rotation += 15;
 //Если он находиться в вертикальном положении, запускаем снаряд
 if (catapult.arm._rotation>=0) {
  //Останавливаем вращение
  delete catapult.onEnterFrame;
  //Выстреливаем снаряд
  fireProjectile();
 }
};
}
//Функция запуска снаряда
function fireProjectile() {
//Создаём новый снаряд на краю механизма запуска
this.attachMovie("projectile","projectile",this.getNextHighestDepth(),{_x:catapult._x, _y:catapult._y});
//Это начальная скорость полёта снаряда по x. Она определяется позицией по y белого слайдера
projectile.dx = launchbutton.highorlong.highorlongslider._y/5;
//Это начальная скорость полёта снаряда по y. Она определяется позицией по y белого слайдера
projectile.dy = 20-launchbutton.highorlong.highorlongslider._y/5;
//Удаляем кнопку запуска
launchbutton.removeMovieClip();
//Эта onEnterFrame функция запускается на главном уровне и двигает снаряд, а также другие объекты
onEnterFrame = function () {
 //Пересчитываем дистанцию, которую пролетел снаряд
 distance += projectile.dx;
 //Обновляем переменную, которая будет округлять дистанцию в меньшую сторону
 dist = Math.floor(distance);
 //Если текущее расстояние больше чем рекорд, обновляем рекорд
 if (dist>bestdist) {
  bestdist = dist;
 }
 //Вращаем снаряд на 2 градуса 
 projectile._rotation += 2;
 //Двигаем снаряд вправо
 projectile._x += projectile.dx;
 //Симулируем гравитацию. Увеличиваем скорость падения
 projectile.dy -= .2;
 //Двигаем снаряд по y в зависимости от скорости (y)
 projectile._y -= projectile.dy;
 //Если снаряд пролетел половину экрана двигаем его и объекты назад
 if (projectile._x>=Stage.width/2) {
  // Перемещаем объекты в зависимости от положения снаряда
  shiftObjects(Stage.width/2-projectile._x);
  //Двигаем снаряд в центр экрана
  projectile._x = Stage.width/2;
 }
 //Если снаряд коснётся земли, посылаем его вверх (делаем его прыгучим =) ) 
 if (projectile._y>Stage.height-20) {
  //Двигаем позицию по y к земле
  projectile._y = (Stage.height-20);
  //Замедляем и обращаем скорость по y (мячик будет отпрыгивать)
  projectile.dy *= -.7;
  //Замедляем скорость по x 
  projectile.dx *= .7;
 }
 //Задаём случайное число между 0 и 99 
 switch (Math.floor(Math.random()*100)) {
  //Если число = 0 создаём батут
  case 0 :
  //Считаем число батут
  trampcount = 0;
  for (var i = 0; i<objectArray.length; i++) {
  //если текущий объект в списке - батут, прибавляем число батутов в переменную
  if (objectArray[i].indexOf("trampoline") != -1) {
  trampcount++;
  }
  }
  //создаём батут, если их число меньше 3
  if (trampcount<3) {
  addObject("trampoline");
  }
  break;
  //Если число = 1 создаём вентилятор
  case 1 :
  //Отслеживаем в цикле , сколько вентиляторов в настоящее время на сцене
  fancount = 0;
  for (var i = 0; i<objectArray.length; i++) {
  //если текущий объект в списке - вентилятор , прибавляем число вентиляторов в переменную
  if (objectArray[i].indexOf("fan") != -1) {
  fancount++;
  }
  }
  //создаём вентилятор, если их число меньше 3
  if (fancount<3) {
  addObject("fan");
  }
  break;
 }
 //Отслеживаем в цикле объекты из массива, двигая каждый объект и удаляя объекты которые прошли через экран
 for (var i = 0; i<objectArray.length; i++) {
  //Если текущий объект прошёл за экран, удаляем его
  if (objectArray[i].toString())._x+objectArray[i].toString())._width<0) {
  //удаляем объект
  removeMovieClip(objectArray[i].toString());
  //и удаляем его из списка
  objectArray.splice(i,1);
  } else if (objectArray[i].indexOf("trampoline") != -1) {
  //Если снаряд на батуте увеличиваем его скорость по y
  if (projectile.hitTest(eval(objectArray[i].toString()))) {
  projectile.dy = Math.abs(projectile.dy*1.1);
  }
  } else if (objectArray[i].indexOf("fan") != -1) {
  //Если снаряд пролетает через вентилятор, увеличиваем его скорость по x
  if (projectile.hitTest(eval(objectArray[i].toString()))) {
  projectile.dx *= 1.1;
  }
  }
 }
 // Если снаряд движется менее одной десятой доли пикселя по X и Y оси, игрок проиграл
 if (Math.abs(projectile.dy)<0.1 && projectile.dx<0.1) {
  //останавливаем функцию игры и показываем экран результатов ( game over =))
  delete onEnterFrame;
  loseGame();
 }
};
}
//Добавляем объекты на экран
function addObject(inputObject) {
//Добавляем объект в список всех объектов
objectArray.push((inputObject)+(++objectcount));
//Аттачим объект
this.attachMovie(inputObject,(inputObject)+objectcount,this.getNextHighestDepth(),{_x:Stage.width+15, _y:Stage.height});
//Перемещаем объект поверх всех остальных
projectile.swapDepths(this.getNextHighestDepth());
}
//Перемещаем позицию по x каждого объекта в массиве
function shiftObjects(shiftdistance) {
//Перемещаем каждый объект в массиве
for (var i = 0; i<objectArray.length; i++) {
 eval(objectArray[i])._x += shiftdistance;
}
floor._x = (floor._x+shiftdistance)%(floor._width/2);
}
//Функция game over 
function loseGame() {
//Показываем результат игры
this.attachMovie("losescreen","losescreen",this.getNextHighestDepth(),{_x:Stage.width/2, _y:Stage.height/2});
//Обновляем очки
losescreen.score.text = Math.floor(distance);
//Если жмём кнопку "Заново", начинаем новую игру
losescreen.replay.onPress = function() {
 newGame();
 //Удаляем экран gameoverа
 removeMovieClip(losescreen);
};
}

Шаг 7 - радуемся и эксперементируем
еперь можно добавить функцию сохранения рекорда. Внесём пару строчек и всё готово. Вот конечный скрипт с моими коректировками
CODE 
// Эта переменная будет содержать в себе лучший результат
var record:SharedObject = SharedObject.getLocal("score");
// Если это первая игра, то рекорд = 0
if(record.data.score==undefined){
record.data.score=0}
// Иначе загружаем сохранённый рекорд
else{
bestdist=record.data.score
}
// Это массив для хранения имен всех созданных объектов (батуты, вентиляторы)
var objectArray:Array = new Array();
//Приравниваем к нулю число объектов
var objectcount = 0;
//Устанавливаем расстояние которое пролетел снаряд на ноль
var distance:Number = 0;
//Функция которая будет начинать новую игру
function newGame() {
//удаляем все объекты от прошлой игры
for (var i = 0; i<objectArray.length; i++) {
 removeMovieClip(objectArray[i].toString());
}
//Очищаем массив объектов
objectArray = [];
//Если снаряд уже был выстрелен, удаляем его
if (projectile) {
 removeMovieClip("projectile");
}
//Выхываем функцию создания катапульты 
createCatapult();
}
//Вызываем функцию начала игры 
newGame();
//Функция создания катапульты
function createCatapult() {
//Если катапульта уже существует удаляем
if (catapult) {
 removeMovieClip("catapult");
}
//Создаём новую катапульту 
this.attachMovie("catapult","catapult",this.getNextHighestDepth(),{_x:-60, _y:260});
//Добавляем катапульту в список объектов
objectArray.push("catapult");
//Эта функция будет двигать катапульту покуда она не достигнет нужной позиции
catapult.onEnterFrame = function() {
 //Двигаем катапульту на 2px вправо
 catapult._x += 2;
 //вращаем переднее колесо
 catapult.frontwheel._rotation += 5;
 //вращаем заднее колесо
 catapult.backwheel._rotation += 5;
 //Если катапульта достигла нужной позиции заряжаем катапульту
 if (catapult._x>130) {
  //Вызываем функцию заряда катапульты
  loadCatapult();
 }
};
}
//Эта функция заряжает катапульту
function loadCatapult() {
//Удаляем предыдущую функцию которая двигала катапульту
delete catapult.onEnterFrame;
//Создаём новую функцию которая будет заряжать катапульту
catapult.onEnterFrame = function() {
 //Отводим спусковой механизм назад (заряжаем катапульту)
 catapult.arm._rotation -= 2;
 //Если он заряжен до предела загружаем кнопку для спуска 
 if (catapult.arm._rotation<=-90) {
  //Вызываем функцию спуска 
  displayLaunchButton();
  //Удаляем функцию заряда катапульты
  delete catapult.onEnterFrame;
 }
};
}
//Вункция спуска (запускает спусковой дисплей)
function displayLaunchButton() {
//Аттачим мувик для кнопки запуска
this.attachMovie("launchbutton","launchbutton",this.getNextHighestDepth(),{_x:80, _y:240});
//Когда кнопка запуска нажата, запускаем механизм выброса
launchbutton.onPress = function() {
 //запускаем механизм выброса
 releaseCatapult();
};
}
//Функция отвечает за механизм выброса
function releaseCatapult() {
//Обнуляем дистацию
distance = 0;
//Удаляем предыдущие onEnterFrame функции (если таковые имелись)
delete catapult.onEnterFrame;
//И создаём новую для запуска катапульты
catapult.onEnterFrame = function() {
 //Поварачивает спусковой механизм на 15 градусов
 catapult.arm._rotation += 15;
 //Если он находиться в вертикальном положении запускаем снаряд
 if (catapult.arm._rotation>=0) {
  //Останавливаем вращение
  delete catapult.onEnterFrame;
  //Выстреливаем снаряд
  fireProjectile();
 }
};
}
//Функция запуска снаряда
function fireProjectile() {
//Создаём новый снаряд на краю механизма запуска
this.attachMovie("projectile","projectile",this.getNextHighestDepth(),{_x:catapult._x, _y:catapult._y});
//Это начальная скорость полёта снаряда по x. Она определяеться позицией по y белого слайдера
projectile.dx = launchbutton.highorlong.highorlongslider._y/5;
//Это начальная скорость полёта снаряда по y. Она определяеться позицией по y белого слайдера
projectile.dy = 20-launchbutton.highorlong.highorlongslider._y/5;
//Удаляем кнопку запуска
launchbutton.removeMovieClip();
//Эта onEnterFrame функцимя запускается на главном уровне и двигает снаряд, а также другие объекты
onEnterFrame = function () {
 //Пересчитываем дистанцию которую пролетел снаряд
 distance += projectile.dx;
 //Обновляем переменную, которая будет округлять дистанцию в меньшую сторону
 dist = Math.floor(distance);
 //Вращаем снаряд на 2 градуса 
 projectile._rotation += 2;
 //Двигаем снаряж вправо
 projectile._x += projectile.dx;
 //Симулируем гравитацию. Увеличиваем скорость падения
 projectile.dy -= .2;
 //Двигаем снаряд по y в зависимости от скорости (y)
 projectile._y -= projectile.dy;
 //Если снаряд пролетел половину экрана двиггаем его и объекты назад
 if (projectile._x>=Stage.width/2) {
  // Перемещаем объекты в зависимости от положения снаряда
  shiftObjects(Stage.width/2-projectile._x);
  //Двигаем снаряд в центр экрана
  projectile._x = Stage.width/2;
 }
 //Если снаряд коснётся земли, посылаем его вверх (делаем его прыгучим =) ) 
 if (projectile._y>Stage.height-20) {
  //Двигаем позицию по y к земле
  projectile._y = (Stage.height-20);
  //Замедляем и обращаем скорость по y (мячик будет отпрыгивать)
  projectile.dy *= -.7;
  //Замедляем скорость по x 
  projectile.dx *= .7;
 }
 //Задаём случайное число между 0 и 99 
 switch (Math.floor(Math.random()*100)) {
  //Если число = 0 создаём батут
  case 0 :
  //Считаем число батутов
  trampcount = 0;
  for (var i = 0; i<objectArray.length; i++) {
  //если текущий объект в списке - батут , прибавляем число батутов в переменную
  if (objectArray[i].indexOf("trampoline") != -1) {
  trampcount++;
  }
  }
  //создаём батут, если их число меньше 3
  if (trampcount<3) {
  addObject("trampoline");
  }
  break;
  //Если число = 1 создаём вентилятор
  case 1 :
  //Отслеживаем в цикле , сколько вентиляторов в настоящее время на сцене
  fancount = 0;
  for (var i = 0; i<objectArray.length; i++) {
  //если текущий объект в списке - вентилятор , прибавляем число вентиляторов в переменную
  if (objectArray[i].indexOf("fan") != -1) {
  fancount++;
  }
  }
  //создаём вентилятор, если их число меньше 3
  if (fancount<3) {
  addObject("fan");
  }
  break;
 }
 //Отслеживаем в цикле объекты из массива, двигая каждый каждый объект и удаляя объекты которые прошли через экран
 for (var i = 0; i<objectArray.length; i++) {
  //Если текущий объект прошол за экран удаляем его
  if (objectArray[i].toString()._x+objectArray[i].toString()._width<0) {
  //удаляем объект
  removeMovieClip(objectArray[i].toString());
  //и удаляем его из списка
  objectArray.splice(i,1);
  } else if (objectArray[i].indexOf("trampoline") != -1) {
  //Если снаряд на батуте увеличиваем его скорость по y
  if (projectile.hitTest(eval(objectArray[i].toString()))) {
  projectile.dy = Math.abs(projectile.dy*1.1);
  }
  } else if (objectArray[i].indexOf("fan") != -1) {
  //Если снаряд на пролетает через вентилятор увеличиваем его скорость по x
  if (projectile.hitTest(eval(objectArray[i].toString()))) {
  projectile.dx *= 1.1;
  }
  }
 }
 // Если снаряд движется менее одной десятой доли пикселя по X и Y оси, игрок проиграл
 if (Math.abs(projectile.dy)<0.1 && projectile.dx<0.1) {
  //останавливаем функцию игры и показываем экран проигрыша( game over =))
  delete onEnterFrame;
  loseGame();
 }
};
}
//Добавляем объекты на экран
function addObject(inputObject) {
//Добавляем объект в список всех объектов
objectArray.push((inputObject)+(++objectcount));
//Аттачим объект
this.attachMovie(inputObject,(inputObject)+objectcount,this.getNextHighestDepth(),{_x:Stage.width+15, _y:Stage.height});
//Перемещаем объект поверх всех остальных
projectile.swapDepths(this.getNextHighestDepth());
}
//Перемещаем позицию по x каждого объекта в массиве
function shiftObjects(shiftdistance) {
//Перемещаем каждый объект в массиве
for (var i = 0; i<objectArray.length; i++) {
 eval(objectArray[i])._x += shiftdistance;
}
floor._x = (floor._x+shiftdistance)%(floor._width/2);
}
//Функция game over 
function loseGame() {
//Показываем результат игры
this.attachMovie("losescreen","losescreen",this.getNextHighestDepth(),{_x:Stage.width/2, _y:Stage.height/2});
//Обновляем очки
 //Если текущее расстояние больше чем рекорд, обновляем рекорд
 if (dist>bestdist) {
  //обновляем рекорд
  bestdist = dist;
  //выводим надпись о новом рекорде
  losescreen.score.text = "Новый рекорд!!: "+ Math.floor(distance);
  // сохраняем рекорд
  record.data.score=dist
  
  
 }
 //Если рекорд не побит, просто показываем очки и предлагаем переиграть
else{losescreen.score.text ="Ваш результат: "+ Math.floor(distance);

}
//Если жмём кнопку "Занаво", начинаем новую игру
losescreen.replay.onPress = function() {
 newGame();
 //Удаляем экран gameoverа
 removeMovieClip(losescreen);
};
}



Внимание! Вы находитесь на сайте как гость! Зарегистрируйтесь или авторизируйтесь...

Нет времени на регистрацию? Можете войти на сайт через ВКонтакте! Это просто, быстро и удобно!

Похожие материалы

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.