Forked from: func09's Particles diff:3 forked from: Particles Processingライクに描画するメインクラス kamip forked:0favorite:4lines:132license : All rights reserved modified : 2009-10-21 01:16:02 Embed Tweet // forked from func09's Particles package { import flash.display.*; import flash.events.*; import flash.geom.*; import flash.utils.*; /** * Processingライクに描画するメインクラス */ public class Particles extends Sprite { var canvas:BitmapData; var particleClasses:Array = [Particle,Particle2]; var particleClass:Class; var particles:Array; const numParticles:uint = 10; /** * コンストラクタ */ public function Particles() { setUp(); } /** * 初期化 */ public function setUp():void { canvas = new BitmapData( stage.stageWidth, stage.stageHeight, true, 0xFFFFFFFF ); addChild( new Bitmap( canvas ) ); particles = new Array(); for( var i:int=0; i<numParticles; i++ ){ particleClass = particleClasses[ i % 2 ]; var _:Particle = new particleClass( stage ) as Particle; _.p.x = Math.random() * stage.stageWidth; _.p.y = Math.random() * stage.stageHeight; _.v.x = Math.random() * 2 - 1; _.v.y = Math.random() * 2 - 1; particles.push(_); } addEventListener( Event.ENTER_FRAME, draw ); stage.addEventListener( MouseEvent.MOUSE_DOWN, mouseHandle ); stage.addEventListener( MouseEvent.MOUSE_UP, mouseHandle ); } /** * 描画処理 * @param event */ public function draw( event:Event ):void { canvas.draw( canvas, null, new ColorTransform( 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0.2 ),null,null,false); particles.forEach( function( particle:Particle, index:int, array:Array ){ particle.move(); particle.render( canvas ); } ); } /** * マウスイベントハンドル * @param event */ public function mouseHandle( event:MouseEvent ):void { switch( event.type ){ case MouseEvent.MOUSE_DOWN: particles.forEach( function( particle:*, index:int, array:Array ){ particle.isPressed = true; } ); break; case MouseEvent.MOUSE_UP: particles.forEach( function( particle:*, index:int, array:Array ){ particle.isPressed = false; } ); break; } } } } import flash.display.*; import flash.geom.*; /** * 粒子の実装定義インターフェイス */ interface IParticle { function move():void; function render( canvas:BitmapData ):void; } /** * 粒子クラス */ class Particle implements IParticle { var subject:DisplayObject; var stage:Stage; var isPressed:Boolean; /** * 座標 */ var p:Point = new Point(); /** * 移動ベクトル */ var v:Point = new Point(); /** * 色 */ var col:ColorTransform; /** * 拡大率 */ var scale:Number = 1; /** * 回転角(ラジアン) */ var rotation:Number = 0; /** * コンストラクタ * @param _stage */ public function Particle( _stage:Stage ) { if( !subject ) subject = getSubject(); stage = _stage; col = new ColorTransform( 0, 0, 0, 0, Math.random() * 0xFF, 0x00, 0x64, Math.random() * 0x66 ); } /** * 移動処理 */ public function move():void { v.x += Math.random() * 2 - 1; v.y += Math.random() * 2 - 1; v.x *= 0.99; v.y *= 0.99; if( isPressed ){ var t:Point = new Point( stage.mouseX, stage.mouseY ); t = t.subtract(p); t.normalize(v.length); v = t; } p = p.add(v); rotation = Math.atan2( v.y, v.x ); modifyPositoin(); var distance:Number = Point.distance( new Point( stage.mouseX, stage.mouseY ), p ); var maxDistance:Number = Point.distance( new Point(), new Point( stage.stageWidth, stage.stageHeight ) ); scale = 10 * distance / maxDistance + .1; } /** * 描画処理 * @param canvas */ public function render( canvas:BitmapData ):void{ var matrix:Matrix = new Matrix(); matrix.rotate( rotation ); matrix.scale( scale, scale ); matrix.translate( p.x, p.y ); canvas.draw( subject, matrix, col); }; /** * 画面をはみ出た場合の処理 */ private function modifyPositoin():void { // 画面をはみ出たら跳ね返る処理 p.x = ( p.x < 0 ) ? 0 : ( p.x > stage.stageWidth ) ? stage.stageWidth : p.x; p.y = ( p.y < 0 ) ? 0 : ( p.y > stage.stageHeight ) ? stage.stageHeight : p.y; v.x *= ( p.x == 0 || p.x == stage.stageWidth ) ? -1 : 1; v.y *= ( p.y == 0 || p.y == stage.stageHeight ) ? -1 : 1; } /** * 描画する主題を生成 * @return */ protected function getSubject():DisplayObject { var sp:Shape = new Shape(); sp.graphics.beginFill( 0xFFFFFF ); sp.graphics.drawRect( -1, 0, 3, 1 ); sp.graphics.drawRect( 0, -1, 1, 3 ); sp.graphics.drawRect( 0, 0, 1, 1 ); return sp as DisplayObject; } } /** * 粒子クラス2 */ class Particle2 extends Particle { /** * コンストラクタ * @param _stage */ public function Particle2( _stage:Stage ){ super( _stage ); } /** * 描画する主題を生成 * @return */ override protected function getSubject():DisplayObject { var sp:Shape = new Shape(); sp.graphics.beginFill( 0xFFFFFF ); sp.graphics.drawCircle(0,0,1.5); return sp as DisplayObject; } } Code Fullscreen Preview Fullscreen zmaxlin heckmeck DOS mooco : bitmapeffectfilterparticles bitmap effect filter particles forEach rotation stage index scale mouseY mouseX drawRect Shape Point.distance stageWidth Point stageHeight matrix MouseEvent.MOUSE_UP MouseEvent.MOUSE_DOWN ColorTransform subtract addEventListener type