// forked from makc3d's Tweener: following a path package { import caurina.transitions.Tweener; import caurina.transitions.properties.CurveModifiers; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.geom.ColorTransform; import flash.text.TextField; public class TweenerPath extends Sprite { // following a path with Tweener // http://makc.coverthesky.com/FlashFX/ffx.php?id=15 private var fwd:Array = []; private var bwd:Array = []; private var mc:Sprite; private var bd:BitmapData; private var ct:ColorTransform; private var line:Sprite; private var last_x:Number; private var last_y:Number; private function lineDrawer (e:*):void { line.graphics.clear (); line.graphics.lineStyle (1, 0xFF0000); line.graphics.moveTo (last_x, last_y); line.graphics.lineTo ( mc.x, mc.y); bd.draw (line); last_x = mc.x; last_y = mc.y; bd.colorTransform (bd.rect, ct); } public function TweenerPath () { // bitmap stuff bd = new BitmapData (465, 465, false, 0xFFFFFF); ct = new ColorTransform (1, 1, 1, 1, 1, 1, 1); addChild (new Bitmap (bd)); line = new Sprite; addEventListener ("enterFrame", lineDrawer); // init Tweener CurveModifiers.init(); // make 20 random checkpoints var i:int; for (i = 0; i < 20; i++) { mc = new Sprite; mc.graphics.beginFill (0xFF00); mc.graphics.drawCircle (0, 0, 3); mc.graphics.endFill (); mc.x = 50 + 350 * Math.random (); mc.y = 50 + 350 * Math.random (); if (i == 0) { last_x = mc.x; last_y = mc.y; } addChild (mc); var t:TextField = new TextField; t.text = (i + 1).toString (); mc.addChild (t); var obj:Object = { x: mc.x, y: mc.y }; fwd.push (obj); bwd.push (obj); } fwd.unshift (fwd [0]); fwd.push (fwd [fwd.length -1]); bwd.unshift (bwd [0]); bwd.push (bwd [bwd.length -1]); bwd.reverse (); // make moving thing mc = new Sprite; mc.graphics.beginFill (0xFF7F00); mc.graphics.drawCircle (0, 0, 3); mc.graphics.endFill (); addChild (mc); goForward (); } private function goForward ():void { mc.x = fwd [0].x; mc.y = fwd [0].y; Tweener.addTween(mc, { x:fwd [fwd.length -1].x, y:fwd [fwd.length -1].y, _bezier:makeBesierArray (fwd), onUpdate: centerAtMC, time:30, onComplete:goBackward, transition:"linear"}); } private function goBackward ():void { mc.x = bwd [0].x; mc.y = bwd [0].y; Tweener.addTween(mc, { x:bwd [bwd.length -1].x, y:bwd [bwd.length -1].y, _bezier:makeBesierArray (bwd), onUpdate: centerAtMC, time:30, onComplete:goForward, transition:"linear"}); } private function centerAtMC ():void { x = 465/2 - mc.x; y = 465/2 - mc.y; } private function makeBesierArray (p:Array):Array { var bezier:Array = []; // convert all points between p[0] and p[last] for (var i:int = 1; i < p.length -2; i++) { var b1:Object = {}, b2:Object = {}; // use p[0] properties to fill bezier array for (var prop:String in p[0]) { b1[prop] = -p[i -1][prop]/6 +p[i][prop] +p[i +1][prop]/6; b2[prop] = +p[i][prop]/6 +p[i +1][prop] -p[i +2][prop]/6; } bezier.push (b1); bezier.push (b2); } return bezier; } } } forked from: Tweener: following a path