package { import flash.display.Sprite; import flash.events.MouseEvent; [SWF(width=550, height=400, backgroundColor=0x111111)] /** * Demonstrates translating display objects in 3D space by creating a number of * of sprites around a central axis but at different x, y and z positions. * Clicking on each sprite translates parent sprite to center clicked sprite on screen. */ public class graphic_flex_image_effects_06_Flex_AxisTranslationTest extends Sprite { private static const NUM_ITEMS:uint = 30; private static const ITEM_RADIUS:uint = 40; private static const Z_DIST_BETWEEN_ITEMS:uint = 150; private static const ITEM_DIST_FROM_CENTER:uint = 300; private static const ANGLE_BETWEEN_ITEMS:Number = 30*(Math.PI/180); private var _menu:Sprite; private var _menuItems:Vector.; /** * Constructor. Creates and positions sprites and sets up listener for stage click events. */ public function graphic_flex_image_effects_06_Flex_AxisTranslationTest() { // will hold all sprites (representing menu items) _menu = new Sprite(); _menuItems = new Vector.(); for (var i:uint = 0; i < NUM_ITEMS; i++) { createMenuItem(i); } addChild(_menu); // centers initial menu item navigateToItem(_menuItems[0]); stage.addEventListener(MouseEvent.CLICK, onStageClick); } /** * Creates a single sprite "menu item" at the specified index, * which determines its position on the stage. * * @param index The index position of the sprite menu item. */ private function createMenuItem(index:uint):void { var menuItem:Sprite = new Sprite(); menuItem.graphics.beginFill(Math.random()*0xFFFFFF); menuItem.graphics.drawCircle(0, 0, ITEM_RADIUS); menuItem.graphics.endFill(); // place at radius around cetral axis with angle determined by index position menuItem.x = Math.cos(ANGLE_BETWEEN_ITEMS*index)*ITEM_DIST_FROM_CENTER; menuItem.y = Math.sin(ANGLE_BETWEEN_ITEMS*index)*ITEM_DIST_FROM_CENTER; // each item is at higher z position menuItem.z = index*Z_DIST_BETWEEN_ITEMS; menuItem.addEventListener(MouseEvent.CLICK, onMenuItemClick); _menuItems.push(menuItem); // placed at bottom of display list to render below previous items _menu.addChildAt(menuItem, 0); } /** * Repositions parent sprite so that specified "menu item" is centered on stage. * * @param menuItem The menu item sprite to navigate to. */ private function navigateToItem(menuItem:Sprite):void { // offset by center stage so that item is centered on x/y _menu.x = stage.stageWidth/2-menuItem.x; _menu.y = stage.stageHeight/2-menuItem.y; _menu.z = -menuItem.z; } /** * Handler for when a menu item is clicked. This navigates to the item. * * @param event Event dispatched by menu item sprite. */ private function onMenuItemClick(event:MouseEvent):void { navigateToItem(event.target as Sprite); // prevent stage click handler from being invoked event.stopPropagation(); } /** * Handler for when the stage is clicked. This navigates to the top level item. * * @param event Event dispatched by stage. */ private function onStageClick(event:MouseEvent):void { navigateToItem(_menuItems[0]); } } }