Flahsでバネの動きを検証する。
摩擦とバネの力を調整することで動きの表現が変わってくる。
バネの初期座標を調整すると回転させることもできる。
黒い丸はドラッグ可能。
package {
import flash.display.*;
import flash.events.*
public class NMain extends MovieClip {
//-------------------------------------------------------------------------------- Properties
private var _this:*;
private var _stage:Stage;
private var _main:MovieClip;
//-------------------------------------------------------------------------------- Constractor
public function NMain() {
_this = this;
_stage = stage;
_stage.scaleMode = StageScaleMode.NO_SCALE;
_stage.align = StageAlign.TOP_LEFT;
Init();
}
//-------------------------------------------------------------------------------- Function
/**
* initialize
*/
public function Init():void {
_main = new MovieClip();
_this.addChild(_main);
_main.x = Math.round(_stage.stageWidth / 2);
_main.y = Math.round(_stage.stageHeight / 2);
initmarus();
}
/**
* initialize main
*/
private var _m_0:MovieClip;
private var _m_1:MovieClip;
private var _m_2:MovieClip;
private var mousedown:Boolean;
private var mdown_posx:Number;
private var mdown_posy:Number;
private function initmarus():void {
_m_0 = new maru_0();
_m_1 = new maru_1();
_m_2 = new maru_2();
_m_0.buttonMode = true;
_m_1.vx = 0;
_m_1.vy = 0;
_m_2.vx = 0;
_m_2.vy = 0;
_main.addChild(_m_2);
_main.addChild(_m_1);
_main.addChild(_m_0);
startmaruspos();
_main.addEventListener(Event.ENTER_FRAME, marusaction);
_m_0.addEventListener(MouseEvent.MOUSE_DOWN, m_0_mousedown);
_stage.addEventListener(MouseEvent.MOUSE_UP, m_0_mouseup);
}
//
private function m_0_mousedown(eo:* = null):void {
mousedown = true;
mdown_posx = _m_0.mouseX;
mdown_posy = _m_0.mouseY;
}
//
private function m_0_mouseup(eo:* = null):void {
mousedown = false;
}
/** */
private function startmaruspos():void {
_m_0.x = 0;
_m_0.y = 0;
_m_1.x = _m_0.x - 200;
_m_1.y = _m_0.y;
_m_1.vx = 0;
_m_1.vy = 100;
}
/**
* marus action
*/
private var m0_ease:Number = .4;
private var m1_spring:Number = .2;
private var m1_friction:Number = .8;
private var m2_spring:Number = .4;
private var m2_friction:Number = .6;
private function marusaction(eo:* = null):void {
if(mousedown) {
_m_0.x += ((_main.mouseX - mdown_posx) - _m_0.x) * m0_ease;
_m_0.y += ((_main.mouseY - mdown_posy) - _m_0.y) * m0_ease;
}
_m_1.vx += (_m_0.x - _m_1.x) * m1_spring;
if(Math.abs((_m_0.x - _m_1.x)) > 60) _m_1.vx *= m1_friction;
_m_1.x += _m_1.vx;
_m_1.vy +=(_m_0.y - _m_1.y) * m1_spring;
if(Math.abs((_m_0.y - _m_1.y)) > 60) _m_1.vy *= m1_friction;
_m_1.y += _m_1.vy;
_m_2.vx += (_m_1.x - _m_2.x) * m2_spring;
if(Math.abs((_m_1.x - _m_2.x)) > 30)_m_2.vx *= m2_friction;
_m_2.x += _m_2.vx;
_m_2.vy +=(_m_1.y - _m_2.y) * m2_spring;
if(Math.abs((_m_1.y - _m_2.y)) > 30) _m_2.vy *= m2_friction;
_m_2.y += _m_2.vy;
}
}
}