Murayama blog.

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

バネ


コツコツ続けます。本日のお題はバネ。
バネといえば、、ワンピースのちょい役ですぐやられたキャラを思い出します。
名前は忘れました。


えーっと、そんなビヨンビヨンするバネなんですけども、特に思い入れはないですね。
まさかバネを実装することになるとは思いませんでした。
ただ、著者のKeith Peters氏は、バネへの思い入れが深いようで、本を読んでいてもバネを愛しているのが感じられます。



バネ、リスペクト。



さてバネのサンプルです。こんなんでどうでしょう。


コードの重要な部分は、

		private function onEnterFrame(evt:Event):void
		{
			// マウスとボールの距離を算出
			var dx:Number = mouseX - ball.x;
			var dy:Number = mouseY - ball.y;
			
			// 距離にバネ係数を掛けて加速度を算出
			var ax:Number = dx * spring;
			var ay:Number = dy * spring;
			vx += ax;
			vy += ay;
			vy += gravity;
			vx *= friction;
			vy *= friction;

			// 移動			
			ball.x += vx;
			ball.y += vy;

の部分で、マウスの位置とボールの距離から加速度を算出してるところです。
簡単に言うと、マウスとボールが離れるほど、加速度が増すわけで、
マウスとボールが近づくにつれて、ブレーキがかかることになります。


コードはこちら。

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class Spring5 extends Sprite
	{
		private var ball:Ball;
		private var spring:Number = 0.1;
		private var vx:Number = 0;
		private var vy:Number = 0;
		private var friction:Number = 0.95;
		private var gravity:Number = 5;
		
		
		public function Spring5()
		{
			init();
		}
		
		private function init():void{
			ball = new Ball(20);
			addChild(ball);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(evt:Event):void
		{
			// マウスとボールの距離を算出
			var dx:Number = mouseX - ball.x;
			var dy:Number = mouseY - ball.y;
			
			// 距離にバネ係数を掛けて加速度を算出
			var ax:Number = dx * spring;
			var ay:Number = dy * spring;
			vx += ax;
			vy += ay;
			vy += gravity;
			vx *= friction;
			vy *= friction;

			// 移動			
			ball.x += vx;
			ball.y += vy;
			
			// バネ(線)の描画
			graphics.clear();
			graphics.lineStyle(1);
			graphics.moveTo(ball.x, ball.y);
			graphics.lineTo(mouseX, mouseY);
		}
	}
}

import flash.display.Sprite;

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

	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();
	}
}


バネの話はもう少し続く。


AS王に俺はなる。かも。