package { /** * ... * @author Fintan Boyle * @website www.fboyle.com * * Creates a menu with menuitems that reposition and scale based on mouse movement * * Based on an AS1 Flash file by Ladislav Zigo at http://laco.wz.cz/tween/?page=examples * * Example usage: * * var myMenu:ProximityMenu = new ProximityMenu(); myMenu.addMenuItem("item1",mc1); myMenu.addMenuItem("item2",mc2, 0, 0); myMenu.addMenuItem("item3",mc3, mc3.width/2, mc3.height/2); myMenu.addMenuItem("item4",mc4, mc4.width/2, mc4.height/2); myMenu.spacing = 10; myMenu.getItem("item1").addEventListener(MouseEvent .CLICK , onClick); myMenu.getItem("item2").addEventListener(MouseEvent .CLICK , onClick); myMenu.setMenuCentre(this.stage.stageWidth / 2, 150); addChild (myMenu); * */ import flash.display.MovieClip; import flash.events.*; import DynamicMovie; public class ProximityMenu extends MovieClip { private var centerx:Number = 100; private var centery:Number = 100; private var menuholder:MovieClip; private var menucount:Number = 0; private var menuitems:Array = []; private var miborder:Number = 25; //spacing between menuitems private var startx:Number; private var proximity:Number; //size of radius (in pixels) around registration point private var menuItemOb:Object; private var xmouse:Number; private var ymouse:Number; private var itemReg:DynamicMovie; private var currentItem:DynamicMovie; public function ProximityMenu() { menuholder = new MovieClip(); menuholder.y = centery; menuholder .x = 0; addChild(menuholder ); addEventListener (Event .ENTER_FRAME, onEnterFrame); } //adds an [item] in the form of a MovieClip to the menu. //[id] will be used to reference the menu item when adding eventlisteners // [xreg] and [yreg] can be set if you want to change the registration point of the MovieClip public function addMenuItem(id:String, item:MovieClip, xReg:Number=0 , yReg:Number=0):void { itemReg = new DynamicMovie(); itemReg.setRegistration(xReg, yReg); itemReg.addChild(item); menuholder.addChild(itemReg); menuItemOb = new Object (); menuItemOb.item = itemReg; menuItemOb.id = id; startx = centerx - ((menucount - 1) * miborder) / 2; itemReg.x2 = startx+menucount*miborder; menucount++; menuitems.push(menuItemOb); } private function onEnterFrame(ev:Event):void { proximityCHK(); } private function proximityCHK():Boolean { // Optimisation measure: if mouse doesn't move, return false. if((xmouse == this.mouseX) && (ymouse == this.mouseY) ) { return false; } xmouse = this.mouseX; ymouse = this.mouseY; var thewidth:Number = 0; var xxm:Number; var yym:Number; var xm:Number; var xpos:Number for each(var k:* in menuitems) { currentItem = DynamicMovie(k.item); xxm = currentItem.mouseX2; yym = currentItem.mouseY2; xm = Math.sqrt(xxm*xxm+yym*yym); proximity = (currentItem.width + miborder / 2)/2; if (xm < proximity) { currentItem.scaleX2 = currentItem.scaleY2 += (((150-(xm/100))-(currentItem.scaleX2*100))/3)/100; } else { currentItem.scaleX2 += (((100-(currentItem.scaleY2*100))/3)/100)/1.5; // divide by 1.5 to smooth the easing a little currentItem.scaleY2 = currentItem.scaleX2; } thewidth += currentItem.width; } thewidth += (menucount-1)*miborder; xpos = centerx-thewidth/2; for (var j:Number = 0; j < menucount; j++) { currentItem = DynamicMovie(menuitems[j].item); if (j == 0) { xpos += miborder+currentItem.width/2; currentItem.x2 = xpos; }else { xpos += DynamicMovie(menuitems[j-1].item).width/2+miborder+currentItem.width/2; currentItem.x2 = xpos; } } return true; } public function set spacing(val:Number):void { miborder = val; } public function setMenuCentre(cx:Number, cy:Number):void { centerx = cx; centery = cy; menuholder.y = centery; } public function getItem(id:String):DynamicMovie { for each(var j:* in menuitems) { if (j.id == id) { return DynamicMovie(j.item); } } return null; } } }