In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

物体が螺旋を描いて移動する仕組みの勉強

物体が螺旋を描いて移動する仕組みの勉強

緑色の線が現在の速度、青色の線が現在の加速度です。
いつもよりは簡単な説明になってしまいますが、そんな難しくはないと思うので、
いろいろ数値を試したり計算したりしてみて頑張ってください。

クリックで再発射します。

若干詳しい説明は、
http://wonderfl.net/code/b829ae193bd6d43ab81e104624597449361240f2/
でされています。
Get Adobe Flash player
by Hiiragi 30 Jun 2009
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);
		}
		
	}
	
}