離した位置に集まる

by hig_an
♥0 | Line 105 | Modified 2011-01-25 19:49:36 | MIT License
play

ActionScript3 source code

/**
 * Copyright hig_an ( http://wonderfl.net/user/hig_an )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/u3km
 */

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.ColorTransform;
	
	public class Main extends Sprite {
		private var circleList:Array;
		private var numOfCircle:Number = 20;
		private var circleSize:Number = 10;
		private var bmpd:BitmapData;
		private var mt:Matrix;
		private var curMousePoint:Point;
		private var sp:Sprite;
		private var colorTf:ColorTransform;
		private var clicked:Boolean;
		private var num:int;
		private var preMousePoint:Point;
		private var scaleRate:Number;
		
		public function Main():void {
			
			circleList = new Array();
			bmpd = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0x0);
			mt = new Matrix();
			curMousePoint = new Point();
			colorTf = new ColorTransform();
			clicked = false;
			num = 0;
			sp = newFig(0, 0, circleSize);
			preMousePoint = new Point();
			reset();
			
			addChild(new Bitmap(bmpd));
			stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
		}
		private function onMouseDown(e:MouseEvent):void {
			addEventListener(Event.ENTER_FRAME, loop);
			clicked = true;
		}
		private function onMouseUp(e:MouseEvent):void {
			preMousePoint.x = mouseX; 
			preMousePoint.y = mouseY;
			if(clicked)stage.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			clicked = false;
		}
		private function loop(e:Event):void {
			bmpd.lock()
			if(clicked){
				bmpd.fillRect(bmpd.rect, 0x0);
				num = ++num % circleList.length;
				circleList[num].x = mouseX;
				circleList[num].y = mouseY;
				for (var i:int = 0; i < circleList.length; i++) {
					mt.identity();
					mt.translate(circleList[i].x, circleList[i].y);
					bmpd.draw(sp, mt);
				}
			}else {
				bmpd.fillRect(bmpd.rect, 0x0);
				for (i = 0; i < circleList.length; i++) {
					circleList[i].x -= (circleList[i].x - preMousePoint.x) * 0.1;
					circleList[i].y -= (circleList[i].y - preMousePoint.y) * 0.1;
					mt.identity();
					scaleRate *= 0.995;
					mt.scale(scaleRate,scaleRate)
					mt.translate(circleList[i].x, circleList[i].y);
					bmpd.draw(sp, mt);
				}
				if (scaleRate<0.01) {
					stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
					reset();
					bmpd.fillRect(bmpd.rect, 0x0);
					removeEventListener(Event.ENTER_FRAME, loop);
				}
			}
			bmpd.unlock()
		}
		private function newFig(xx:Number,yy:Number,size:Number):Sprite {
			var s:Sprite = new Sprite();
			s.graphics.beginFill(0xFF0000);
			s.graphics.drawCircle(xx, yy, size);
			s.graphics.endFill();
			
			return s;
		}
		private function reset():void {
			for (var i:int = 0; i < numOfCircle; i++) {
				circleList[i] = new Circle(100, -100, circleSize);
			}
			scaleRate = 1;
			num = 0;
		}
	}
}
class Circle {
	public var x:Number;
	public var y:Number;
	public var size:Number;
	public function Circle(xx:Number,yy:Number,s:Number):void {
		x = yy;
		y = yy;
		size = s;
	}
}