バネ
コツコツ続けます。本日のお題はバネ。
バネといえば、、ワンピースのちょい役ですぐやられたキャラを思い出します。
名前は忘れました。
えーっと、そんなビヨンビヨンするバネなんですけども、特に思い入れはないですね。
まさかバネを実装することになるとは思いませんでした。
ただ、著者の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王に俺はなる。かも。