package { import flash.display.Sprite; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.filters.BlurFilter; import flash.filters.GlowFilter; import flash.geom.PerspectiveProjection; import flash.geom.Point; import flash.geom.ColorTransform; import flash.ui.Keyboard; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; [SWF(width=800, height=600, backgroundColor=0x000000)] /** * Gives appearance of extruded text by duplicating textfield and placing copies at different, * but close, z depths. Shows how angle and depth of extrusion can be manipulated through user interaction. */ public class graphic_flex_image_effects_06_Flex_ExtrudeText extends Sprite { private static const EXTRUDE_DEPTH:uint = 30; private static const Z_DIST_BETWEEN_ITEMS:uint = 5; /** * Constructor. Creates and places multiple copies of textfield and * sets up listeners for mouse and key events. */ public function graphic_flex_image_effects_06_Flex_ExtrudeText() { // creates fresh projection so that it can be accessed later transform.perspectiveProjection = new PerspectiveProjection(); for (var i:uint = 0; i < EXTRUDE_DEPTH; i++) { createField(i); } stage.addEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove); stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown); } /** * Creates a textfield at the specified index position, which determines its depth. * * @param index The index position of the field. */ private function createField(index:uint):void { var field:TextField = new TextField(); field.selectable = false; field.autoSize = TextFieldAutoSize.LEFT; // be sure to use different font if Impact is not installed field.defaultTextFormat = new TextFormat("Impact", 80, 0x66AAFF); field.text = "EXTRUDE TEST"; // center field field.x = stage.stageWidth/2 - field.width/2; field.y = stage.stageHeight/2 - field.height/2; // depth is based on index position field.z = index*Z_DIST_BETWEEN_ITEMS; // for top field, add slight glow if (index == 0) { field.filters = [new GlowFilter(0xFFFFFF, .5, 6, 6, 2, 1, true)]; // for all others, make a non-blur, which caches field into bitmap; // also, darken the field the further back it is, creating nice gradient extrusion } else { field.filters = [new BlurFilter(0, 0)]; var darken:Number = .1 + (EXTRUDE_DEPTH-index)/EXTRUDE_DEPTH*.8; field.transform.colorTransform = new ColorTransform(darken, darken, darken); } // add bottom of display list, below previous fields addChildAt(field, 0); } /** * Handler for when mouse moves around stage. This updates the center of the projection, * which affects the extrusion angle. * * @param event Event dispatched by stage. */ private function onStageMouseMove(event:MouseEvent):void { var x:Number = stage.mouseX; var y:Number = stage.mouseY; transform.perspectiveProjection.projectionCenter = new Point(x, y); event.updateAfterEvent(); } /** * Handler for when a key is pressed. If the key is the up or down arrow, * The field of view is updated in the projection, which affects the extrusion depth. * * @param event Event dispatched by stage. */ private function onStageKeyDown(event:KeyboardEvent):void { var projection:PerspectiveProjection = transform.perspectiveProjection; var fieldOfView:Number = projection.fieldOfView; switch (event.keyCode) { case Keyboard.UP: fieldOfView += 2; break; case Keyboard.DOWN: fieldOfView -= 2; break; } // keep field of view between .1 and 179.9 to prevent exceptions projection.fieldOfView = Math.max(.1, Math.min(fieldOfView, 179.9)); event.updateAfterEvent(); } } }