forked from: 物理学っぽい動きをする何かシリーズ2
物理学っぽい動きをする何かシリーズ2
物理の何かシリーズ。2D簡易バージョン。バネで物体接続
@author naoto koshikawa
// 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);
}
}