Murayama blog.

プログラミング教育なブログ

複数のバネ


バネの続きです。
さっきのサンプルを改良して、複数のボールをつなぐバネを作ります。


結果はこちら。今日もなかなかキレのある動きをしてくれています。


コードはこちら。
ボールを配列で表現してループしてるだけです。なんで特に解説も不要かと。

package
{

	import flash.display.Sprite;
	import flash.events.Event;

	public class Chain extends Sprite
	{
		// バネ配列
		private var balls:Array;
		private var ballCount:Number = 5;
		// バネの強度、摩擦、重力
		private var spring:Number = 0.1;
		private var friction:Number = 0.8;
		private var gravity:Number = 4;
		
		public function Chain()
		{
			init();			
		}

		private function init():void
		{
			// 複数のボールを生成
			balls = new Array();
			for(var i:uint = 0; i < ballCount; i++){
				var ball:Ball = new Ball(20, 0xFFFFFFF * Math.random());
				addChild(ball);
				balls.push(ball);
			}
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(evt:Event):void
		{
			// 線
			graphics.clear();
			graphics.lineStyle(1);
			graphics.moveTo(mouseX, mouseY);
			move(balls[0], mouseX, mouseY);
			graphics.lineTo(balls[0].x, balls[0].y);
			
			for(var i:uint = 1; i < ballCount; i++)
			{
				move(balls[i], balls[i - 1].x, balls[i - 1].y);
				graphics.lineTo(balls[i].x, balls[i].y);
			} 
		}
		
		private function move(ball:Ball, targetX:Number, targetY:Number):void
		{
			// 距離を算出
			var dx:Number = targetX - ball.x;
			var dy:Number = targetY - ball.y;
			
			// 加速度を算出
			var ax:Number = dx * spring;
			var ay:Number = dy * spring;
			ball.vx += ax;
			ball.vy += ay;
			ball.vx *= friction;
			ball.vy *= friction;
			ball.vy += gravity;
			
			// 移動
			ball.x += ball.vx;
			ball.y += ball.vy;
		}
	}
}


import flash.display.Sprite;

class Ball extends Sprite
{
	private var radious:Number;
	private var color:uint;
	public var vx:Number = 0;
	public var vy:Number = 0;

	public function Ball(radius:Number = 40, color:uint = 0xff0000)
	{
		this.radious = radius;
		this.color = color;
		init();
	}

	private function init():void{
		graphics.beginFill(color);
		graphics.drawCircle(0, 0, radious);
		graphics.endFill();
	}
}


なんとなく、、バネに愛着が湧いてきた。

ような気がする。