物体が螺旋を描いて移動する仕組みの勉強
物体が螺旋を描いて移動する仕組みの勉強
緑色の線が現在の速度、青色の線が現在の加速度です。
いつもよりは簡単な説明になってしまいますが、そんな難しくはないと思うので、
いろいろ数値を試したり計算したりしてみて頑張ってください。
クリックで再発射します。
若干詳しい説明は、
http://wonderfl.net/code/b829ae193bd6d43ab81e104624597449361240f2/
でされています。
package
{
import flash.display.GradientType;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
/**
* 物体が螺旋を描いて移動する仕組みの勉強
*
* 緑色の線が現在の速度、青色の線が現在の加速度です。
* いつもよりは簡単な説明になってしまいますが、そんな難しくはないと思うので、
* いろいろ数値を試したり計算したりしてみて頑張ってください。
*
* クリックで再発射します。
*
* 若干詳しい説明は、
* http://wonderfl.net/code/b829ae193bd6d43ab81e104624597449361240f2/
* でされています。
*/
[SWF(width=465,height=465,frameRate=30,backgroundColor=0xFFFFFF)]
public class curveMoveLine extends Sprite
{
//ステージの幅
public static const WIDTH:Number = 465;
public static const HEIGHT:Number = 465;
private var _sp:Sprite = new Sprite();
private var _drawSp:Sprite = new Sprite();
//初期速度
private var _force:Number = 3;
//速度
private var _vx:Number;
private var _vy:Number;
//加速度
private var _ax:Number;
private var _ay:Number;
//初期角度
private var _radian:Number = 1;
public function curveMoveLine()
{
//円を描きます。
var g:Graphics = _sp.graphics;
g.beginFill(0xFF0000);
g.drawCircle(0, 0, 10);
g.endFill();
addChild(_sp);
addChild(_drawSp);
this.addEventListener(Event.ENTER_FRAME , onEnterFrameHandler);
stage.addEventListener(MouseEvent.MOUSE_DOWN , onMouseDownHandler);
init();
}
private function init():void {
//位置情報・速度情報の初期化
_sp.x = WIDTH / 2;
_sp.y = HEIGHT / 2;
_vx = 0;
_vy = 0;
_ax = 0;
_ay = 0;
//初期速度を分解します。
_vx = _force * Math.cos(_radian);
_vy = _force * Math.sin(_radian);
}
private function onMouseDownHandler(e:MouseEvent):void
{
init();
}
private function onEnterFrameHandler(e:Event):void
{
//移動します
_sp.x += _vx;
_sp.y += _vy;
//速度に加速度を足します
_vx += _ax;
_vy += _ay;
//速度の角度を算出します
var vRadian:Number = Math.atan2(_vy, _vx)
//加速度の角度を算出します。(速度に適当な角度を足す。1.396は約80度です。
//速度と加速度がずっと80度の角度を保っているのが判ると思います。)
var aRadian:Number = vRadian + 1.396;
//速度の全体量を計算します(三平方の定理)。
var vForce:Number = Math.sqrt(_vx * _vx + _vy * _vy);
//速度を加速度の角度で分解し、極端に小さくすることで、加速度を算出します。
_ax = vForce * Math.cos(aRadian) * 0.05;
_ay = vForce * Math.sin(aRadian) * 0.05;
//線の描画です。可視化のために数値を適当に増やしてます。
//あんまり気にしないでください。
var g:Graphics = _drawSp.graphics;
g.clear();
g.lineStyle(2, 0x00FF00);
g.moveTo(_sp.x, _sp.y);
g.lineTo(_sp.x + _vx * 10 , _sp.y + _vy * 10);
g.lineStyle(1, 0x0000FF);
g.moveTo(_sp.x, _sp.y);
g.lineTo(_sp.x + _ax * 100 , _sp.y + _ay * 100);
}
}
}