※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!
wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)
風が吹くようななにか forked from: 風が吹くようななにか
- // forked from soundkitchen's 風が吹くようななにか
- /**
- * Graphics 使って高速化してみたよ。
- */
- package
- {
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.BlendMode;
- import flash.display.Graphics;
- import flash.display.Shape;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.geom.Point;
- import flash.geom.Rectangle;
- import net.hires.debug.Stats;
- [SWF(frameRate=60, width=465, height=465, backgroundColor=0x000000)]
- public class Main extends Sprite
- {
- private var _canvas:Shape;
- private var _film:BitmapData;
- private var _rect:Rectangle;
- private var _particles:Vector.<Particle>;
- private var _mouseDowned:Boolean;
- public function Main()
- {
- addEventListener(Event.ADDED_TO_STAGE, initialize);
- }
- private function initialize(evt:Event):void
- {
- removeEventListener(evt.type, arguments.callee);
- _particles = new Vector.<Particle>();
- _canvas = new Shape();
- _rect = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
- _film = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0);
- addChild(new Bitmap(_film));
- addChildAt(new Stats(), 0);
- addEventListener(Event.ENTER_FRAME, step);
- stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
- stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
- }
- private function step(evt:Event):void
- {
- var i:int,
- l:int,
- p:Particle,
- m:Point,
- g:Graphics;
- if (_mouseDowned)
- {
- for (i=0; i<5; i++)
- {
- addParticle();
- }
- }
- g = _canvas.graphics;
- g.clear();
- l = _particles.length;
- for (i=0; i<l; i++)
- {
- p = _particles[i];
- p.update();
- g.beginFill(0xDFFE9E, p.alpha);
- for each (m in p.points)
- {
- if (m == p.points[0])
- {
- g.moveTo(p.x + m.x, p.y + m.y);
- }
- else
- {
- g.lineTo(p.x + m.x, p.y + m.y);
- }
- }
- g.endFill();
- if (p.alpha <= 0 || !_rect.contains(p.x, p.y))
- {
- _particles.splice(i--, 1);
- l--;
- }
- }
- _film.lock();
- _film.fillRect(_film.rect, 0);
- _film.draw(_canvas, null, null);
- _film.unlock();
- }
- private function addParticle():void
- {
- _particles.push(new Particle(mouseX, mouseY));
- }
- private function mouseDownHandler(evt:MouseEvent):void
- {
- _mouseDowned = true;
- }
- private function mouseUpHandler(evt:MouseEvent):void
- {
- _mouseDowned = false;
- }
- }
- }
- import flash.geom.Point;
- class Particle
- {
- // TODO: remove such a poor code.
- public static const FRAME_RATE:int = 60;
- public static const WIND:Number = 9;
- public static const GRAVITY:Number = -3;
- // declared each rect positions.
- private static var P1:Point = new Point(-5, -2);
- private static var P2:Point = new Point(5, -2);
- private static var P3:Point = new Point(5, 2);
- private static var P4:Point = new Point(-5, 2);
- private static var DEFAULT_POINTS:Array = [P1, P2, P3, P4];
- public var points:Vector.<Point>;
- public var x:Number;
- public var y:Number;
- public var alpha:Number;
- private var _vx:Number;
- private var _vy:Number;
- private var _tick:uint;
- public function Particle(x:Number, y:Number)
- {
- this.x = x;
- this.y = y;
- this.alpha = 1;
- this.points = new Vector.<Point>(4, true);
- var strength:Number,
- angle:Number,
- i:int,
- a:Number,
- p:Point;
- angle = Math.random() * Math.PI * 2;
- for (i=0; i<DEFAULT_POINTS.length; i++)
- {
- p = DEFAULT_POINTS[i];
- strength = Math.sqrt(p.x * p.x + p.y * p.y);
- a = Math.atan2(p.y, p.x);
- a += angle;
- points[i] = Point.polar(strength, a);
- }
- strength = Math.random() * 4;
- _vx = strength * Math.cos(angle);
- _vy = strength * Math.sin(angle);
- _tick = 0;
- }
- public function update():void
- {
- var t:Number,
- p:Point,
- strength:Number,
- angle:Number;
- _tick++;
- t = _tick / FRAME_RATE;
- x += WIND * t + _vx;
- y += GRAVITY * t + _vy;
- alpha -= .02;
- for each (p in points)
- {
- strength = Math.sqrt(p.x * p.x + p.y * p.y);
- angle = Math.atan2(p.y, p.x);
- angle += Math.PI * 2 / FRAME_RATE;
- p.x = strength * Math.cos(angle);
- p.y = strength * Math.sin(angle);
- }
- }
- }
notice: 

