バネチェーン

ボールを複数にしてつなげたやつ。

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;

	public class SpringBallChain extends Sprite {
		private const NUM_BALLS:uint = 3;
		private var balls:Array = new Array();
		private var targetPt:Point;
		private var spring:Number = 0.01;
		private var friction:Number = 0.95;
		private var gravity:Number = 1;
		public function SpringBallChain() {
			init();
		}

		private function init():void {
			targetPt = new Point(stage.stageWidth/2, stage.stageHeight/2);
			for (var i:int = 0; i < NUM_BALLS; i++) {
				var ball:Ball = new Ball(20, 0xFFFFFF);
				ball.x = stage.stageWidth/2;
				ball.y = stage.stageHeight/2;
				balls.push(ball);
				addChild(ball);
			}
			stage.addEventListener(MouseEvent.CLICK, onStageClick);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onStageClick(e:MouseEvent):void {
			targetPt.x = mouseX;
			targetPt.y = mouseY;
		}

		private function onEnterFrame(e:Event):void {
			graphics.clear();
			graphics.lineStyle(1, 0xFFFFFF);
			for (var i:int = 0; i < NUM_BALLS; i++) {
				if (i == 0) {
					ballMove(balls[i], targetPt.x, targetPt.y);
					graphics.moveTo(balls[0].x, balls[0].y);
					graphics.lineTo(balls[1].x, balls[1].y);
				} else {
					ballMove(balls[i], balls[i-1].x, balls[i-1].y, true);
					graphics.moveTo(balls[i-1].x, balls[i-1].y);
					graphics.lineTo(balls[i].x, balls[i].y);
				}
			}
		}

		private function ballMove(ballA:Ball, targetX:Number, targetY:Number, grv:Boolean = false):void {
			var dx:Number = targetX - ballA.x;
			var dy:Number = targetY - ballA.y;
			var ax:Number = dx * spring;
			var ay:Number = dy * spring;
			ballA.vx += ax;
			ballA.vy += ay;
			if (grv) ballA.vy += gravity;
			ballA.vx *= friction;
			ballA.vy *= friction;
			ballA.x += ballA.vx;
			ballA.y += ballA.vy;
		}
	}
}

バネ

最近ご無沙汰だった物理・数学方面の復習のため、
ActionScript3.0 アニメーション
Flash Math & Physics Design:ActionScript 3.0による数学・物理学表現[入門編]
のコード読み解きつつリハビリ感覚でサンプル作っていこうと思います。
今回はバネ。

package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.Event;
	import flash.geom.Point;

	public class SpringBallTest extends Sprite {
		private var ball:Ball;
		private var spring:Number = 0.05;
		private var friction:Number = 0.95;
		private var targetPt:Point;

		public function SpringBallTest() {
			init();
		}

		private function init():void {
			ball = new Ball(40, 0x000000);
			ball.x = stage.stageWidth/2;
			ball.y = stage.stageHeight/2;
			addChild(ball);
			targetPt = new Point(stage.stageWidth/2, stage.stageHeight/2);
			addEventListener(Event.ENTER_FRAME, onBallMove);
			stage.addEventListener(MouseEvent.CLICK, onStageClick);
		}

		private function onStageClick(e:MouseEvent):void {
			targetPt.x = mouseX;
			targetPt.y = mouseY;
		}

		private function onBallMove(e:Event):void {
			var dx:Number = targetPt.x - ball.x;
			var dy:Number = targetPt.y - 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.x += ball.vx;
			ball.y += ball.vy;
		}
	}
}
package {
	import flash.display.Sprite;

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

		public function Ball(radius:Number=20, color:uint=0xFF0000) {
			this.radius = radius;
			this.color = color;
			init();
		}

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

これで終わりにしないですこしずつ弄っていこうかなと。
継続は力なり。

2年後にむけて。

新しい仕事に就いて約1ヶ月。(正確に言うと復職だけど。)
まだまだ勉強中だけど、だいぶ生活も落ち着いてきたのでBlog再開します。
人と接する仕事に戻ってなんだか昔の自分に戻ったような気がする。体重も戻ったし。
この1年でこれから自分がどう生きてけばいいか少しわかりました。
シンプルに。
バランス良く。
まさにこれです。
自分にとってこの2つは本当に重要なことだったようです。
だからどうしたって話ですが、この2つをキーワードに一日一日過ごしていこう
と決意をした今日この頃です。
がんばります。
2年後の11月20日にむけて。