// 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 = 5; /** 物体の半径 */ private const PARTICLE_SIZE:uint = 20; /** 物体の質量 */ private const PARTICLE_MASS:uint = 5; /** 重力の設定 大きくすると重力アップ。小さくすると重力ダウン */ private const GRAVITY:Number = 0.9; /** 摩擦係数。摩擦により減っていくスピードの率 */ private const FRICTIION:Number = 0.7; /** ばねの強さ */ private const SPRING:Number = 0.1; /** 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); } } forked from: 物理学っぽい動きをする何かシリーズ2