package { import flash.events.Event; import flash.geom.Matrix3D; import flash.geom.Vector3D; [SWF(width=800, height=600, backgroundColor=0x000000)] /** * Builds on PointAtTest by animating the pointer into orientation as opposed * to immediately update to point directly at the user-controlled ball. */ public class graphic_flex_image_effects_06_Flex_AnimatedPointAtTest extends graphic_flex_image_effects_06_Flex_PointAtTest { private static const INTERPOLATION_RATE:Number = 0.05; private var _matrix:Matrix3D; /** * Constructor. Sets up listener for ENTER_FRAME event as well as * calls super's constructor. */ public function graphic_flex_image_effects_06_Flex_AnimatedPointAtTest() { super(); addEventListener(Event.ENTER_FRAME, onSpriteEnterFrame); } /** * Updates the pointer, rotating it to point at the current ball position. * Instead of super class's implementation, this method uses interpolateTo() * to move pointer toward ball, saving end matrix orientation so that * orientation can be updated over time in an animation. */ override protected function updatePointer():void { var ballPosition:Vector3D = new Vector3D(_ball.x, _ball.y, _ball.z); // get a clone of the current pointer orientation var pointerTransform:Matrix3D = _pointer.transform.matrix3D.clone(); // save the matrix (which will be transformed next) to be used in the animation _matrix = pointerTransform.clone(); // the desired end orientation of the pointer pointerTransform.pointAt( ballPosition, Vector3D.X_AXIS, new Vector3D(0, -1, 0) ); // transform the matrix so that it is slightly oriented towards end matrix _matrix.interpolateTo(pointerTransform, INTERPOLATION_RATE); } /** * Handler for ENTER_FRAME. Performs the orientation animation. * * @param event Event dispatched by this sprite. */ private function onSpriteEnterFrame(event:Event):void { // if the matrix has been created, which means pointer needs to be oriented // towards the ball, assign it to the pointer, then call updatePointer() again // to interpolate the matrix more towards the ball if (_matrix) { _pointer.transform.matrix3D = _matrix; updatePointer(); } } } }