Снежок «funkSnow». Урок для Adobe Flash CS6. |
code:
package com{
import flash.display.Bitmap;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
/**
* ...
* @author MOHCTEP
*/
[SWF(width=800, height=600, backgroundColor=0x445566)]
public class Main extends Sprite {
//Импорт фоновой картинки
[Embed(source = "../../lib/Photo1.jpg")]
private var bg_img:Class;
public function Main():void {
stage?init():addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
addChild(new bg_img() as Bitmap);//Вставим импортированную картинку, как фон.
// entry point
//Добавим 800 снежинок с дефолтными параметрами, прямо на сцену
for (var i:int = 0; i < 1000; i++) {
addChild(new SnowFlake());
}
//Подпишемся на событие перемещения мыши
stage.addEventListener(MouseEvent.MOUSE_MOVE, collision);
}
/**
* По движению мыши, сообщим снегу о коллизии.
* @param e - MouseEvent.MOUSE_MOVE
*/
private function collision(e:MouseEvent):void {
dispatchEvent(new Event('collision'));
}
}
}
code:
package com {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.geom.Point;
import flash.geom.Rectangle;
/**
* ...
* @author MOHCTEP
* @version:
* @created: 07.11.2014 21:51
* @description:
* SnowFlake - Пугливая снежинка :)
* com.SnowFlake
*/
public class SnowFlake extends Sprite {
private var areaSize:Point;//Размеры области распространения снега.
private var speed:Point;//Скорость и направление полета снежинки.
private var collision:Point;//Направление и величина силы возмущения.
private var distance_of_collision_sensitivity:Number;
//Максимальная дистанция до очага возмущения, при которой снежинка еще ему подвержена.
private var flake:Bitmap;//Ссылка на картинку снежинки. Это может быть MovieClip,Bitmap...
//Необходима лишь для корректного удаления, возможно зависимого от типа.
private var flakeSize:int;//максимальный 100% размер снежинки
/**
* Конструктор.
* 2 необязательных аргумента
* @param areaSize - размер области занимаемой снегом. Если аргумента нет, то область примет размер проекта.
* @param flakeSize - максимальный 100% размер снежинки. По умолчанию = 20 пикселей.
*/
public function SnowFlake(areaSize:Point=null, flakeSize:int=20) {
this.flakeSize = flakeSize;
this.areaSize = areaSize;
stage?init():addEventListener(Event.ADDED_TO_STAGE, init);
}
/**** PRIVATE SECTION ****/
/**
* Обновление параметров снежинки, при создании ее или выходе за пределы допустимой области areaSize.
* fly_angle - случайный угол полета снежинки в радианах. Здесь, в пределах +-45 градусов от вертикали.
* Масштабируем снежинку в в пределах 30 - 100% от исходного размера.
* Скорость полета делаем пропорциональной масштабу для придания некой перспективы. Разложим ее на вектора и запомним их в объекте speed.
* Новорожденной снежинке - никаких возмущений.
* Ставим снежинку равномерно-случайно по горизонтали и выше области.
*/
private function renewFlake():void {
var fly_angle:Number = Math.random() * Math.PI / 2 + Math.PI / 4;
scaleX = scaleY = .3 + Math.random() * .7;
speed = new Point(Math.cos(fly_angle) * 3 * scaleX, Math.sin(fly_angle) * 3 * scaleX);
collision = new Point();
x = width + (areaSize.x - width * 2) * Math.random();
y = -height - 1;
}
/**** LISTENERS SECTION ****/
/**
* Инициализация снежинки.
* Здесь установим некоторые переменные.
* Затем нарисуем снежинку, как размытый белый кружок.
* Вместо этого, можно вставить какую-то картинку.
* Ставим снежинку, со случайными свойствами, в случайное место, в пределах области areaSize.
* Запускаем ее полет и реакцию на возмущения
* @param e - Event.ADDED_TO_STAGE
*/
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
addEventListener(Event.REMOVED_FROM_STAGE, destroyer);
// entry point
//Разбираемся с областью areaSize. Если в конструктор ничего не передано, то делаем область размером со сцену.
areaSize = areaSize?areaSize:new Point(stage.stageWidth, stage.stageHeight);
//"Чувствительная" дистанция = 10% от наибольшего из размеров области.
distance_of_collision_sensitivity = Math.max(areaSize.x, areaSize.y) / 10;
/**
* Рисуем снежинку. У меня это - размытый белый кружок, размером flakeSize х flakeSize пикселей.
* Вы же можете нарисовать что-то свое или импортировать картинку или анимацию
*/
addChild(flake = new Bitmap(new BitmapData(flakeSize, flakeSize, true, 0)));
flake.smoothing = true;
//Рисуем белый квадрат посередине битмапдаты
var square_size:int = int(flakeSize / 2.5), square_border:int = int(flakeSize-square_size) / 2;
flake.bitmapData.fillRect(new Rectangle(square_border, square_border, square_size, square_size), 0xFFFFFFFF);
//И превращаем его в размытый кружок
flake.bitmapData.applyFilter(flake.bitmapData, flake.bitmapData.rect, new Point(), new BlurFilter(square_border, square_border, 3));
//Зададим снежинке уникальные размер, направление и скорость полета.
renewFlake();
//И поставим ее в случайное место в пределах области
y = height + (areaSize.y - height * 2) * Math.random();
//Разрешим снежинке лететь
addEventListener(Event.ENTER_FRAME, moveMe);
//и реагировать на возмущения.
parent.addEventListener('collision', collisionHandler);
}
/**
* Перемещение снежинки
* @param e - Event.ENTER_FRAME
*/
private function moveMe(e:Event):void {
//Меняем расположение снежинки с учетом скорости, направления полета и воздействия силы возмущения.
x += speed.x + collision.x;
y += speed.y + collision.y;
//Постепенно уменьшаем воздействие возмущения на снежинку
collision.x *= .9;
collision.y *= .9;
//Если снежинка недопустимо вылетела за допустимые пределы, обновим ее и запустим в полет заново.
if (x < -width || x > areaSize.x || y > areaSize.y || y < -height * 2) {
renewFlake();
}
//Если сила возмущения уменьшилась до пренебрежимой, обнулим ее, чтоб не возиться с лишней плавающей точкой
//и разрешим снежинке опять реагировать на возмущения.
if (Point.distance(new Point(),collision)<1) {
collision = new Point();
parent.addEventListener('collision', collisionHandler);
}
}
/**
* Реакция на коллизию.
* @param e - Event('collision')
*/
private function collisionHandler(e:Event):void {
if (e.target != parent) return;//Если источник возмущения не "наш", то и не реагируем
//Расстояние до источника возмущения (курсора, в нашем случае)
var collision_distance:Number = Point.distance(new Point(parent.mouseX, parent.mouseY), new Point(x, y));
//Если это расстояние превышает максимальную дистанцию чувствительности, то снова проходим мимо...
if (collision_distance >= distance_of_collision_sensitivity) return;
//Сила воздействия обратно пропорциональна расстоянию до центра возмущения
var collision_force:Number = (1 - collision_distance / distance_of_collision_sensitivity) * 2;
//Направление (угол) вектора возмущения
var collision_angle:Number = Math.atan2((y - parent.mouseY), (x - parent.mouseX));
collision = new Point();
//Разложим вектор возмущения по осям, с учетом его направления и силы
collision.x = Math.cos(collision_angle) * collision_force * distance_of_collision_sensitivity;
collision.y = Math.sin(collision_angle) * collision_force * distance_of_collision_sensitivity;
//Запретим на некоторое время "возмущенной" снежинке реагировать на коллизии. Пусть полетает по своей кривой дорожке...)
parent.removeEventListener('collision', collisionHandler);
}
/**
* Корректное харакири, после удаления со сцены
* @param e - Event.REMOVED_FROM_STAGE
*/
private function destroyer(e:Event):void {
removeEventListener(Event.REMOVED_FROM_STAGE, destroyer);
// remove all listeners, displayObjects, etc...
removeEventListener(Event.ENTER_FRAME, moveMe);
parent.removeEventListener('collision', collisionHandler);
//flake у нас - Bitmap. Поступаем с ним соответствующе.
flake.bitmapData.dispose();
while (numChildren) removeChildAt(0);
}
}
}
Серия сообщений "Уроки Flash":уроки в разных флешпрограммах, авторские уроки flash
Часть 1 - Делаем элементарные часики.Начинаем учиться созданию flash.
Часть 2 - Как правильно записать код флешки или видео в рамочку для кодов.
...
Часть 37 - Снегопад с блёстками. Урок для Adobe Flash.
Часть 38 - Флеш эффект движения картинок. Флеш галерея «Photo Stack Gallery».
Часть 39 - Снежок «funkSnow». Урок для Adobe Flash CS6.
Серия сообщений "Флешки Новогодние":
Часть 1 - Флешинформер "До Нового Года осталось..."
Часть 2 - Создаем флешки в программе Aleo Flash Intro Banner Maker.Часть первая.
...
Часть 18 - Календарики в зимнем дизайне.
Часть 19 - Флеш эффект движения картинок. Флеш галерея «Photo Stack Gallery».
Часть 20 - Снежок «funkSnow». Урок для Adobe Flash CS6.
Рубрики: | уроки |
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |