複数のバネ
バネの続きです。
さっきのサンプルを改良して、複数のボールをつなぐバネを作ります。
結果はこちら。今日もなかなかキレのある動きをしてくれています。
コードはこちら。
ボールを配列で表現してループしてるだけです。なんで特に解説も不要かと。
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(); } }
なんとなく、、バネに愛着が湧いてきた。
ような気がする。