-Рубрики

 -Поиск по дневнику

Поиск сообщений в Jorjorych

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 11.07.2013
Записей: 1657
Комментариев: 21887
Написано: 29188


Снегопад с прилипанием снега

Пятница, 24 Октября 2014 г. 21:54 + в цитатник
Цитата сообщения ВАТ

Как я делала урок "Снегопад с прилипанием снега"
 



Мои пояснения к уроку.

!. Создайте новый документ AS3 с нужными размерами (у меня 700 на 500), с частотой кадров =25. Напишите основной класс Main и сохраните его в папке под названием, например, Снегопад (файл - сохранить как...)
2014-10-23_22h35_24 (600x418, 40Kb)

2. Нарисуйте несколько снежинок в программе или импортируйте их в библиотеку (я нарисавала 4 снежинки в фотошопе, применила тиснение и глянец). Перетащите их по очереди на сцену, выделите, измените размер (если нужно), выровняйте по центру
2014-10-24_11h38_30 (256x309, 17Kb)
и преобразуйте её в символ (это можно сделать так: а) нажать F8; б) Модификация - Преобразовать в символ; в) нажать правой клавишей на снежинку и в открывшемся окне нажать на Преобразовать в символ) с именем flake0, поставьте галочку в Экспорт для ActionScript
2014-10-23_23h05_07 (600x476, 41Kb)
Появится окно, нажмите ок
2014-10-23_23h12_46 (510x162, 17Kb)
Удалите символ со сцены. Так проделайте со всеми снежинками и присвойте flake1; flake2; flake3 и т.д. столько сколько будет у вас снежинок и не забудьте ставить галочки в Экспорт для ActionScript.
3. Создайте объект к которому будет прилипать снег, это может быть что угодно (автор взял текст), превратите его в символ (клип) с точкой регистрации в верхнем левом углу, дайте имя headTxt и поставьте галочку в Экспорт для ActionScript (как в снежинках), после чего удалите символ со сцены (если возьмёте текст, то не забудьте поставить динамический и внедрить шрифт).
2014-10-24_11h58_35 (400x307, 32Kb)
4. Перетащите на сцену картинку (или нарисуйте как в уроке что-нибудь где будет идти снег. Я взяла гогтовую картинку), превратите его в символ с точкой регистрации в левом верхнем углу, с именем и классом content (как снежинки и текст).
5. Создайте и сохраните в папке с проектом (Снегопад) 2 пустых as. файла, один назовите Main.as (это главный класс) и Flake.as (класс снежинок). Файл - Создать
2014-10-24_01h05_12 (366x191, 17Kb)
2014-10-23_23h38_391 (500x303, 20Kb)
6. Вставить в Flake.as код (описание кода почитайте в уроке)

package {
import flash.display.*;
import flash.events.*;
import flash.utils.*;
//Импортируем нужные пакеты
public class Flake extends Sprite {
//Объявление класса
private var sn:MovieClip;
//Ссылка на клип снежинки
private var ymax:Number;
//Высота документа
private var x0:Number;
//Стартовая х-координата снежинки
private var speed:Number;
//Скорость движения (величина задержки таймера)
private var angle:Number;
//Угол. Его проецируем на траекторию движения
private var scale:Number;
//Массштаб снежинки
private var tim:Timer;
//Таймер
private var targ:MovieClip;
//Ссылка на объект, к которому снежинка прилипает
private var movingFlag:int;
//Разрешение/Запрет движения
private var stopDelay:Number
//Продолжительность прилипания снежинки
//Конструктор. Аргументом является клип снежинки
public function Flake(arg:MovieClip):void {
//Запомним и кэшируем аргумент
sn=arg;
sn.cacheAsBitmap=true;
//Дефолтные установки для переназначаемых переменных
speed=100;
angle=0;
scale=1;
movingFlag=1;
//Снежинку – в дисплей список.
addChild(sn);
//Создание таймера
tim=new Timer(speed);
//События.
// Экземпляр класса добавлен на сцену
addEventListener(Event.ADDED_TO_STAGE, init);
//Отработал очередной интервал таймера
tim.addEventListener(TimerEvent.TIMER, moving);
}
//Эти методы (сеттеры) позволяют установить нужные свойства класса извне.
// Установка новой задержки таймера (скорости движения)
public function set _speed(arg:Number):void {
speed=arg;
tim.delay=speed;
stopDelay=speed;
}
//Угол
public function set _angle(arg:Number):void {
angle=arg;
}
//Массштаб
public function set _scale(arg:Number):void {
scale=arg;
this.scaleX=this.scaleY=scale;
}
// Целевой объект прилипания
public function set _target(arg:MovieClip){
targ=arg;
}
//Слушатели событий
/*Эта функция вызовется единожды, когда экземпляр класса будет добавлен на сцену.
Здесь выясним высоту документа, начальную х-координату и, запустив таймер, начнем движение.*/
private function init(e:Event) {
ymax=stage.stageHeight;
x0=this.x;
tim.start();
}
/* Функция перемещения снежинки. Вызывается с каждым интервалом таймера
Двигаем снежинку, следим за пересечением с целевым объектом, прилипаем и отлипаем*/
private function moving(e:TimerEvent) {
/*Ось у. Если снежинка опустилась за пределы документа, переставим ее вверх, иначе опускаем с постоянной скоростью. Когда movingFlag=0, движение остановится*/
this.y>ymax?this.y=-10:this.y+=2*movingFlag;
/*Ось х. Вычисляем приращение, основанное на синусе угла, прибавляем его к стартовой координате и перемещаем объект по горизонтали*/
this.x=x0+Math.sin(angle/180*Math.PI)*80;
//Циклично меняем значение угла
angle+=scale*2*movingFlag;
angle%=360;
/*Если задан целевой объект, то проверим пересечение с ним.
Если пересечение есть, то остановим движение*/
targ==null?null:targ.hitTestPoint(this.x, this.y, true)?movingFlag=0:movingFlag=1;
/*Если движение остановлено, уменьшаем счетчик паузы. Когда счетчик обнулится,
возобновим движение, а счетчик обновим */
!movingFlag?stopDelay?stopDelay--:movingFlag=1:stopDelay=speed;
}
}
}
7. Файл - Сохранить как...

2014-10-24_01h18_06 (600x524, 63Kb)

Класс Flake.as готов. Чтобы проверить его, в файле Main.as, вставьте этот код:

package{
import flash.display.*;
public class Main extends Sprite{
public function Main():void{
var sn:Flake=new Flake(new flake0());
sn.x=200;
sn.y=10;
addChild(sn)
}
}
}

Протестируйте ролик. Если вы увидите одинокую снежинку, падающую по синусоиде, то вы всё сделали правильно, можно продолжать дальше, а этот код из Main.as удалить .
8. Теперь заменим код в главный класс документа Main.as (как, что и для чего почитайте в уроке) следующим: 
 
package{
import flash.display.*;
import flash.utils.*;
import flash.events.*;
import flash.geom.*;
import flash.filters.*;
// Импортируем нужные пакеты
public class Main extends Sprite{
//Объявление класса
 private var total:int;
//Кол-во снежинок
private var lastFlakeNumber:int;
//Последний номер снежинки в библиотеке
 private var w:int;
 private var h:int;
//Размеры проекта
 private var snowHolder:Sprite;
//Контейнер пролетающего снега
 private var snowStickyHolder:Sprite;
//Контейнер прилипающего снега
 private var headHolder:Sprite;
//Контейнер предмета и "сугроба"
 private var header:MovieClip;
//Предмет засыпаемый снегом
 private var snowHead:Bitmap;
//Битмап "сугроба"
 private var maskBD:BitmapData;
//Маска сугроба
 private var snowBD:BitmapData;
//БД для текущих снимков снегопада
 private var matr:Matrix;
//Координатор снимков снегопада
 private var tim:Timer;
//Таймер запуска снимка
 private var speed:Number;
//Задержка таймера
 private var snowWeight:Number;
//Отступы на толщину сугроба в БД
//Конструктор класса. Определим размеры документа и перейдем к стартовым установкам
 public function Main():void{
  w=stage.stageWidth;
  h=stage.stageHeight;
  init();
 }
/*Инициализация. Определяем переменные, расставляем на нужные уровни контейнеры и содержимое.
Создаем маску, таймер и командуем создание снегопада*/
 private function init():void{
  speed=300;
  total=150;
  snowWeight=30;
lastFlakeNumber=2;
headHolder = new Sprite();
snowHead = new Bitmap();
  snowHolder = new Sprite();
snowStickyHolder = new Sprite();
//Фоновая картинка
  var cont:content = new content();
//Класс заснеженного предмета. Сразу его отцентрируем   
  header = new headTxt() as MovieClip;
  header.x=header.y=snowWeight;
//Разборка по уровням. Вначале – фон.   
  addChild(cont);
// Потом контейнер предмета
  addChild(headHolder);
//В этот контейнер – предмет и сугроб
  headHolder.addChild(header);
  headHolder.addChild(snowHead);
//Теперь контейнер прилипающего снега
  addChild(snowStickyHolder);
//И контейнер пролетающего снега
  addChild(snowHolder);
//Предмет ставим на нужное место на сцене
  headHolder.x=10;
  headHolder.y=30;
//Создадим матрицу с настройкой на расположение контейнера предмета
  matr=new Matrix();
  matr.tx=- headHolder.x;
  matr.ty=- headHolder.y;
//Создадим битмапдаты. 
//Сугроба. Ее сделаем видимой
  var bd:BitmapData=new BitmapData(header.width+snowWeight*2,header.height+snowWeight*2,true,0);
snowHead.bitmapData=bd;
//Снегопада
  snowBD=bd.clone();
//Маски сугроба
  maskBD=bd.clone();
//Скопируем предмет в БД, с зазорами размером с snowWeight
  bd.draw(header,new Matrix(1,0,0,1,snowWeight,snowWeight));
// Размоем копию снимка в БД маски
  var bf:BlurFilter = new BlurFilter(8,16,3);
  maskBD.applyFilter(bd,bd.rect,new Point(0,0),bf);
//Подправим цветовой диапазон.   
  var trans:ColorTransform = new ColorTransform(16,16,16,3,0,0,0,0);
  maskBD.colorTransform(maskBD.rect,trans);
//Объявим таймер и "привяжем" к нему слухача
  tim=new Timer(speed);
  tim.addEventListener(TimerEvent.TIMER, animate);
//Творим снегопад. Аргументом передаем засыпаемый предмет.
  generate(header);
 }
/*Генератор снега. В каждой итерации цикла рандомно выбирается одна из библиотечных снежинок.
Наделим ее случайными координатами, масштабом, скоростью и углом вылета.
Половине снежинок назначим целью предмет и сделаем их прилипающими, другая половина будет пролетать мимо.
Таким же образом распределим их по контейнерам.
Стартуем таймер*/
 private function generate(arg:MovieClip):void{
  for(var i:int=0; i<total; i++){
   var s:*=getDefinitionByName('flake'+rNum(0, lastFlakeNumber));
   var sn:Flake=new Flake(new s());
   sn.x=rNum(20,w-20);
   sn.y=rNum(-10,h-20);
   sn._scale=rNum(.3,1.5,2);
   sn._speed=rNum(10,40);
   sn._angle=rNum(0,180);
   i%2?sn._target=arg:null;
   i%2?snowStickyHolder.addChild(sn):snowHolder.addChild(sn);
  }
  tim.start();
 }
/*Чуть доработанный рандомайзер. Первые 2 параметра – обязательны и определяют
диапазон результата. 3 необязательный параметр – кол-во знаков после запятой. Без него получим целочисленный результат*/
 private function rNum(min:Number, max:Number, exp:int=0):Number{
  var decPt:Number=Math.pow(10,exp);
  var n:Number=min+Math.random()*(max-min);
  return Math.round(n*decPt)/decPt;
 }
/*Функция вызывается таймером и меняет рисунок сугроба, соответственно снегопаду*/
 private function animate(e:TimerEvent){
//Текущий снимок снегопада в районе предмета
  snowBD.draw(snowStickyHolder,matr,null,null,null,true);
//Копируем его в БД сугроба с применением маски
  snowHead.bitmapData.copyPixels(snowBD,snowBD.rect,new Point(0,0),maskBD, new Point(0,0),true);
//Чистим БД текущего снимка
  snowBD.fillRect(snowBD.rect,0);
//Делаем БД сугроба чуть прозрачнее.
  var trans:ColorTransform = new ColorTransform(1,1,1,1,0,0,0,-4);
  snowHead.bitmapData.colorTransform(snowHead.bitmapData.rect, trans);
 }
 //
}
}

Взять его можно отсюда Вложение

10. Файл - Сохранить как...

2014-10-24_03h03_30 (600x441, 80Kb)
2014-10-24_03h05_30 (625x480, 65Kb)

Протестируйте ролик. Сохраните в fla (файл - сохранить как...) и в swf (файл - экспорт - экспортировать ролик). Вот и всё.

Если  ничего не пропустили и не перепутали - будет работать! Проверил!

Рубрики:  Уроки/Уроки флеш
Уроки/Adobe Flash
Метки:  
Понравилось: 3 пользователям

Татьяна_Волкова_Литвинова   обратиться по имени Пятница, 24 Октября 2014 г. 22:02 (ссылка)
Георгий! Верочка молодчина, такой урок написала! Это для знатоков, но не для двоечников, к которым отношу себя. Жду работу от отличника!
Ответить С цитатой В цитатник
Перейти к дневнику

Пятница, 24 Октября 2014 г. 22:13ссылка
Посмотри у меня цитату урока Веры: я открыл код = Main =.А там возьми и повторяй действия по уроку. Не получится что-то , я тут!
Перейти к дневнику

Пятница, 24 Октября 2014 г. 22:17ссылка
Сейчас посмотрю! Спасибо.
Нина_Гуревич   обратиться по имени Суббота, 25 Октября 2014 г. 11:07 (ссылка)
СПАСИБО
Ответить С цитатой В цитатник
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку