Archive for November, 2008
Motion XML in Flash
Here’s a good read which I’ll post more about in the future:
http://flashthusiast.com/2008/11/04/understanding-flash-cs4-motion-xml/
IK in Flash CS4 Part 2
I thought I’d have some fun and add a few more arms in there. Now it kind of looks like 4 arms passing the box around. Enjoy.
View example
Download .fla and source
package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import flash.geom.Matrix; import fl.ik.*; import gs.*; /** * @author John Lindquist - fp10.org * * note - In your armature layer, remember to set the "type" to "runtime" */ public class Main extends Sprite { private const arms:Vector.<String> = Vector.<String>(["arm", "arm2", "arm3", "arm4"]); private const MAX_X:Number = 550; private const MAX_Y:Number = 400; private var ikMovers:Vector.<IKMover> = new Vector.<IKMover>(); public function Main() { //wait for the IK to be built before doing anything addEventListener(Event.FRAME_CONSTRUCTED, frameConstructedHandler); } private function frameConstructedHandler(event:Event):void { removeEventListener(Event.FRAME_CONSTRUCTED, frameConstructedHandler); setupIK(); setupMotion(); } private function setupIK():void { //dig into the IK structure to get set up a reference to the end position for each(var arm:String in arms) { var tree:IKArmature = IKManager.getArmatureByName(arm); var bone:IKBone = tree.getBoneByName("bone"); var endEffector:IKJoint = bone.tailJoint; var position:Point = endEffector.position; //setup an IKMover for moving the "tail" position var ikMover:IKMover = new IKMover(endEffector, position); ikMovers.push(ikMover); } } private function setupMotion():void { var targetX:Number = Math.random() * MAX_X; var targetY:Number = Math.random() * MAX_Y; TweenMax.to(tracker, 2, {x:targetX, y:targetY, onUpdate:onTweenUpdate, onComplete:setupMotion}); } private function onTweenUpdate():void { var position:Point = new Point(tracker.x, tracker.y); for each(var ikMover:IKMover in ikMovers) { ikMover.moveTo(position); } } } }
Controlling IK with ActionScript
View example
Download .fla and source
package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import flash.geom.Matrix; import fl.ik.*; import gs.*; /** * @author John Lindquist - fp10.org * * note - In your armature layer, remember to set the "type" to "runtime" */ public class Main extends Sprite { private var ikMover:IKMover; private var position:Point; private const MAX_X:Number = 550; private const MAX_Y:Number = 400; public function Main() { //wait for the IK to be built before doing anything addEventListener(Event.FRAME_CONSTRUCTED, frameConstructedHandler); } private function frameConstructedHandler(event:Event):void { removeEventListener(Event.FRAME_CONSTRUCTED, frameConstructedHandler); setupIK(); setupMotion(); } private function setupIK():void { //dig into the IK structure to get set up a reference to the end position var tree:IKArmature = IKManager.getArmatureByName("arm"); var bone:IKBone = tree.getBoneByName("bone"); var endEffector:IKJoint = bone.tailJoint; position = endEffector.position; //setup an IKMover for moving the "tail" position ikMover = new IKMover(endEffector, position); ikMover.limitByDistance=true; ikMover.distanceLimit=0.1; ikMover.limitByIteration=true; ikMover.iterationLimit=10; } private function setupMotion():void { var targetX:Number = Math.random() * MAX_X; var targetY:Number = Math.random() * MAX_Y; TweenMax.to(tracker, 2, {x:targetX, y:targetY, onUpdate:onTweenUpdate, onComplete:setupMotion}); } private function onTweenUpdate():void { position.x = tracker.x; position.y = tracker.y; ikMover.moveTo(position); } } }