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

再帰関数

再帰関数
何回呼ばれるかを記憶したり、呼ばれた回数によって分岐したりしてる。
再帰の一番最初の初期化ってこれでいいのかな。うまい方法あるのかな。
画面中央より左側をクリックすると、繰り返す数値を -10 します
画面中央より右側をクリックすると、繰り返す数値を +10 します
Get Adobe Flash player
by cpu_t 15 Feb 2010
/**
 * Copyright cpu_t ( http://wonderfl.net/user/cpu_t )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/bSEE
 */

// 再帰関数
// 
// 何回呼ばれるかを記憶したり、呼ばれた回数によって分岐したりしてる。
// 再帰の一番最初の初期化ってこれでいいのかな。うまい方法あるのかな。
// 
// 画面中央より左側をクリックすると、繰り返す数値を -10 します
// 画面中央より右側をクリックすると、繰り返す数値を +10 します
// 
package {
	import flash.display.Graphics;
    import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	[SWF(width = 465, height = 465, backgroundColor = 0xFFFFFF, frameRate = 60)]
    public class FlashTest extends Sprite {
		private var tf:TextField;
		private var g:Graphics;
        public function FlashTest() {
			this.x = this.y = 465 * .5;
            g = this.graphics;
			stage.addChild(tf = new TextField());
			
			tf.text = "100";
			g.lineStyle( -1, 0);
			g.moveTo(0, 0);
			draw(100, 0, 0, 0);
			
			stage.addEventListener(MouseEvent.MOUSE_DOWN, md);
        }
		private var lineNum:int = 100;
		private function md(e:MouseEvent):void
		{
			if (mouseX < 0) lineNum -= 10;
			else lineNum += 10;
			if (lineNum <= 0) lineNum = 10;
			tf.text = lineNum.toString();
			g.clear();
			g.lineStyle( -1, 0);
			g.moveTo(0, 0);
			draw(lineNum, 0, 0, 0);
		}
		private const linelength:Number = 200;
		private var firstn:int = -1;
		private function draw(n:int, px:Number, py:Number, ang:Number):void
		{
			if (n < 0)
			{
				firstn = -1;
				return;
			}
			else if (firstn == -1) firstn = n;
			g.lineTo(px, py);
			draw(
				--n,
				px + Math.cos(ang) * linelength,
				py + Math.sin(ang) * linelength,
				n % 2 == 0 ?
					ang + 180 / firstn * (firstn - n) * Math.PI / 180 :
					ang + (180 - 180 / firstn * (firstn - n)) * Math.PI / 180
			);
		}
    }
}