2009年3月10日星期二

flash旋转菜单

工作闲于时间做了个旋转菜单,每个项目都可以添加鼠标消息,现在做的是每个项目在鼠标移上去时加了个发光滤镜,不过还是有点BUG,有关ChildIndex的问题还需要改进,然后某胖子建议我加个减速的物理引擎,说现在看上去太假了,囧。下次再改进改进。。

这里有一个演示版本,在deviantart上,但是图片都是从外部load进去的,所以我就用Sprite代替了。

预览:

主类:CircleBar3.as
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.BlurFilter;
import flash.filters.GlowFilter;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.Loader;
import flash.net.URLRequest;
public class CircleBar3 extends Sprite
{
private var angle:Number=0;
private var centerX:Number=200;
private var centerY:Number=250;
private var menuW:Number=10;
private var menuH:Number=10;
private var radius:Number=200;
private var speed:Number=0.04;
private var menuBar:Array
private var url:Array;
private var urlLoader:Array;
var pointY:Number;
public function CircleBar3()
{
stage.align=StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;
init();
}
private function init():void {
menuBar=new Array();
for(var i:int=1; i<=8; i++){
var rectM:loadPic=new loadPic(i.toString()+".png");
menuBar.push(rectM);
addChild(rectM);
}
trace(menuBar.length);
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onEnterFrame(ent:Event):void {
var pi:Number=Math.PI;
var angle2:Number=pi/4;
var i:int;
for(i=0; i<8;>
var rectM_C:loadPic=menuBar[i];
rectM_C.x = centerX + Math.cos(angle+i*angle2) * radius/3;
rectM_C.y = centerY + Math.sin(angle+i*angle2) * radius;
var angle3:Number=angle+i*angle2;
rectM_C.alpha=(Math.sin(angle3+pi/2)+1)/2+0.2;
rectM_C.scaleX=rectM_C.scaleY=(Math.sin(angle3+pi/2)+1)/5+0.5;
rectM_C.filters=[new BlurFilter((Math.sin(angle3- pi/2)+1)*5,(Math.sin(angle3-pi/2)*20+1),3)];
}
addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandle);
}
private function mouseDownHandle(evt:MouseEvent) {
stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandle);
stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandle);
pointY=mouseY;
}
private function mouseMoveHandle(evt:MouseEvent) {
if(pointY>mouseY) {
angle -= speed;
pointY=mouseY;
}
else{
angle += speed;
pointY=mouseY;
}
}
private function mouseUpHandle(evt:MouseEvent) {
stage.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandle);
}
}
}

加载图片,并添加鼠标消息:loadPic .as
package {
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.filters.GlowFilter;

public class loadPic extends Sprite {
var _sprite:SingleMenu;
var _loader:Loader;
var _string:String;
public function loadPic(_string:String) {
this._string=_string;
init();
}
private function init():void {
_loader=new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadedImage);
_loader.load(new URLRequest(_string));
}
private function loadedImage(evt:Event):void {
var loadedimg:Bitmap=Bitmap(_loader.content);
_sprite=new SingleMenu();
_sprite.addChild(loadedimg);
addChild(_sprite);
_sprite.addEventListener(MouseEvent.MOUSE_OVER,rollover);
}
private function rollover(evt:MouseEvent) {
evt.currentTarget.filters=[new GlowFilter(0xffffff,0.5,20,20,2,1,false,false)];
evt.currentTarget.addEventListener(MouseEvent.MOUSE_OUT,mouseOutHandle);
}
private function mouseOutHandle(evt:MouseEvent) {
evt.currentTarget.filters=[];
}
}
}


图片加载容器:SingleMenu.as
package {
import flash.display.Sprite;
public class SingleMenu extends Sprite {
var smenu_w:Number;
var smenu_h:Number;
var color:uint;
public function SingleMenu(smenu_w:Number=128, smenu_h:Number=128,color:uint=0xffffff) {

this.smenu_w = smenu_w;
this.smenu_h = smenu_h;
this.color = color;
init()
}
private function init():void {
graphics.beginFill(color,0);
graphics.drawRect(5, 5, smenu_w, smenu_h);
graphics.endFill();
}
}
}