一个flash鼠标特效
有点像“水果忍者”划过屏幕时的动画,在每次按住鼠标左键不放然后拖动鼠标并释放,会出现动画。动画我参考别人的代码,然后在显示特效的时候使用了不同的颜色。
代码并不复杂,主要用到了GlowFilter,然后让线条的粗细大小从指定的一个值,慢慢减小..
MouseEffectDemo.as
1: package
2: {
3: import flash.display.Sprite;
4: import flash.events.Event;
5: import flash.events.MouseEvent;
6: import flash.filters.GlowFilter;
7: /**
8: * ...
9: * @author Meteoric_cry
10: */
11: public class MouseEffectDemo extends Sprite
12: {
13: private var _scene:Sprite;
14:
15: private var _startX:int;
16: private var _startY:int;
17:
18: private var _isDown:Boolean;
19:
20: private static const MIN_POINT_DISTANCE:int = 20;
21:
22: public function MouseEffectDemo()
23: {
24: initView();
25: }
26:
27: private function initView():void
28: {
29: _scene = new Sprite();
30:
31: addChild(_scene);
32:
33: _scene.filters = [getGlowFilter(0x00CCFF)];
34:
35: stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
36: stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
37: }
38:
39: private function listenerEnterFrameHandler():void
40: {
41: unlistenerEnterFrameHandler();
42:
43: stage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
44: }
45:
46: private function unlistenerEnterFrameHandler():void
47: {
48: stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
49: }
50:
51: private function onEnterFrameHandler(e:Event):void
52: {
53: //LineArr的长度可能会动态变化,详情参见它的update方法
54: for each (var line:Line in Line.lineArr)
55: {
56: line.update();
57: }
58:
59: update();
60: }
61:
62: private function update():void
63: {
64: if (_isDown == false)
65: {
66: if (Line.lineArr.length === 0)
67: {
68: unlistenerEnterFrameHandler();
69: }
70:
71: return ;
72: }
73:
74: var endX:int = mouseX;
75: var endY:int = mouseY;
76:
77: if (Math.abs(_startX - endX) < MIN_POINT_DISTANCE || Math.abs(_startY - endY) < MIN_POINT_DISTANCE)
78: {
79: return ;
80: }
81:
82: var line:Line = new Line(_startX, _startY, endX, endY);
83:
84: _scene.addChild(line);
85:
86: _startX = endX;
87: _startY = endY;
88: }
89:
90: private function onMouseUpHandler(e:MouseEvent):void
91: {
92: _isDown = false;
93: }
94:
95: private function onMouseDownHandler(e:MouseEvent):void
96: {
97: _isDown = true;
98:
99: changeColorHandler();
100:
101: _startX = mouseX;
102: _startY = mouseY;
103:
104: listenerEnterFrameHandler();
105: }
106:
107: private function getGlowFilter(color:Number):GlowFilter
108: {
109: return new GlowFilter(color, 1, 10, 10, 2, 1, false, false)
110: }
111:
112: private function changeColorHandler():void
113: {
114: var colorArr:Array = [0x00CCFF, 0xF5001D, 0xBC0093, 0x00CE00, 0xFF7400];
115: var color:Number = colorArr[Math.floor(Math.random() * colorArr.length)];
116:
117: _scene.filters = [getGlowFilter(color)];
118: }
119:
120: }
121:
122: }
Line.as
1: package
2: {
3: import flash.display.Sprite;
4:
5: /**
6: * ...
7: * @author Meteoric_cry
8: */
9: public class Line extends Sprite
10: {
11: static public var lineArr:Array = [];
12:
13: public var startX:int;
14: public var startY:int;
15: public var endX:int;
16: public var endY:int;
17: public var lineSize:int;
18:
19: public function Line(x0:int, y0:int, x1:int, y1:int, size:int=8)
20: {
21: lineArr.push(this);
22:
23: startX = x0;
24: startY = y0;
25: endX = x1;
26: endY = y1;
27: lineSize = size;
28:
29: draw();
30: }
31:
32: private function draw():void
33: {
34: graphics.clear();
35: graphics.lineStyle(lineSize, 0xFFFFFF);
36: graphics.moveTo(startX, startY);
37: graphics.lineTo(endX, endY);
38: }
39:
40: public function update():void
41: {
42: draw();
43:
44: lineSize -= 1;
45:
46: if (lineSize < 1)
47: {
48: clear();
49: }
50: }
51:
52: private function clear():void
53: {
54: graphics.clear();
55:
56: for (var i:int = 0, len:int = lineArr.length; i < len; i++)
57: {
58: var line:Line = lineArr[i] as Line;
59:
60: if (line == this)
61: {
62: lineArr.splice(i, 1);
63: parent.removeChild(this);
64:
65: break;
66: }
67: }
68: }
69:
70:
71: }
72:
73: }