In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: 物理学っぽい動きをする何かシリーズ2

物理学っぽい動きをする何かシリーズ2
物理の何かシリーズ。2D簡易バージョン。バネで物体接続

@author naoto koshikawa
Get Adobe Flash player
by Libr8d 14 Jun 2009
    Embed
// forked from naoto5959's 物理学っぽい動きをする何かシリーズ2
package
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.geom.Point;
	
	[SWF(width = "465", height = "465", backgroundColor = "0xFFFFFF", frameRate = "30")]
	/**
	 * 物理学っぽい動きをする何かシリーズ2
	 * 物理の何かシリーズ。2D簡易バージョン。バネで物体接続
	 * 
	 * @author naoto koshikawa
	 */
	public class PhysicalSomething2 extends MovieClip
	{
		// _____________________________________________________ Property
		/** 物体の数 */
		private const PARTICLE_COUNT:uint = 50;
		
		/** 物体の半径 */
		private const PARTICLE_SIZE:uint = 10;
		
		/** 物体の質量 */
		private const PARTICLE_MASS:uint =25;
		
		/** 重力の設定 大きくすると重力アップ。小さくすると重力ダウン */
		private const GRAVITY:Number = 0.9;
		
		/** 摩擦係数。摩擦により減っていくスピードの率 */
		private const FRICTIION:Number = 0.6;
		
		/** ばねの強さ */
		private const SPRING:Number = 0.5555;
		
		/** particle list */
		private var _particles:Array;
		
		// _____________________________________________________ Method
		/**
		 * constructor
		 */
		public function PhysicalSomething2() 
		{
			// create particles
			_particles = [];
			var initX:Number = mouseX;//; Math.random() * (stage.stageWidth -PARTICLE_SIZE) + PARTICLE_SIZE / 2;
			var initY:Number = mouseY;//;Math.random() * (stage.stageHeight - PARTICLE_SIZE) + PARTICLE_SIZE/2;
			for (var i:uint = 0; i < PARTICLE_COUNT; i++)
			{
				_particles.push(new Particle(PARTICLE_SIZE));
				_particles[i].alpha = 0.7;
				_particles[i].x = initX;
				_particles[i].y = initY;
				addChild(_particles[i]);
			}
			
			addEventListener(Event.ENTER_FRAME, enterFrameListener);
		}
		
		/**
		 * move to
		 * @param	particle
		 * @param	targetX
		 * @param	targetY
		 */
		private function move(particle:Particle, targetX:Number, targetY:Number):void
		{
			// 加速度にスプリング係数を掛けて、速度へ加算する
			particle.vx += (targetX - particle.x) * SPRING;
			particle.vy += (targetY - particle.y) * SPRING;
			
			// 重力加速度を加算
			particle.vy += GRAVITY * particle.mass;

			// 速度に摩擦係数をかける
			particle.vx *= FRICTIION;
			particle.vy *= FRICTIION;
			
			// 位置に加算
			particle.x += particle.vx;
			particle.y += particle.vy;
		}
		
		
		// _____________________________________________________ Listener
		/**
		 * Event.ENTER_FRAME event
		 */
		private function enterFrameListener(event:Event):void
		{
			graphics.clear();
			graphics.lineStyle(1);
			// マウスの位置へ移動
			graphics.moveTo(mouseX, mouseY);
			// マウスの位置から最初の物体の位置へ線を引く
			graphics.lineTo(_particles[0].x, _particles[0].y);
			move(_particles[0], mouseX, mouseY);
			
			for (var i:uint = 1; i < _particles.length; i++)
			{
				// 次の物体の位置へ線を引く
				graphics.lineTo(_particles[i].x, _particles[i].y);
				move(_particles[i], _particles[i - 1].x, _particles[i - 1].y);
			}
		}
	}
}
import flash.display.Graphics;
import flash.display.MovieClip;

class Particle extends MovieClip {
	// _____________________________________________________ Property
	public var vx:Number = 0;
	public var vy:Number = 0;
	public var mass:Number = 5;
	// _____________________________________________________ Method
	/**
	 * constructor
	 */
	public function Particle(size:Number=20, mass:Number=5):void
	{
		var gr:Graphics = graphics;
		gr.beginFill(0xEEEEEE * Math.random() + 0x111111, 0.9);
		gr.drawCircle(0, 0, size);
	}
}