Forked from: taka_milk's forked from: Robot Arm diff:33 forked from: forked from: Robot Arm klszsd forked:0favorite:0lines:72license : All rights reserved modified : 2010-10-15 04:37:12 Embed Tweet // forked from taka_milk's forked from: Robot Arm // forked from Wanson's Robot Arm package { import flash.display.*; import flash.events.Event; import flash.geom.Point; [SWF(width="500", height="500", backgroundColor="0xFFFFFF", frameRate="24")] public class Program extends Sprite { private var screen:Sprite; private const NARM:int = 4; private const LENGTH:Number = 58; private var angles:Array; private var arms:Array; private var effector1:Sprite; private var effector2:Sprite; public function Program() { this.screen = this; var i:int; var g:Graphics; angles = new Array(); arms = new Array(); for (i = 0; i < NARM; i++) { angles[i] = 0.0; arms[i] = new Sprite(); g = arms[i].graphics; g.lineStyle(1, 0); g.drawRoundRect(-8, -8, LENGTH + 16, 16, 16); screen.addChild(arms[i]); } addEventListener(Event.ENTER_FRAME, onEnterFrame); } public function onEnterFrame(ev:Event):void { draw(); } private var ph:Number = 0; public function draw():void { var i:int; var x:Number; var y:Number; var e:Point; for (i = 0; i < 10; i++) e = pursuit(0, new Point(250, 250), new Point(screen.mouseX, screen.mouseY)); x = y = 250; for (i = 0; i < 1; i++) { arms[i].x = x; arms[i].y = y; } } private function pursuit(bi:uint, o:Point, p:Point):Point { var e:Point; if (bi < NARM - 1) { const o2:Point = new Point( o.x + Math.cos(angles[bi]) * LENGTH, o.y + Math.sin(angles[bi]) * LENGTH); e = pursuit(bi + 1, o2, p); } else { e = new Point( o.x + Math.cos(angles[bi]) * (LENGTH + 20), o.y + Math.sin(angles[bi]) * (LENGTH + 20)); } if ((e.y == o.y && e.x == o.x) || (p.y == o.y && p.x == o.x)) return e; const anglee:Number = Math.atan2(e.y - o.y, e.x - o.x); const anglep:Number = Math.atan2(p.y - o.y, p.x - o.x); var angle_d:Number = (anglep - anglee); if (angle_d > Math.PI) angle_d = angle_d - 2 * Math.PI; else if (angle_d < -Math.PI) angle_d = angle_d + 2 * Math.PI; if (angle_d > 0.025) angle_d = 0.025; else if (angle_d < -0.025) angle_d = -0.025; angles[bi] += angle_d; return e; } } } Code Fullscreen Preview Fullscreen Point Math.atan2 drawRoundRect draw mouseY mouseX graphics Math.PI addEventListener Math.cos lineStyle Math.sin addChild Event.ENTER_FRAME Event Array uint Sprite int Number