Subscribe to RSS Feed ログイン

FLASH備忘6|ActionScriptやらWordPressやらを楽しむ会

Saturday
2010年9月11日

複数のバネの運動 - AS3.0

複数目標のバネの運動です。周りの青いボールに真中の緑のボールがゴムで固定されているように見えます。周りの青いボールだけマウスでドラック&ドロップで動かすことができます。

 

色々実験してみてわかった結果

摩擦係数に関してfriction

  • 1に近い値(0.9だと)ツルツルな動き
  • 0に近い値(0.1だと)べったりとして動き
  • 1を超えるとバネで振れながら大きくなる
  • マイナスになると膨張

スプリングに関してspring

  • 1に近い値(0.9だと)高速に振れるブルブル
  • 0に近い値(0.1だと)のっそりと収束
  • 1を超えるとガチガチ1.6以上は膨張
  • マイナスになると膨張

//ハンドル付きボールのハネ運動スクリプト
var spring:Number = 0.1;
var friction:Number = 0.8;
var numHandles:Number = 3;
//センターボールの作成
var ball:Ball = new Ball(40, 0x006600);
addChild(ball);

//ハンドルの配列制御
var handles = new Array();
for(var i:int=0; i<numHandles; i++){
 var handle:Ball = new Ball(10, 0x0000ff);
 handle.x = Math.random() * stage.stageWidth;
 handle.y = Math.random() * stage.stageHeight;
 addChild(handle);
 handle.addEventListener(MouseEvent.MOUSE_DOWN, onPress);
 handles.push(handle);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
addEventListener(MouseEvent.MOUSE_UP, onRelease);

//フレーム毎の処理
function onEnterFrame(e:Event):void {
 //ボールの生成部分
 for(var i:int = 0; i<numHandles; i++){
  var handle:Ball = handles[i] as Ball;
  
  //ボールの動き
  ball.vx += (handle.x - ball.x) * spring;
  ball.vy += (handle.y - ball.y) * spring;
 }
 ball.vx *= friction;
 ball.vy *= friction;
 ball.x += ball.vx;
 ball.y += ball.vy;
 
 //線の生成
 graphics.clear();
 graphics.lineStyle(1);
 for(i = 0; i<numHandles; i++){
  graphics.moveTo(ball.x, ball.y);
  graphics.lineTo(handles[i].x, handles[i].y);
 }
}

//マウスを押したとき
function onPress(e:MouseEvent):void {
 e.target.startDrag();
}

//マウスを離したとき
function onRelease(e:MouseEvent):void {
 stopDrag();
}

コメント(0)続きを読む

AS3.0バネチェーン複数版FLASH

ばねチェーン複数版FLASH

まずは、ボールが5個のとき、バネを調節した動き

続いて、ボールが20個のとき、スプリング係数と摩擦係数を調節

ボール100個のとき、スプリング係数と摩擦係数を調節。

 

ボール5個のときのスクリプト


//変数定義
var targetX:Number = stage.stageWidth/2;
var targetY:Number = stage.stageHeight/2;
var spring:Number = 0.2;
var friction:Number = 0.6;
var gravity:Number = 1;
var balls:Array = new Array();
var numBalls:int = 5;
//ボールの数だけ作成して、表示。配列にプッシュする。
for (var i:int = 0; i<numBalls; i++){
 var ball:Ball = new Ball(20, 0x0000ff*i/numBalls);
 addChild(ball);
 balls.push(ball);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
//フレーム毎のイベント
function onEnterFrame(e:Event):void {
 graphics.clear();
 graphics.lineStyle(1,0xaaaaaa);
 graphics.moveTo(mouseX, mouseY);
 moveBall(balls[0], mouseX, mouseY);
 graphics.lineTo,(balls[0].x, balls[0].y);
 //ボール数を指定した分だけ繰り返す
 for(var i:int = 1; i<numBalls; i++){
  var ballA:Ball = balls[i-1];
  var ballB:Ball = balls[i];
  moveBall(ballB,ballA.x, ballA.y);
  graphics.lineTo(ballB.x, ballB.y);
 }
}
//複数のボールを別々に計算するための配列
function moveBall(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;
}

ねむすぎて、意識がもうろうとしてる中で作成しました。

コメント(0)続きを読む