Robot Arm wanson forked:7favorite:15lines:101license : All rights reserved modified : 2009-02-22 01:25:23 Embed Tweet package { import flash.display.*; import flash.events.Event; import flash.geom.Point; [SWF(width="465", height="465", backgroundColor="0xFFFFFF", frameRate="24")] public class Program extends Sprite { private var screen:Sprite; private const NARM:int = 4; private const LENGTH:Number = 60; 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); g.drawCircle(0, 0, 3); g.drawCircle(0, 0, 8); screen.addChild(arms[i]); } effector1 = new Sprite(); effector2 = new Sprite(); g = effector1.graphics; g.lineStyle(1, 0); g.drawRect(-5, -5, 30, 10); g.drawRect(20, -10, 5, 15); g.drawCircle(0, 0, 8); g = effector2.graphics; g.lineStyle(1, 0); g.drawRect(-5, -5, 30, 10); g.drawRect(20, -5, 5, 15); g.drawCircle(0, 0, 3); screen.addChild(effector1); screen.addChild(effector2); 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(465/2.0, 465/2.0), new Point(screen.mouseX, screen.mouseY)); x = y = 465/2.0; for (i = 0; i < NARM; i++) { arms[i].x = x; arms[i].y = y; arms[i].rotation = angles[i] / Math.PI * 180; x += LENGTH * Math.cos(angles[i]); y += LENGTH * Math.sin(angles[i]); } var dx:Number = e.x - screen.mouseX; var dy:Number = e.y - screen.mouseY; if (dx * dx + dy * dy < 50) ph += 0.1; var angle_e:Number = arms[NARM - 1].rotation; var angle_ed:Number = 25 + 30 * Math.pow(Math.sin(ph), 2); effector1.x = effector2.x = e.x - Math.cos(angles[NARM - 1]) * 25; effector1.y = effector2.y = e.y - Math.sin(angles[NARM - 1]) * 25; effector1.rotation = angle_e + angle_ed; effector2.rotation = angle_e - angle_ed; } 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 greentec kuroarizuka ongaeshi yuka_y fallen Kallethyseli.. nijitaro ish_xxxx ai_book : animationarmcoolrobot h1ro : robot assen_nissen.. : :) blackwater : 机械臂 Akineton : armrobot ekis : robot nabe : IKのマジックハンド animation arm cool robot drawRect drawCircle mouseY mouseX Math.atan2 Math.PI drawRoundRect Math.cos rotation Point graphics Math.pow draw addEventListener lineStyle addChild Math.sin Array Event.ENTER_FRAME uint sort new page view favorite forked pv165 forked from: Robot Arm comorimorito forked:0 favorite:0lines:101 (diff:1) pv275 forked from: Robot Arm bulge forked:0 favorite:1lines:101 (diff:5) pv427 forked from: Robot Arm nyonyonyo forked:1 favorite:1lines:101 (diff:5) tag: game pv505 forked from: Robot Arm marc_tyakey forked:1 favorite:0lines:101 (diff:1) pv362 forked from: Robot Arm hacker_nmyze_52 forked:0 favorite:1lines:101 (diff:2) pv583 forked from: Robot Arm taka_milk forked:4 favorite:1lines:101 (diff:5) pv850 forked from: Robot Arm hacker_3szp8277 forked:1 favorite:2lines:153 (diff:172)